1、类
类是c代码中必不可少的一部分。大型项目中,cpp文件都有对应的头文件。在头文件中声明及部分定义类,方便类之间的继承、调用等。
声明类的时候,需要注意的有,public,private,成员函数声明(需要函数类型,参数,后面加分号,不需要实现的大括号),inline关键字修饰的函数(类在调用该函数的时候,是嵌入,在类内没有声明为inline,在定义的时候添加了Inline,则也是嵌入使用)。
在定义或使用类的成员函数的时候,需要添加::,如A::write()。
2、继承(多态)
继承是为了增加代码的复用,同时可以增添新的功能。
形式如:
class a:public A {}
条件:
1、包含(include)A声明所在的头文件
调用:
1、当父类被继承,子类重新声明定义函数名相同,参数类型相同的成员函数时,当通过父类调用该函数名的函数,实际调用的是哪一个呢?
根据有无虚函数(virtual 修饰)来判断,具体参考: https://blog.csdn.net/u012273328/article/details/51173111
3、重载
重载是在相同作用域内,可以声明几个函数名相同,但是参数不同的函数,编译器通过将参数比较,选出最合适的函数。
4、修饰符(const,friend,inline)
const:
类:const 修饰的数据成员,不可修改,初始化位置只能在参数列表里。
const 修饰的成员函数,在函数参数之前时,只能访问同被修饰的类函数。
const 修饰类对象,是从对象的层面,不修改数据 只能调用const成员函数 (const 修饰函数,是从函数的层面,不修改数据)
参考博客:https://blog.csdn.net/fengyunzhenyu/article/details/79695516
friend:
友元分为友元函数和友元类,是为了方便访问。
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend;
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类,即在另一个类中friend该类。
inline:
被修饰的函数本身短小,没有for,while等循环语句,且被频繁调用。编译器选择决定函数会不会被内联(替换,而不是调用地址接口)
5、指针
指针是有类型、有地址的变量,地址里存的是要指向的地址。
1、类 数据成员 函数成员
成员类型 类名::*指针名 = &类名::成员名
函数返回类型 (类名::*函数指针名)(参数列表) = &类名::成员函数名
2、对象
.* ->*
对象.*数据成员指针
对象指针->*数据成员指针
当需要在函数里改变多个参数,并用于后续使用时,可以在传进该函数前将这几个参数定义好,然后以传地址的形式传进来,对于该函数本身,定义时参数是取地址的形式,就相当于是预定义好的变量(地址相同,数据类型相同),函数执行完毕,变量修改保存完毕。
6、内联与宏
都是替换,但是宏(#define)没有类型检查,内联函数有.
宏不建议轻易使用,从项目安全等角度考虑。
7、结构体
结构体内的变量可以类型不同;
定义在头文件中,可以方便多个cpp文件使用。
8、全局与局域变量
static、extern、auto
extern 可以用来实现变量的全局性,当变量已经被定义过,在其他文件再使用时,可以使用extern 声明,extern 类型 变量;
static 在类内部的表现,用来实现族类对象建的数据共享。在生成对象的时候,普通数据成员才有空间,而static成员在类声明的时候,就已经开辟了空间。
static 数据成员,既属于类,也属于对象,但终归属于类
static 作用域仅限于本文件
9、初始化与赋值
初始化与赋值不是相等的。
初始化的时候如果没有给赋值,之后赋值的时候需要对其包含的子对象逐个进行赋值。