1,构造函数只能调用一次
析构函数调用顺序和,构造函数调用顺序相反,谁先被构造,最后被析构
函数中定义的局部类 会在函数执行完毕后,析构
1 void func(Test t) //Test t = test1::t1; //会调用局部变量t的拷贝构造函数 2 { 3 cout << "func begin..." << endl; 4 t.printT(); 5 cout << "func end..." << endl; 6 7 } 8 25 //场景四 26 Test func2() 27 { 28 cout << "func2 begin..." << endl; 29 Test temp(10, 20); //调用temp的带参数构造函数 30 cout << "func2 end.." << endl; 31 return temp; // 有一个临时的匿名对象 = temp ,把temp的数据给到了临时的匿名对象, ,会调用这个临时匿名 32 //对象的拷贝构造函数, 将temp穿进去。 33 } 34 35 void test4() 36 { 37 cout << "test4 begin " << endl; 38 func2(); 39 40 //匿名对象在此被析构了, 如果一个临时的匿名对象,没有任何变量去接收它,编译器认为这个临时匿名对象没有用处。 41 //编译器会立刻销毁这个临时的匿名对象 42 cout << "test4 end" << endl; 43 } 44 45 void test5() 46 { 47 cout << "test5 begin ..." << endl; 48 Test t1 = func2();//如果有一个变量去接收这个临时的匿名对象, 编译器认为这个匿名对象转正了,就不会立刻给他销毁。 49 //t1 = 匿名的临时对象 为什么不会发生拷贝构造 50 // 此时的t1 去接收这个匿名的临时对象不是 重新创建一个t1 而是给这个匿名对象起个名字就叫t1 51 //一旦这个匿名对象有了自己的名字,编译器就不会立刻给这个匿名对象销毁了, 52 //就当普通局部变量处理了 53 54 cout << "test5 end..." << endl; 55 56 //在此时析构的t1 57 }
1 void test6() 2 { 3 cout << "test6 begin..." << endl; 4 Test t1; //调用t1的无参数构造函数 5 t1 = func2(); //调用的=号操作符 ,,t1 = 匿名对象。 调用了t1的=号操作符。 6 //此时匿名没有被转正,匿名没有自己的名字, 匿名对象这个内存没有自己的别名, 编译器就会立刻销毁。 7 cout << "test6 end..." << endl; 8 }