类的构造函数:
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void;
构造函数可用于为某些成员变量设置初始值。
编译器生成默认构造函数的情况:
1.类中有一个类成员含有默认构造函数,编译器会为该类自动生成默认构造函数,自动插入代码,调用该成员的构造函数;
2.基类中含有默认构造函数,编译器会为该类自动生成默认构造函数,自动插入代码,调用基类的构造函数;
3.类中含有虚函数时,由于编译器要为该类生成虚函数表vtable,并为该类的对象生成指向该vtable的vptr,所以需要为该类合成默认构造函数;
4.虚继承时。
拷贝构造函数:
拷贝构造函数是一种特殊的构造函数,用基于同一类的一个对象构造和初始化另一个对象。
当没有重载拷贝构造函数时,通过默认拷贝构造函数来创建一个对象。
拷贝构造函数的调用:
1. 一个对象以值传递的方式传入函数体
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
#include <cstdio>
#include <sstream>
using namespace std;
class Demo{
private:
int a;
public:
Demo(int b)
{
a=b;
printf("constructor is called\n");
}
Demo(const Demo & c)
{
a=c.a;
printf("copy constructor is called\n");
}
~Demo()
{
cout<<"destructor is called\n";
}
void Show()
{
cout<<a<<endl;
}
};
void func(Demo c){
cout<<"func"<<endl;
}
int main(){
Demo A(100);
Demo B = A;
B.Show();
func(A);
return 0;
}
2. 一个对象以值传递的方式从函数返回
3. 一个对象需要通过另一个对象进行初始化
Demo A(100);
Demo B=A;
生成默认拷贝构造函数的情况:
1. 如果用户没有自定义拷贝构造函数,并且在代码中使用到了拷贝构造函数,编译器就会生成默认的拷贝构造函数。但如果用户定义了拷贝构造函数,编译器就不再生成。
2. 如果用户定义了一个构造函数,但不是拷贝构造函数,而此时代码中又用到了拷贝构造函数,那编译器也会生成默认的拷贝构造函数。
参考链接:
https://blog.csdn.net/OtherShoreFlower/article/details/89848679