c++学习笔记
一. 构造函数的分类与规则
1.分类:
无参、有参、拷贝
2、调用方式:
括号、显示、隐式
3、规则:
如果用户定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造
如果用户定义拷贝构造函数,c++不会再提供其他构造函数
二. 深拷贝与浅拷贝
1. 浅拷贝:简单的赋值拷贝操作;默认拷贝构造函数里都是浅拷贝(当成员属性有指针时,浅拷贝是直接将地址拷贝到新的对象之中)
2. 深拷贝:在堆区重新申请空间,进行拷贝操作,(注:析构函数通常将堆区开辟的数据释放,因此当前一对象的指针属性被释放,新对象将报错)
1 class Person{
2 public:
3 Person(){
4 cout << "无参构造函数!" << endl;
5 }
6
7 Person(int age, int height){
8 m_Height = new int(height);
9 m_Age = age;
10 cout << "有参构造函数!" << endl;
11
12 }
13
14 //自己实现拷贝构造函数,解决浅拷贝带来的问题
15 Person(const Person &p)
16 {
17 cout << "Person 拷贝构造函数调用" << endl;
18 m_Age = p.m_Age;
19 //m_Height = p.m_Height;编译器默认实现该行代码
20 //深拷贝操作
21 m_Height = new int(*p.m_Height);
22 }
23
24 ~Person(){
25 //将堆区开辟的数据释放
26 if(m_Height != NULL)
27 {
28 delete m_Height;
29 m_Height = NULL;
30 }
31 cout << "析构函数!" << endl;
32 }
33
34 int m_Age;
35 int *m_Height;
36 };
总结:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题
三.初始化列表
C++提供了初始化列表语法,用来初始化属性
语法:构造函数():属性1(值1),属性2(值2)... {}
1 Person(int a, int b, int c) :m_A(a), m_B(b), m_C(c) {}
2 void PrintPerson() {
3 cout << "mA:" << m_A << endl;
4 cout << "mB:" << m_B << endl;
5 cout << "mC:" << m_C << endl;
6 }