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

C++ 06:构造函数——对象初始化的核心指南

一、构造函数基础规则

  1. 命名与返回值:函数名与类名完全一致,无返回值类型(不能写void)。

  2. 自动调用:创建对象时系统自动触发,无需手动调用。

  3. 默认构造:未显式定义时,编译器自动生成空默认构造(仅分配内存,成员值随机);一旦自定义构造,默认构造失效。

  4. 访问权限:通常定义为public,保证外部可创建对象。

基础示例

#include <iostream> using namespace std; class Point { private: int x, y; public: // 自定义无参构造(初始化成员) Point() { x = 0; y = 0; } void show() { cout << "(" << x << "," << y << ")" << endl; } }; int main() { Point p; // 自动调用无参构造 p.show(); // 输出 (0,0) return 0; }

二、构造函数重载与默认参数

1. 构造函数重载

通过参数列表不同实现重载,提供多套初始化方案:

class Date { private: int year, month, day; public: // 无参构造 Date() { year = 2024; month = 4; day = 21; } // 有参构造(重载) Date(int y, int m, int d) { year = y; month = m; day = d; } void show() { cout << year << "-" << month << "-" << day << endl; } }; // 调用示例 int main() { Date d1; // 无参构造:2024-4-21 Date d2(2024, 4, 22); // 有参构造:2024-4-22 return 0; }

2. 默认参数构造

参数列表指定默认值,兼顾 “无参” 和 “有参” 场景:

// 全默认参数构造(替代无参+有参重载) class Date { private: int year, month, day; public: Date(int y=2024, int m=4, int d=21) { year = y; month = m; day = d; } void show() { cout << year << "-" << month << "-" << day << endl; } }; // 调用示例 int main() { Date d1; // 用默认值:2024-4-21 Date d2(2024); // 部分传参:2024-4-21 Date d3(2024,5); // 部分传参:2024-5-21 return 0; }

三、初始化列表(进阶核心)

1. 核心优势

初始化列表是更高效的成员初始化方式,先于函数体执行,且是const成员、引用成员的唯一初始化方式。

2. 语法对比

class Date { private: int year, month, day; const int VERSION; // const成员 public: // 传统方式(函数体内赋值) // Date(int y, int m, int d) { year=y; month=m; day=d; } // 初始化列表(推荐) Date(int y=2024, int m=4, int d=21) : year(y), month(m), day(d), VERSION(1) {} void show() { cout << year << "-" << month << "-" << day << " v" << VERSION << endl; } };

3. 执行规则

成员初始化顺序由声明顺序决定,与初始化列表顺序无关。

四、对象的 5 种定义方式

int main() { Date d1; // 无参/默认参数构造 Date d2(2024,4,22); // 直接传参 Date d3{2024,4,23}; // C++11列表初始化(推荐,更安全) Date d4 = Date(2024,4,24); // 传统赋值写法 Date* d5 = new Date(2024,4,25); // 动态创建(堆内存) d1.show(); d2.show(); d3.show(); d4.show(); d5->show(); delete d5; // 释放动态对象 return 0; }

五、核心注意事项

  1. 避免二义性:不要同时定义无参构造和全默认参数构造。

  2. 初始化优先级:类内初始化值 < 初始化列表 < 函数体赋值(实际开发优先用初始化列表)。

  3. 空指针安全:动态创建对象后需用delete释放,避免内存泄漏。

http://www.jsqmd.com/news/489637/

相关文章:

  • CZ预判AI Agent支付迎爆发 MoltsPay上线测试网降低开发门槛
  • 3.16学习总结
  • 高频注入foc方案应用于无感PMSM永磁同步电机驱动器,实现稳定无抖动堵转功能,附源码原理图与...
  • 2026权威评测:毕业论文AIGC降重盘点,附免费试用
  • 企业级数据仓库分层
  • 裸辞转行干网络安全裸辞转行干网络安全
  • 【文献速递】氟辅助闪速焦耳热法合成形貌可控的碳化物材料
  • MATLAB求解非线性方程组:基于牛顿法原理的程序设计及注释
  • 解码细胞能量引擎:芯健生物高纯度注射用辅酶Ⅰ的技术内核与临床价值
  • 单片机振荡周期,机器周期,指令周期
  • 论文查重 “生死局” 破局:PaperZZ 降重 + 降 AIGC 双引擎,让 AI 生成痕迹彻底隐身
  • HTML,CSS,JS 语法格式
  • 从0到1研发GEO优化系统,多平台一键适配功能实现详解
  • 探索瞬变电磁中的傅立叶变换:从时间域到频率域
  • RTLAB实验图,半实物仿真平台,截图波形转示波器波形,仿真模型转实验图,电力电子实验波形
  • BIT*算法
  • acwing相关复盘
  • 智慧矿井人员行为状态爬走靠站跌倒检测数据集VOC+YOLO格式4847张8类别
  • MCP原理解析:软件工程角度
  • redis缓存穿透、击穿、雪崩的区别
  • 哪些产品需要沙特SABER认证?一文说清
  • 实测 Claude 1M 长文本与 API 价格策略:开发者如何避坑与降本增效
  • 智慧交通项目:Python+PySide6 车辆检测系统 YOLOv8+OpenCV 自定义视频 自定义检测区域 (源码+文档)?
  • 从需求到落地:手把手教你编写第一个OpenClaw自定义技能
  • NJR-10线材扭转卷绕试验机
  • 二维巷道开挖模型文件
  • 飞扬集成设计系统 × 启道协同设计系统:二三维一体协同,重塑设计交付新范式
  • claude code安装过程中的问题记录
  • React单位转换系统:设计灵活的单位系统与单位系统转换方案
  • 如何验证序列号是否被Apple占用