c24拷贝构造函数.cpp
- #define _CRT_SECURE_NO_WARNINGS
- #include
- 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;
- }
