🔨 C/C++ 要点
面向对象
- 面向对象的特征:抽象、继承、封装、多态。
- 权限:
public
、private
、protected
基类成员 | public 派生 | private 派生 | protected 派生 |
---|---|---|---|
private | 不可访问 | 不可访问 | 不可访问 |
public | public | private | protected |
protected | protected | private | protected |
-
多态性
多态性分为:静态多态性和动态多态性。静态多态性又称编译时多态性,通过函数的重载实现。动态多态性又称运行时多态性,通过虚函数实现。
虚函数, 纯虚函数, 抽象类
虚函数 虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。当一个成员函数声明为虚函数后,其派生类中的同名函数自动成为虚函数。
virtual float area();
纯虚函数 纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该函数在派生类中仍然为虚函数。
virtual float area() = 0;
虚函数和纯虚函数
- 虚函数可以为定义了的,也可以没有定义。
- 纯虚函数则是未被定义的,需要在派生类中定义。
纯虚函数和抽象类 不用来定义对象而只作为一种基本类型用作继承的类,称为抽象类。凡是包含纯虚函数的类都是抽象类。由于纯虚函数不能被调用,抽象类是不能被实例化的。
指针
void(*signal(int sig,void(*func)(int)))(int);
从
signal
所在的括号开始提取:void(*signal( ) )(int);
首先signal
后缀跟的是括号,我们得到signal
是一个函数, 然后得到前缀为*
表示此函数返回的是一个“……指针”…………最后得到signal
是一个函数,返回函数指针,函数所指向的指针接受一个int
类型的参数并且返回void
。然后我们看
signal
函数参数本身:void(*func)(int)
表示func
是一个函数指针,此指针指向的函数接收一个int
参数,返回值是void
。
其他
-
运算符重载
// private: double real; double imag; // 声明重载运算符+ Complex operator+(Complex &c2); // 定义重载运算符 Complex Complex::operator+(Complex &c2){ Complex c; c.real = real + c2.real; c.imag = imag + c2.imag; return c; }
- 构造函数、析构函数、拷贝函数
- 变量存储
- 局部变量:栈区
- 局部静态变量:静态区
- 全局变量:静态区的常量区
- 全局静态变量:静态区
-
重载(overload)和重写(overried)
重写一般是用于子类在继承父类时,重写(重新实现)父类中的方法。重写方法与被重写方法需要与被重写方法保持一致:参数列表、返回值、异常。重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
重载一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样)
- ifndef/define/endif 的作用:防止头文件被重复引用
函数实现
strcpy
:字符串拷贝
char *strcpy(char *destStr, char *srcStr){
assert( destStr != NULL ); // 为空就终止执行
assert( srcStr != NULL );
char *dest = destStr;
while ( *srcStr != '\0' ){
*destStr++ = *srcStr++; // 先赋值, 地址再自增1
}
return dest;
}
strcmp
:比较字符串
int strcmp(const char *str1, const char *str2){
while(str1!=NULL && str2!=NULL){
while(*str1++ == *str2++){
// str1==str2
if(*str1=='\0' && *str2=='\0') return 0;
// str1<str2
if( *str1=='\0' ) return -1;
// str1>str2
if( *str2=='\0' ) return 1;
}
}
return -2; // 有指针为空的情况
}
reference: strcpy函数的实现, cnblogs,AllenNewOk, strcmp函数的两种实现, iteye
排序
冒泡
void bubble_sort(int[] a, int n){
int temp, i, j;
for (i = 0; i < n; i++)
for (j = i; j < n; j++)
if (a[i] > a[j]){
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}