当前位置: 首页 > news >正文

C++ 中 构造函数 之二

既然你决定深挖,那我们就撕开 C++ 构造函数的表面,直接看底层的内存布局执行逻辑

为了打好基础,我们不仅要看怎么写,还要看编译器在背后偷偷做了什么。


1. 深入:默认构造函数 (Default Constructor)

底层逻辑: 当你写 ClassName obj; 时,编译器会分配内存并调用此函数。

  • 隐式生成的陷阱: 如果你没写构造函数,编译器生成的默认构造函数不会初始化内置类型(如 int, double, 指针)。它们的值将是内存里的随机垃圾值。
  • 现代写法: C++11 引入了 = default,明确告诉编译器“请帮我生成默认版本”。
class Database {
public:Database() = default; // 明确使用默认生成的// 或者手动初始化Database() : connectionCount(0) {} 
private:int connectionCount; 
};

2. 核心:初始化列表 (Member Initializer List)

这是 C++ 区别于 Java/C# 的核心点。在花括号 {} 之前的冒号部分才是真正的初始化

  • 为什么要用: 1. 性能: 如果不使用列表,成员会先调用默认构造函数,进入花括号后再调用赋值运算符(二次开销)。
  1. 强制性: const 成员、引用成员、没有默认构造函数的类成员,必须在初始化列表中初始化。
  • 危险点: 成员初始化的顺序只取决于它们在类中声明的顺序,与你在初始化列表中写的顺序无关!

3. 难点:拷贝构造函数 (Copy Constructor)

这是 C++ 面试的“常客”。当一个对象以值传递的方式进入函数,或者从函数返回时,都会触发它。

深拷贝 (Deep Copy) 的标准模版:

如果类中有指针,默认的浅拷贝只会复制地址。这会导致两个对象指向同一内存,析构时会发生 Double Free (二次释放) 错误。

class Buffer {int* data;size_t size;
public:// 拷贝构造函数:深拷贝实现Buffer(const Buffer& other) : size(other.size) {data = new int[size]; // 开辟新内存std::copy(other.data, other.data + size, data); // 复制内容cout << "Deep Copy Called\n";}~Buffer() { delete[] data; }
};

4. 进阶:移动构造函数 (Move Constructor)

这是 C++11 最伟大的特性之一,解决了拷贝大型对象带来的性能损耗。

  • 核心思想: “偷”。如果源对象是一个临时对象(右值),我直接把它的指针拿过来,并把它的指针置为 nullptr
  • 关键字: && (右值引用) 和 noexcept (移动构造通常声明为不抛出异常,以便 STL 容器优化)。
// 移动构造函数
Buffer(Buffer&& other) noexcept : data(other.data), size(other.size) {other.data = nullptr; // 关键:断开原对象的指向other.size = 0;cout << "Move Constructor Called\n";
}

5. 委托构造 (Delegating Constructor)

如果你有多个构造函数,且它们有重复的初始化逻辑,可以让一个构造函数调用另一个。

class Robot {
public:Robot(int id, string name) : m_id(id), m_name(name) {}// 委托给上面的构造函数Robot() : Robot(0, "Unknown") {} 
private:int m_id;string m_name;
};

如何验证你掌握了?

你可以尝试写一个包含 int* 指针的类,并分别实现这几种构造函数,然后在 main 函数里用以下方式触发:

  1. MyClass a; (默认)
  2. MyClass b(10); (有参)
  3. MyClass c = b; (拷贝)
  4. MyClass d = std::move(b); (移动)
http://www.jsqmd.com/news/429257/

相关文章:

  • 2026上海家政数字化趋势观察:行业正在从“流量竞争”走向“履约竞争”
  • 2026年工程承包商户外场景电动遮阳帘优质推荐榜 - 资讯焦点
  • Task12:哈希表
  • 2026年高性价比卡券回收平台排行榜,收券宝兼顾实惠与省心 - 资讯焦点
  • C++ 中 构造函数 之一
  • Task11:分治
  • 2026年安全高效卡券回收平台排行榜,收券宝凭实力领跑 - 资讯焦点
  • 【解决方案】VMware Ubuntu 22.04 虚拟机无法与主机文件交互解决方案
  • 简单的ai问答助手Flask+Web
  • PhysioDSP:一个面向可穿戴设备的 Python 信号处理库
  • NMN哪个牌子效果最好?奥本元NMN测评:对比万元级大牌,揭秘抗衰界的“性能猛兽” - 资讯焦点
  • 星计划(佛山)网络有限公司简介 - 资讯焦点
  • Task08:搜索
  • Python中的字符类型
  • Java小白程序员的互联网大厂面试之旅——从Spring Boot到分布式缓存
  • 窗帘上的 MV :从静态布料到动态视频材质 - 行人-
  • Task07:双指针
  • 华为OD机考双机位C卷 - 矩阵匹配 (Java Python JS GO C++ C)
  • 虚拟资产:数字时代的新型价值载体
  • 医美机构如何在AI问答中被自然推荐,有专业GEO服务商可以选择吗? - 品牌2026
  • Task10:动态规划
  • 地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
  • Task09:排序
  • Task06:位运算
  • 电商运营数据的自动化处理解决方案
  • AI 应用架构师亲授:AI 安全漏洞检测系统高级技术与实践
  • 提示工程架构师:如何避免“为技术而技术”,真正提升用户满意度?
  • 【二分】BISHI86 圆覆盖
  • 最短路 - ## 游艇租用
  • AI提示工程架构师必备:提示系统日志分析与问题定位实战指南