一、构造函数
1.C++的对象模型和C的结构体模型没有任何区别,包括成员的布局以及对齐补齐的规则。
2.对象中只有成员变量,没有成员函数。类的成员变量在该类的每个对象中都有一份独立的拷贝,但是类的成员函数只有一份,且为该类的所有对象共享。
3.为了在一个函数中区分不同的调用对象,编译器会为每个成员函数提供一个隐藏的指针参数——this指针,指向调用该成员函数的对象。在成员函数中对所有成员变量的访问以及对其他成员函数的调用,实际上都是通过this指针完成的。
4.类的构造函数中同样具有this指针参数,指向这个正在被构造的对象。
5.显示使用this指针的场合
(1)解决成员变量的名字冲突
(2)从成员函数中返回调用对象的自引用
(3)通过成员函数实现对象间的交互
(4)在成员函数中销毁调用对象自身
二、常函数
1.在类成员函数的参数表之后,函数体的左花括号之前,加上const关键字,该成员函数的this指针具有常属性,这样的成员函数称为常函数。
2.在常函数内部,因为this指针被声明常量指针(即目标只读的指针),因此无法修改成员变量的值,除非该成员变量被mutable关键字修饰。
3.常对象只能调用常函数,非常对象既可以调用非常函数也可以调用常函数。原型相同常函数和非常函数可以构成重载关系。
三、析构函数
1.析构函数是类的特殊的成员函数
(1)析构函数的函数名就是在类名前面加“~”
(2)析构函数没有返回类型
(3)析构函数没有参数
(4)析构函数不能重载
2.析构函数在对象被销毁时自动调用
(1)局部对象的析构函数由其所在最小作用域的右花括号调用
(2)堆对象的析构函数被delete运算符调用
(3)全局对象的析构函数被进程加载器调用
3.缺省析构函数
如果一个类没有定义析构函数,编译器会提供一个缺省析构函数。该函数对于基本类型的成员变量,什么也不做;而对于类类型的成员变量,则会调用其相应类型的析构函数。
四、拷贝构造和拷贝赋值
1.缺省的拷贝构造和拷贝赋值,对包括指针在内的基本类型成员变量按字节复制,导致浅拷贝问题。
2.为了获得完整意义上的对象副本,必须自己定义拷贝构造函数和拷贝赋值运算符函数,针对指针型的成员变量做深拷贝。
3.拷贝赋值运算符函数的实现
(1)避免自赋值
(2)分配新资源
(3)释放旧资源
(4)拷贝新内容
(5)返回自引用