1、this指针
this指针作用:指向成员函数指向的对象。
非静态成员函数中可以直接使用this指针代表指向该该函数作用的对象的指针。
静态成员函数中不能使用this指针,因为静态成员函数并不具体作用与某个对象,而this指针指向成员函数所作用的那个对象。因此,静态成员函数的真实的参数的个数,就是程序中写出的参数的个数。
2、静态成员(加static关键字的成员)
静态成员变量被所有对象共享。
sizeof运算符不会计算静态成员变量。
普通成员函数必须具体作用于某个对象,而静态成员函数并不具体作用于某个对象。
静态成员不需要通过对象就能访问。
如何访问静态成员?
1)类名::成员名
2)对象名.成员名
3)指针->成员名
4)引用.成员名
静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在。
静态成员函数本质是全局函数。
设置静态成员的目的是将某些和类紧密相关的全局变量和函数写到类里面,看上去像个整体,易于维护和理解。
必须在定义类的文件中对静态成员变量进行一次声明或初始化,否则,编译能通过,链接不能通过。
在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数。
3、拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的一个参数必须是本类型的一个引用变量。
当没有定义复制构造函数,使用Rect类时,会调用默认复制构造函数产生临时的隐藏的Rect对象:
1)Rect类对象作为函数的参数
2)Rect类对象作为函数的返回值
3)对象需要另一个对象进行初始化
临时对象在消亡时会调用析构函数。
4、有成员对象的类叫封闭类
封闭类对象里面包含成员对象,封闭类对象生成时,所包含的成员对象也会生成,引发成员对象的构造函数的调用。如果成员对象的构造函数时需要有参数的,而你没给出任何参数的信息,编译器就不明白成员对象以什么方式进行初始化,编译器就会出错。如果成员对象的构造函数调用的是默认构造函数,可以不给该对象成员初始化。
任何生成封闭类对象的语句,都要让编译器明白,对象中的成员对象,是如何初始化的。
可以通过封闭类的构造函数的初始化列表进行初始化。
@封闭类对象生成时,先执行所有对象成员的构造函数,然后执行封闭类的构造函数。(次序不能颠倒,因为封闭类的构造函数有可能会用到对象成员,如果对象成员没有初始化好,使用就会出错)
@对象成员的构造函数调用顺序和对象成员在类中的说明次序一致,与它们在成员初始化列表中出现的次序无关。(有的对象成员不需要初始化,也就不在初始化列表中)
4、
@常量成员函数执行期间不应该修改其所作用的对象,因此,常量成员函数不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外),因非常量成员函数在执行过程中有可能修改其作用的对象的值。
常量对象不可修改(即常量对象的成员变量的值不可改)
常量对象上不能执行非常量成员函数。
常量对象上可以执行常量成员函数
常量成员函数的重载:两个成员函数,名字和参数一样,但是一个是const,一个不是,算是重载。
@用对象的常引用作为参数,const Sample & a 这样可以确保不会更改a的值。
5、可以将一个类的成员函数(包括构造、析构函数)说明为另一个类的友元。
如果A是B的友元类,那么A的成员函数可以访问B的私有成员。
友元类之间的关系不能传递,也不能继承。