概述
在掌握了类与对象的基础概念后,我们需要进一步探讨 C++ 中默认成员函数的核心机制。本文将重点解析构造函数、拷贝构造函数、析构函数以及操作符重载的实现细节与潜在陷阱。
一、类的默认成员函数
默认成员函数是指用户未显式实现时,由编译器自动生成的成员函数。一个类中通常包含四个重要的默认成员函数:构造函数、拷贝构造函数、析构函数和赋值运算符重载。
掌握这部分内容需从两个维度入手:一是理解编译器自动生成函数的行为及其适用场景;二是当默认行为无法满足需求时,如何自定义实现。
二、构造函数
构造函数是对象创建时的初始化程序,负责分配内存后的状态设置。它不是用来开辟空间的(那是栈帧的任务),而是完成初始化。
2.1 核心语法
构造函数的名称必须与类名相同,无返回值类型,且无需手动调用,在声明对象时自动触发。
#include <iostream>
using namespace std;
class Student {
public:
int age;
// 构造函数:类名 (参数)
Student() {
age = 18;
cout << "调用了默认构造函数" << endl;
}
};
int main() {
Student s1; // 自动调用构造函数
cout << s1.age << endl;
return 0;
}
2.2 常见类型
- 无参构造函数:不带任何参数。
- 带参构造函数:允许创建时传入特定值。
- 全缺省构造函数:参数有默认值,可灵活调用。
注意:无参构造函数和全缺省构造函数不能同时存在,否则编译器无法区分调用歧义。
2.3 默认构造函数与编译器生成规则
所谓默认构造函数,指不传实参即可调用的构造函数,包括无参、全缺省以及编译器隐式生成的版本。
编译器生成条件:仅当类中未定义任何构造函数时,编译器才会生成一个默认的无参构造函数。一旦用户定义了任意一个构造函数(无论是否有参),编译器将停止赠送默认版本。
初始化逻辑差异:
- 自定义类型成员:编译器会自动调用其默认构造函数。
- 内置类型成员:编译器不做初始化,保留内存中的垃圾值。
这意味着对于包含指针或基本类型的类,依赖默认构造函数极其危险,可能导致野指针或未定义行为。
class Date {
public:
{ cout << _year << << _month << << _day << endl; }
:
_year;
_month;
_day;
};
{
Date d1;
d();
;
}


