C++构造函数的一些注意事项

SkyLeech lol

拷贝构造函数

拷贝构造函数调用时机

C++中拷贝构造函数调用时机通常有三种情况

  • 使用一个已经创建完毕的对象来初始化一个新对象
  • 值传递的方式给函数参数传值
  • 以值方式返回局部对象

注意事项1:

调用默认构造函数时候,不要加()

因为下面这行代码,编译器会认为是一个函数的声明,不会认为在创建对象

1
2
3
Person p1();

void func();

注意事项2:

不要利用拷贝构造函数 初始化匿名对象 编译器会认为Person(p3) === Person p3(对象声明)

1
2
3
4
5
//显示法创建对象
Person p2 = Person(10); // 有参构造
Person p3 = Person(p2); //拷贝构造

Person(p3); // 不要利用拷贝构造函数初始化匿名对象

构造函数调用规则

默认情况下,C++编译器至少给一个类添加3个函数

  1. 认构造函数(无参,函数体为空)
  2. 默认析构函数(无参,函数体为空)
  3. 默认拷贝构造函数,对属性进行值拷贝

构造函数调用规则如下:

  • 如果用户定义有参构造函数,C++不在提供默认无参构造,但是会提供默认拷贝构造
  • 如果用户定义拷贝构造函数,C++不会再提供其他构造函数

深拷贝与浅拷贝

浅拷贝:简单的赋值拷贝操作

深拷贝:在堆区重新申请空间,进行拷贝操作

在类中存在指针类型时会出现的问题:

image-20240424003444756

默认拷贝构造函数只会做浅拷贝操作,所以要利用深拷贝进行解决

1
2
3
4
5
6
7
8
Person(const Person &p){
m_Age = p.m_Age;

//m_Height = p.m_Height; 编译器默认实现就是这行代码

//深拷贝操作
m_Height = new int (*p.m_Height) ;
}

当然,现在的编译器也会自动解决,不会报错

使用初始化列表方式初始化指针类型成员变量

1
2
3
4
//new在堆区创建内存
Rectangle(double width, int len) : width(width), len(new int(len)) {
cout << "有参构造" << endl;
}
  • 标题: C++构造函数的一些注意事项
  • 作者: SkyLeech
  • 创建于 : 2024-04-23 22:56:25
  • 更新于 : 2024-04-24 01:51:00
  • 链接: https://blog.skyleech.me/2024/04/23/C++构造函数的一些注意事项/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论