-
拷贝构造函数:
- 浅拷贝,位拷贝:
假如,girlfriend是一个指针,浅拷贝会直接把指针的地址拷贝过去,后面李四的girlfriend会跟着张山的改变 - 自定义拷贝构造函数,要给指针分配新的地址,
- 浅拷贝,位拷贝:
- 类文件的分离
- 实际开发中,类的定义保存在头文件中,比如Human.h
- [类的声明文件]类的成员函数的具体实现,保存在.cpp文件中,比如Human.cpp[类的方法文件]
- 其他文件,如果需要这个类,就包含这个类的头文件
- 类的静态数据成员(只能通过对象进行调用)
- 对象成员函数(没有static的成员函数)内部,可以直接访问“静态数据成员”
- 类的静态成员函数(有static的成员函数)内部,可以直接访问“静态数据成员”
- 所有的成员函数都已访问静态数据成员。
- 类不能直接访问普通的静态成员(Human::humanCount 非法)
- 类的静态成员函数(不属于对象,用类和对象都可以来调用)
- 对象可以直接访问静态成员函数
- 类可以直接访问静态成员函数(Human::getHumanCount());
- 在类的静态成员函数(类的静态方法)内部,不能直接访问this指针和对象数据成员!
- 在类的静态成员函数(类的静态方法)内部,只能访问类的静态数据成员
建模的常用手段 - 组合和聚合
- 组合
- 需求:构建一个计算机类,一台计算机,有CPU,硬盘,内存组成。CPU芯片也使用类来表示
-
C++ 中
- 声明一个类的函数,提示与头文件声明不兼容 :删掉该 .cpp 中多余的声明的头文件即可。
- 未定义标识符string: string是标准库定义的,不需要写#include:包含 using namespace std即可;
-
const导致的异常bug
- const对象,只能调用对应的const方法,类的成员函数,如果已经确定不会修改任何数据成员,那么,最好把这个成员函数,定义为const函数(在函数体的前面,参数列表的后面添加const)
-
operator=的参数问题
-
赋值运算符的重载,应该使用这种方式:
Boy& operator=(const Boy &boy); 如果定义: Boy& operator=(const Boy boy); //boy是局部变量,而boy和boy1的name指向同一地址,在函数结束时,boy会调用析构函数,导致name这块内存就消失,同时boy1的name也会消失。 有效果,但是在调用时,会执行参数的传递: 比如:boy2 = boy1; 就会执行: boy2.operator=(boy1); 就会执行: const Boy boy = boy1; 就会执行: Boy类的赋值构造函数
-
有两个影响:
1)浪费性能
2)如果没有自定义的拷贝构造函数,而且这个类又有指针成员时,就会调用自动生成的拷贝构造函数,导致浅拷贝
如果析构函数中,对这个指针指向的内存做了释放,那就导致数据损坏或崩溃! -
小结:
1)赋值运算符的重载,一定要使用引用参数
2)如果一个类有指针成员,而且使用了动态内存分配,那么一定要定义自己的拷贝构造函数【要使用深拷贝】,避免调用自动生成的拷贝构造函数 -
因为自动生成的拷贝构造函数,是浅拷贝!
-