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; }
路漫漫其修远兮,吾将上下而求索。