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

C++ 中 构造函数 之一

很高兴看到你开始挑战 C++ 这一“硬核”领域。理解构造函数(Constructor)不仅是学习面向对象编程(OOP)的基础,更是掌握 C++ 内存管理和性能优化的钥匙。

在 C++ 中,构造函数主要分为以下几种类型。为了让你看得透彻,我们从最基础的开始,逐步深入到现代 C++ 的核心。


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

定义: 不需要提供任何参数就能调用的构造函数。

  • 写法: 既可以是不带参数的,也可以是参数全部有默认值的。
  • 注意: 如果你没有定义任何构造函数,编译器会自动为你生成一个。但一旦你定义了任何一种构造函数,编译器就不再赠送这个“默认版”了。
class Player {
public:// 1. 无参构造Player() {score = 0;}// 2. 或者所有参数都有默认值// Player(int s = 0) : score(s) {} 
private:int score;
};// 使用:
Player p1; // 调用默认构造函数

2. 有参构造函数 (Parameterized Constructor)

定义: 接收外部传入的参数,用于初始化对象的成员变量。

  • 核心技巧: 推荐使用 初始化列表 (Initialization List)。它比在花括号里赋值效率更高,因为它直接初始化成员,而不是先默认初始化再赋值。
class Player {
public:Player(int s, string n) : score(s), name(n) {// 这里的 score(s) 就是初始化列表}
private:int score;string name;
};// 使用:
Player p2(100, "Alice");

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

定义: 用一个已存在的对象来初始化一个新对象。它的参数必须是同类对象的引用(通常是 const 引用)。

  • 深拷贝 vs 浅拷贝: 这是初学者的重难点。
  • 浅拷贝: 仅复制指针地址。如果类中有动态内存(new 出来的),两个对象会指向同一块内存,析构时会导致崩溃。
  • 深拷贝: 重新申请内存,复制内容。
class Player {
public:// 拷贝构造函数Player(const Player& other) {score = other.score;name = other.name;// 如果有指针成员,这里需要 new 新空间并复制内容 (深拷贝)}
};// 使用:
Player p3 = p2; // 或者 Player p3(p2); 都会触发拷贝构造

4. 转换构造函数 (Conversion Constructor)

定义: 只带一个参数的构造函数,能将其他类型隐式转换为当前类类型。

  • 风险: 容易引发意外的隐式转换。
  • 对策: 使用 explicit 关键字禁用隐式转换。
class Box {
public:explicit Box(int size) : m_size(size) {} // 建议加上 explicit
private:int m_size;
};// 使用:
Box b = 10; // 如果没加 explicit,这行可行(隐式转换)。加了后会报错,必须 Box b(10);

5. 移动构造函数 (Move Constructor) —— C++11 性能神技

定义: 用于“夺取”一个临时对象(右值)的资源,而不是复制它。

  • 场景: 当你用一个即将销毁的临时对象(比如函数返回值)来创建新对象时,移动构造可以将资源“偷”过来,避免昂贵的内存分配。
  • 写法: 参数使用双安培符号 && (右值引用)。
class BigData {
public:BigData(BigData&& other) noexcept {data = other.data;      // 接管资源地址other.data = nullptr;   // 将原对象置空,防止它析构时删掉资源}
private:int* data;
};

总结与对比

构造函数类型 触发时机 核心作用
默认构造 ClassName obj; 基础初始化
有参构造 ClassName obj(args); 自定义初始化
拷贝构造 ClassName obj2 = obj1; 复制现有对象
移动构造 ClassName obj2 = std::move(obj1); 资源所有权转移(高性能)

给你的学习建议:

  1. 首选初始化列表: 养成 Constructor() : member(val) {} 的习惯。
  2. 三/五法则: 如果你的类里写了析构函数(通常是因为有指针成员),那么你几乎一定需要同时手写拷贝构造、拷贝赋值。在 C++11 后,还应该考虑移动构造。
http://www.jsqmd.com/news/429252/

相关文章:

  • 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提示工程架构师必备:提示系统日志分析与问题定位实战指南
  • P8306 【模板】字典树
  • DevOps智能化转型:效率提升新思路
  • 医美机构如何在豆包做广告,有专业服务商可以合作吗? - 品牌2026
  • 医美机构如何在豆包上获得自然推荐,有专业服务商可以合作吗? - 品牌2026
  • 大数据存储必知必会:5种主流分布式文件系统对比