目录
- 一、程序及输出
- 1.1 编译器会给一个类 至少添加3个函数
- 1.2 自己提供了 有参构造函数
- 1.3 自己提供了 拷贝构造函数
- 二、分析与总结
一、程序及输出
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、如果我们自己提供了 拷贝构造函数,编译器就不会提供其他构造函数