一、构造函数基础规则
命名与返回值:函数名与类名完全一致,无返回值类型(不能写void)。
自动调用:创建对象时系统自动触发,无需手动调用。
默认构造:未显式定义时,编译器自动生成空默认构造(仅分配内存,成员值随机);一旦自定义构造,默认构造失效。
访问权限:通常定义为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;
}
五、核心注意事项
避免二义性:不要同时定义无参构造和全默认参数构造。
初始化优先级:类内初始化值 < 初始化列表 < 函数体赋值(实际开发优先用初始化列表)。
空指针安全:动态创建对象后需用delete释放,避免内存泄漏。



