一、程序及输出
1.1 编译器会给一个类 至少添加3个函数
编译器会给一个类 至少添加3个函数 默认构造(空实现) 析构函数(空实现) 拷贝构造(值拷贝)
#include<iostream>
using namespace std;
class Person
{
public:
int m_Age;
};
void test01()
{
Person p1;//提供拷贝构造后,要自己提供默认构造,否则出错
p1.m_Age = 20;
Person p2(p1);
cout << "p2的年龄为: " << p2.m_Age << endl;
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
什么构造函数都没写,但是能正常运行,因为此时编译器会有相对应的构造函数
输出:
1.2 自己提供了 有参构造函数
如果我们自己提供了 有参构造函数,编译器就不会提供默认构造函数,但是依然会提供拷贝构造函数
如果不自己构造默认构造函数却使用空实现去构造:
#include<iostream>
using namespace std;
//1、编译器会给一个类 至少添加3个函数 默认构造(空实现) 析构函数(空实现) 拷贝构造(值拷贝)
//2、如果我们自己提供了 有参构造函数,编译器就不会提供默认构造函数,但是依然会提供拷贝构造函数
//3、如果我们自己提供了 拷贝构造函数,编译器就不会提供其他构造函数
class Person
{
public:
Person(int age)
{
m_Age = age;
cout << "有参构造函数调用" << endl;
}
int m_Age;
};
使用拷贝构造去测试是否正常:
输出:
1.3 自己提供了 拷贝构造函数
如果我们自己提供了 拷贝构造函数,编译器就不会提供其他构造函数
如果此时使用空实现和有参去构造,都会报错:
#include<iostream>
using namespace std;
//1、编译器会给一个类 至少添加3个函数 默认构造(空实现) 析构函数(空实现) 拷贝构造(值拷贝)
//2、如果我们自己提供了 有参构造函数,编译器就不会提供默认构造函数,但是依然会提供拷贝构造函数
//3、如果我们自己提供了 拷贝构造函数,编译器就不会提供其他构造函数
class Person
{
public:
Person(const Person &p)
{
m_Age = p.m_Age;
cout << "拷贝构造函数调用" << endl;
}
int m_Age;
};
有参:
空:
二、分析与总结
1、编译器会给一个类 至少添加3个函数 默认构造(空实现) 析构函数(空实现) 拷贝构造(值拷贝)
2、如果我们自己提供了 有参构造函数,编译器就不会提供默认构造函数,但是依然会提供拷贝构造函数
3、如果我们自己提供了 拷贝构造函数,编译器就不会提供其他构造函数