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     }

 

  

posted @ 2021-01-12 19:36  涅风  阅读(69)  评论(0编辑  收藏  举报