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

深入理解C++构造函数:从入门到实践

1. 默认构造函数:对象的"出厂设置"

什么是默认构造函数?

  • 没有参数的构造函数
  • 当你没有定义任何构造函数时,编译器自动生成
  • 用于创建对象时不传递参数的情况
class Smartphone {
public:// 成员初始化方法一: 函数体内初始化Smartphone() {  // 默认构造函数storage = 128;  // 默认存储容量brand = "Unknown";cout << "手机已激活!" << endl;}// 成员初始化方法二: 初始化列表// 默认构造函数使用初始化列表Smartphone() : storage(128),     // 初始化列表语法brand("Unknown")  // 成员变量直接初始化{cout << "手机已激活!" << endl;}// 正确版本:带参数构造函数Smartphone(int storageVal, string brandVal) : storage(storageVal),  // 用参数初始化成员变量brand(brandVal)       // 避免命名冲突{cout << "手机已激活!" << endl;}private:int storage;string brand;
};// 使用示例
Smartphone myPhone;  // 调用默认构造函数

重要特性

  • 如果定义了其他构造函数,编译器不再生成默认构造
  • 可以强制生成默认构造:ClassName() = default;

2. 重载构造函数:对象的"定制服务"

为什么需要重载?

  • 提供不同的初始化方式
  • 适应不同场景的需求
class Pizza {
public:// 基础款:只指定尺寸Pizza(int size) : size(size), topping("cheese") {}// 豪华款:指定尺寸和配料Pizza(int size, string top) : size(size), topping(top) {}// 套餐款:包含饮品Pizza(int size, string top, string drink) : size(size), topping(top), drink(drink) {}private:int size;       // 英寸string topping;string drink;
};// 创建不同披萨
Pizza basic(12);                     // 基础款
Pizza deluxe(14, "pepperoni");       // 豪华款
Pizza combo(16, "veggie", "cola");   // 套餐款

最佳实践

  • 使用初始化列表提高效率
  • 避免重复代码,可以相互调用

3. 拷贝构造函数:对象的"克隆技术"

核心作用

  • 用已有对象创建新对象
  • 控制拷贝过程,避免浅拷贝问题
class GameSave {
public:GameSave(const GameSave& other) {// 深度拷贝动态内存data = new int[100];memcpy(data, other.data, 100*sizeof(int));cout << "存档已克隆!" << endl;}private:int* data;  // 动态分配的存档数据
};// 使用场景
GameSave original;
GameSave backup(original);  // 调用拷贝构造

三大调用时机

  1. 对象直接赋值初始化
  2. 函数参数传递对象
  3. 函数返回对象

4. 赋值运算符:对象的"身份转移"

与拷贝构造的区别

  • 作用在已存在的对象
  • 使用=运算符时触发
class Student {
public:// 赋值运算符重载Student& operator=(const Student& other) {if(this != &other) {  // 防止自赋值age = other.age;name = other.name;}return *this;  // 支持链式赋值}private:int age;string name;
};// 使用示例
Student a, b;
a = b;  // 调用赋值运算符

关键要点

  • 必须处理自赋值(a = a)
  • 通常返回引用以支持连续赋值
  • 与拷贝构造函数配合实现完整拷贝控制

总结对比表

构造函数类型调用时机典型用途示例代码
默认构造函数对象无参创建初始化默认值MyClass obj;
重载构造函数带参数创建对象多种初始化方式MyClass(42, "X")
拷贝构造函数对象复制初始化深度拷贝资源MyClass obj2(obj1)
赋值运算符已存在对象赋值资源安全转移obj2 = obj1;

掌握这四类构造函数,就像获得对象创建的"四把钥匙",能让你:

  1. 控制对象的诞生方式
  2. 确保资源的正确管理
  3. 构建更安全高效的C++程序

相关文章:

  • win10系统安卓开发环境搭建
  • Spring 分批处理 + 冷热数据分离:历史订单高效迁移与数据清理实战
  • 数字智慧方案6206丨智慧园区大数据整体解决方案(45页PPT)(文末有下载方式)
  • 数字智慧方案5846丨智慧广场整体解决方案(91页PPT)(文末有下载方式)
  • JavaScript基础-逻辑运算符
  • 【网络层】之IP协议
  • 源码安装SRS4
  • UE运行游戏时自动播放关卡序列
  • 纯前端专业PDF在线浏览器查看器工具
  • 【Shell编程】条件表达式中[]和[[]]的区别
  • 计算方法实验三 解线性方程组的直接方法
  • 【C到Java的深度跃迁:从指针到对象,从过程到生态】第五模块·生态征服篇 —— 第二十章 项目实战:从C系统到Java架构的蜕变
  • 位运算符详解:从入门到精通
  • 使用python爬取百度搜索中关于python相关的数据信息
  • WebRtc10: 端对端1v1传输基本流程
  • 第三章 权限维持-linux权限维持-隐藏
  • 八闽十三张模块部署测试记录:源码结构拆解与本地运行验证(含常见问题与修复指南)
  • PointPillars(一),跑通OpenPCDet中的demo
  • C语言 之 【栈的简介、栈的实现(初始化、销毁、入栈、出栈、判空、栈的大小、访问栈顶元素、打印)】
  • 【多线程】六、基于阻塞队列的生产者消费者模型
  • 新加坡国会选举投票抽样结果公布,执政党已获超半数议席
  • 因雷雨、沙尘等天气,这些机场航班运行可能受影响
  • 魔都眼|咖啡节上上海小囡忍不住尝了咖啡香,母亲乐了
  • 美法官裁定特朗普援引战时法律驱逐黑帮违法,系首次永久性驳回
  • 从“土”到“潮”,唢呐何以“圈粉”年轻人
  • 礼来一季度净利增近三成,明星GLP-1药物替尔泊肽贡献近半收入