c24拷贝构造函数.cpp
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Person3 {
private:
int p_age;
public:
// 构造函数分类:
// 按参数分类:1、有参 2、无参
// 按类型分类:普通、拷贝(复制)
Person3() {
cout << "默认构造函数" << endl;
}
// explicit 防止使用隐式方法来实现构造函数
explicit Person3(int age) {
p_age = age;
cout << "有参数的构造函数" << p_age << endl;
}
// 拷贝构造函数
// 不能使用值传递,用引用传递;
// 需要添加const,因为不允许进行修改!
Person3(const Person3 &p) {
p_age = p.p_age;
cout << "拷贝构造函数" << p_age << endl;
}
~Person3() {
cout << "析构函数" << endl;
}
};
// 单独的一个方法
// 值传递本身就是拷贝一个副本再操作,所以会执行拷贝构造函数
void send_val(Person3 p) {
}
int main(void)
{
// 调用方法:
// 1、括号法
Person3 p1; // 调用的是默认构造函数
Person3 p2(18);
Person3 p3(p2);// 用一个对象初始化另一个对象 会调用拷贝构造函数
cout << "--------" << endl;
//Person3 p11();// 无参不能加小括号 不能直接调用无参构造函数,因为编译器把它当做函数声明
// 2、显示法
Person3 p4 = Person3();
Person3 p5 = Person3(22);
Person3 p6 = Person3(p5);
cout << "--------" << endl;
Person3(66); // 注意:1、匿名对象 执行完毕后,立即释放,立即执行析构函数
cout << "66的后面" << endl;
cout << "--------" << endl;
//注意:2、不要用拷贝构造函数初始化匿名对象
//Person3(p5); // Person3 p5; 当做对象的实例化看待,报错重定义
//3、隐式法: 不推荐使用,因为可读性非常差。
//Person3 p7 = 10; // 相当于 Person3 p7 = Person3(10);
//Person3 p8 = p7;// 相当于 Person3 p8 = Person3(p7);
Person3 p9(29);
// 值传递本身就是拷贝一个副本再操作,所以会执行拷贝构造函数
send_val(p9); // 传了一个对象进去,同时触发了构造函数 p9也是值
Person3 p10(18);
Person3 p11(p10);
return EXIT_SUCCESS;
}