C++面向对象入门(六)构造函数的分类和三种调用方式

#include <iostream>

using namespace std;

/**
 * 构造函数的分类
 * 按照参数个数分类
 * 1,无参构造函数
 * 2,有参构造函数
 * 按照类型分类
 * 1,普通构造函数
 * 2,拷贝构造函数
 */
class Person{
public:
    /**
     * 无参构造函数
     */
    Person(){
        cout << "Person类的无参构造函数调用" <<endl;
    }

    /**
     * 有参构造函数
     * @param age
     */
    Person(int age){
        cout << "Person类的有参构造函数调用" <<endl;
        this->age = age;
    }

    /**
     * 拷贝构造函数
     * 定义拷贝构造函数的格式
     * 类名(const 类名& 对象名){
     * }
     * @param person
     */
    Person(const Person& person){
        cout << "Person类的拷贝参构造函数调用" <<endl;
        age = person.age;
    }

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

    /**
     * 获取年龄
     * @return 返回年龄
     */
    int getAge(){
        return age;
    }

private:
    int age;
};

/**
 * 使用括号法调用构造函数
 * 语法:
 * 类名 变量名(参数列表);
 */
void test1(){
    Person p1;
    Person p2(10);
    Person p3(p2);
    cout << "The age of Person p2 is " << p2.getAge() << endl;
    cout << "The age of Person p3 is " << p3.getAge() << endl;
}

/**
 * 使用括号法调用无参构造函数
 * 注意事项: 不要再变量名后加()
 * 否则编译器会认为该语句是在函数内声明函数 返回类型值为Person, 函数名为变量名, 参数列表为空
 * @return
 */
void test2(){
    Person p();
}

/**
 * 使用显式法调用构造函数
 * 格式
 * 类名 对象名 = 类名(参数列表);
 */
void test3(){
    Person p1 = Person();
    Person p2 = Person(10);
    Person p3 = Person(p2);
}

/**
 * 使用显式法调用构造函数创建匿名对象, 在构造完成后, 编译器会立即销毁匿名对象
 * 语法:
 * 类名(参数列表);
 * 注意事项:不要使用拷贝构造函数生成匿名对象, 如"类名(对象名);", 编译器会将该语句优化为"类名 对象名", 即导致重新定义对象
 */
void test4(){
    Person();
    Person(10);
    Person p1(10);
//    Person(p1);
    //error:Redefinition of 'p1'
}

/**
 * 使用隐式法调用构造函数(应该只能调用只含一个参数的构造函数, 包括拷贝构造函数)
 * 语法
 * 类名 对象名 = 某个参数
 * 编译器会自动将如上语句转化为 类名 对象名 = 类名(某个参数);
 */
void test5(){
    Person p1 = 10;
    Person p2 = p1;
}

int main() {
//    test1();
//    test2();
    //output:
    //
//    test3();
//    test4();
    test5();
    system("pause");

    return 0;
}

 

posted @ 2020-08-09 16:27  DNoSay  阅读(374)  评论(0编辑  收藏  举报