当前位置: 首页 > 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++程序
http://www.xdnf.cn/news/258517.html

相关文章:

  • AXI中的burst有几种?都用在什么场景中
  • 复刻低成本机械臂 SO-ARM100 舵机配置篇(WSL)
  • HTML5+JavaScript实现连连看游戏之二
  • [预备知识]6. 优化理论(二)
  • Codeforces Round 1022 (Div. 2) A ~ C
  • 【AI面试准备】数据治理与GDPR脱敏机制构建
  • 一键暂停Windows更新工具
  • 数字智慧方案6186丨智慧应急指挥解决方案(43页PPT)(文末有下载方式)
  • VGG网络模型
  • 自监督学习的学习笔记
  • Python 数据智能实战 (7):智能流失预警 - 融合文本反馈
  • git问题记录-如何切换历史提交分支,且保留本地修改
  • 安卓程序打包与发布
  • 不小心误删了文件,找Windows数据恢复工具来帮忙
  • redis持久化-RDB
  • 数字智慧方案5868丨智慧建造总体策划方案(68页PPT)(文末有下载方式)
  • 泰迪杯特等奖案例学习资料:基于多模态特征融合的图像文本检索系统设计
  • 清洗数据集
  • 数字智慧方案5870丨智慧交通顶层设计方案(89页PPT)(文末有下载方式)
  • 树莓派连接教学
  • 【KWDB 创作者计划】_查询优化器源码分析
  • 《缓存策略:移动应用网络请求的“效能密钥” 》
  • 鼎讯信通【专注通信解决方案】
  • 在多socket多核计算机上配置MPI和OpenMP
  • 【算法】动态规划专题一 斐波那契数列模型 1-4
  • 从0到上线,CodeBuddy 如何帮我快速构建旅游 App?
  • LabVIEW实验室测试框架推荐
  • 在文本废墟中打捞月光
  • 基于bert的情感分析程序
  • 51c大模型~合集123