构造函数的分类及调用(2)
两种分类方式:
1.按参数分为:有参构造和无参构造(默认构造)
2.按类型分为:普通构造和拷贝构造
三种调用方式:
1.括号法
2.显示法
3.隐式转换法
匿名对象的特点:特点:当前行执行结束后,系统会立即回收掉匿名对象
1 #include <iostream> 2 using namespace std; 3 4 class Person 5 { 6 public: 7 //构造函数 8 Person() 9 { 10 cout << "Person默认构造函数的调用" << endl; 11 } 12 13 //有参构造函数 14 Person(int a) 15 { 16 age = a; 17 cout << "Person有参构造函数的调用" << endl; 18 } 19 20 //拷贝构造函数,"拷贝":将**实例化**的所有属性,一字不动(const)的拷贝(引用&)一份 21 Person(const Person &p) 22 { 23 age = p.age; 24 cout << "Person拷贝构造函数的调用" << endl; 25 } 26 27 //析构函数 28 ~Person() 29 { 30 cout << "Person析构函数的调用" << endl; 31 } 32 33 int age; 34 35 }; 36 37 //调用 38 void test_01(void) 39 { 40 //1.括号法 41 //Person p1;//默认构造函数(就是无参构造函数)的调用 42 //Person p2(10);//有参构造函数调用 43 //Person p3(p2);//拷贝构造函数的调用 44 45 //注意事项: 46 //调用默认构造函数时,不要加(),Person p1()无法创建对象,因为编译器把它当作函数的声明,是不会创建对象的 47 48 //cout << "p2的年龄:" << p2.age << endl; 49 //cout << "p3的年龄:" << p3.age << endl;//拷贝p2的所有属性 50 51 //2.显式法 52 //Person p1; 53 //Person p2 = Person(10);//有参构造函数的调用 54 //Person p3 = Person(p2);//拷贝构造函数的调用 55 56 Person(10);//匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象 57 cout << "aaaaa" << endl; 58 59 60 //3.隐式转换法 61 } 62 63 int main(void) 64 { 65 test_01(); 66 67 system("pause"); 68 return 0; 69 }
观察:
结论:匿名对象在执行完之后就立即被释放了!(就立即被析构了~~~~)
1 #include <iostream> 2 using namespace std; 3 4 class Person 5 { 6 public: 7 //构造函数 8 Person() 9 { 10 cout << "Person默认构造函数的调用" << endl; 11 } 12 13 //有参构造函数 14 Person(int a) 15 { 16 age = a; 17 cout << "Person有参构造函数的调用" << endl; 18 } 19 20 //拷贝构造函数,"拷贝":将**实例化**的所有属性,一字不动(const)的拷贝(引用&)一份 21 Person(const Person &p) 22 { 23 age = p.age; 24 cout << "Person拷贝构造函数的调用" << endl; 25 } 26 27 //析构函数 28 ~Person() 29 { 30 cout << "Person析构函数的调用" << endl; 31 } 32 33 int age; 34 35 }; 36 37 //调用 38 void test_01(void) 39 { 40 //1.括号法 41 //Person p1;//默认构造函数(就是无参构造函数)的调用 42 //Person p2(10);//有参构造函数调用 43 //Person p3(p2);//拷贝构造函数的调用 44 45 //注意事项: 46 //调用默认构造函数时,不要加(),Person p1()无法创建对象,因为编译器把它当作函数的声明,是不会创建对象的 47 48 //cout << "p2的年龄:" << p2.age << endl; 49 //cout << "p3的年龄:" << p3.age << endl;//拷贝p2的所有属性 50 51 //2.显式法 52 //Person p1; 53 //Person p2 = Person(10);//有参构造函数的调用 54 //Person p3 = Person(p2);//拷贝构造函数的调用 55 56 //Person(10);//匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象 57 //cout << "aaaaa" << endl; 58 59 //注意事项 60 //不要用拷贝构造函数,初始化匿名对象,编译器会认为Person(p3)==Person p3对象的声明,会报重定义 61 //Person(p3); 62 63 //3.隐式转换法 64 Person p4 = 10;//相当于写了Person p4 = Person(10);有参构造函数的调用 65 Person p5 = p4;//拷贝构造函数的调用 66 } 67 68 int main(void) 69 { 70 test_01(); 71 72 system("pause"); 73 return 0; 74 }