1. 默认生成的函数
1. 默认构造函数(空实现)
2. 默认析构函数(空实现)
3. 默认拷贝构造函数(值拷贝)
2. 注意
1. 若用户自定义有参构造函数, 编译其不再提供默认无参构造函数, 仅提供析构函数和默认拷贝构造函数
2. 若用户自定义拷贝构造函数, 编译其不再提供构造函数, 仅提供析构函数
3. 即便用户声明定义了默认构造函数,编译器也会为类生成提供“拷贝构造函数”。
3. 1 当类没有声明构造函数时,编译器会为类生成一个构造函数(应该是有条件的,参考“c学习38”)。
class class_A25
{
private:
int a25;
public:
};
void test_25_01(){
class_A25 *p = new class_A25();
}
//编译正常,运行正常,说明即便我们没有声明构造函数,编译默认为该类生成一个默认的构造函数,该默认构造函数式“空实现”的。
3.2 定义了构造函数,编译器就不会再提供默认构造函数了。
class class_A25
{
private:
int a25;
public:
class_A25(int a);
};
class_A25::class_A25(int a){
printf("构造函数a=%d\n",a);
}
void test_25_01(){
// class_A25 *p = new class_A25();//报错:“错误:对‘class_A25::class_A25()’的调用没有匹配的函数”
class_A25 *p = new class_A25(2);
}
输出结果:
构造函数a=2
3.3 自定义拷贝构造函数, 编译其不再提供构造函数
class class_A25
{
private:
int a25;
public:
class_A25(const class_A25 &a);
};
class_A25::class_A25(const class_A25 &a){
a25 = a.a25;
printf("拷贝构造函数\n");
}
void test_25_01(){
// class_A25 class_a25_01;//报错:“对‘class_A25::class_A25()’的调用没有匹配的函数”
}
代码编译报错
3.4 编译生成默认拷贝函数。
class class_B25
{
private:
int a25;
public:
};
void test_25_02(){
class_B25 class_b25_01;
class_B25 class_B25(class_b25_01);//可以编译执行,编译器默认为类生成了拷贝构造函数
}
3.5 即便声明定义了默认构造函数,编译器也会为类生成提供“拷贝构造函数”。
class class_B25
{
private:
int a25;
public:
class_B25();
};
class_B25::class_B25(){
printf("声明的默认构造函数\n");
}
void test_25_02(){
class_B25 class_b25_01;
class_B25 class_B25(class_b25_01);//可以编译执行,编译器默认为类生成了拷贝构造函数
}
输出结果:
声明的默认构造函数
参考: c学习-38