11.2.2重学C++之【构造函数的分类及调用】

#include<stdlib.h>
#include<iostream>
#include<string>
using namespace std;


/*
    4.2 对象的初始化和清理
    4.2.2 构造函数的分类及调用
        按参数分:有参构造、无参构造(默认构造)
        按类型分:普通构造、拷贝构造
        调用方式3种:括号法、显式法、隐式转换法
*/


class Person{
public:

    // 普通构造
    Person(){
        cout << "Person类 无参构造(默认构造)函数的调用" << endl;
    }

    Person(int a){
        age = a;
        cout << "Person类 有参构造函数的调用" << endl;
    }

    // 拷贝构造
    Person(const Person & p){ // 有const和引用&
        // 将传入的人身上的所有属性拷贝到我身上
        age = p.age; // 区别上边普通构造的age = a
        cout << "Person类 拷贝构造函数的调用" << endl;
    }

    // 析构函数
    ~Person(){
        cout << "Person类析构函数的调用" << endl;
    }

    int age;
};


void test(){
    // 1 括号法(常用)
    Person p1; // 默认无参构造函数调用
    Person p2(10); // 有参构造函数调用
    Person p3(p2); // 拷贝构造函数调用
    cout << "p2年龄:" << p2.age << endl;
    cout << "p3年龄:" << p3.age << endl;

    // 注意调用默认构造函数时不要加()
    //Person p4(); // 虽不报错,但不会创建对象,所以不会调用任一构造和析构
    // 编译器会认为上句是一个函数的声明


    // 2 显式法
    Person p5; // 无参默认构造
    Person p6 = Person(10); // 有参构造
    Person p7 = Person(p6); // 拷贝构造

    // 匿名对象特点:当前行执行结束后,系统立即回收该匿名对象
    Person(10); // 单独拿出来称为匿名对象
    cout <<  "上行匿名对象的析构调用会自此句打印之前" << endl;

    // 不要利用拷贝构造函数来初始化匿名对象
    //Person(p7); // 报错,编译器会认为你的Person(p7)是Person p7(即无参默认构造,与上述p7重定义了)


    // 3 隐式转换法(会被自动转换为显式法)
    Person p8 = 10; // 有参构造 等价于Person p8=Person(10);
    Person p9 = p8; // 拷贝构造 等价于Person p9=Person(p8);
}



int main(){
    test();

    system("pause");
    return 0;
}

posted @ 2021-03-14 20:57  yub4by  阅读(15)  评论(0编辑  收藏  举报