c24拷贝构造函数.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;
}