默认情况下,C++编译器至少给一个类添加3个函数:
1.默认构造函数(无参,函数体为空)
2.默认析构函数(无参,函数体为空)
3.默认拷贝构造函数,对属性进行值拷贝
1、创建一个类,C++编译器会给每个类都添加至少3个函数
#include<iostream>
using namespace std;
//构造函数的调用规则
//1、创建一个类,C++编译器会给每个类都添加至少3个函数
// 默认构造(空实现)
//析构函数(空实现)
//拷贝构造(值拷贝)I
class Person
{
public:
Person()
{
cout << "Person无参构造函数的调用" << endl;
}
Person(int age)
{
cout << "Person有参构造函数的调用" << endl;
m_Age = age;
}
/*Person(const Person& p) //这块拷贝构造函数是被注释掉的 但是输出结果的话 看下图
{
cout << "Person拷贝构造函数的调用" << endl;
m_Age = p.m_Age;
}*/
~Person()
{
cout << "Person析构函数的调用" << endl;
}
int m_Age;
};
void test01()
{
Person p;
p.m_Age = 18;
Person p1(p);
cout << "p2的年龄是: " << p1.m_Age << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
运行结果如下:
相当于就是编译器给类中自动填补了一个拷贝函数
2.如果在仅仅类中写了有参构造函数,那么编译器就不会再提供默认构造函数,依然提供拷贝构造函数
#include<iostream>
using namespace std;
class Person
{
public:
Person(int age) //有参构造函数
{
cout << "Person有参构造函数的调用" << endl;
m_Age = age;
}
~Person() //析构函数
{
cout << "Person析构函数的调用" << endl;
}
int m_Age;
};
void test02()
{
Person p;
}
int main()
{
test02();
system("pause");
return 0;
}
上述代码仅有有参构造和析构函数,调试:
会发现没有默认构造函数,印证了上述规则
将上述test02中的代码更换为如下:
void test02()
{
Person p(18);
Person p2(p);
cout << p2.m_Age << endl;
}
执行:::
会发现类中没有拷贝构造函数,但是运行依然OK
规则:如果在仅仅类中写了有参构造函数,那么编译器就不会再提供默认构造函数,依然提供拷贝构造函数
3.如果我们写了拷贝构造函数,编译器将不会早为我们提供普通构造函数(默认构造和有参构造)
class Person
{
public:
//该类中现在只有拷贝构造和析构
Person(const Person & p)
{
cout << "Person有参构造函数的调用" << endl;
}
~Person()
{
cout << "Person析构函数的调用" << endl;
}
int m_Age;
};
void test02()
{
Person p(18);
Person p1;
}
调试会报错如下:
会报错显示为没有默认构造函数和有参构造函数
总结一下:每个类中都会有三种函数
1.如果在仅仅类中写了有参构造函数,那么编译器就不会再提供默认构造函数,依然提供拷贝构造函数
2.如果我们写了拷贝构造函数,编译器将不会早为我们提供普通构造函数(默认构造和有参构造)
下篇,构造析构函数完结篇---->深拷贝与浅拷贝
《千与千寻》中有句台词我特别喜欢:何时看见都告诉自己:要加油。小千在面对突如其来的改变,选择的是勇敢,还有那份执着。