时间:2022-12-15 10:31:29 | 栏目:C代码 | 点击:次
下面的程序输出什么?为什么?
下面编写程序进行实验:
#include <stdio.h> class Test { int mi; public: Test(int i) { mi = i; } Test() { Test(0); } void print() { printf("mi = %d\n", mi); } }; int main() { Test t; t.print(); return 0; }
输出结果如下:
程序意图:
运行结果:
构造函数是一个特殊的函数
可以将上面代码写成这样,避免临时对象:
#include <stdio.h> class Test { int mi; void init(int i) { mi = i; } public: Test(int i) { init(i); } Test() { init(0); } void print() { printf("mi = %d\n", mi); } }; int main() { Test t; t.print(); return 0; }
输出结果如下:
再来看一个程序,深刻体会一下临时对象:
#include <stdio.h> class Test { int mi; void init(int i) { mi = i; } public: Test(int i) { printf("Test(int i)\n"); init(i); } Test() { printf("Test()\n"); init(0); } void print() { printf("mi = %d\n", mi); } ~Test() { printf("~Test()\n"); } }; int main() { printf("main begin\n"); Test(); Test(10); printf("main end\n"); return 0; }
输出结果如下:
这个程序很好的说明了临时对象的生命周期只有一条语句的时间(过了这条 C++ 语句,临时对象将被析构而不复存在)
现代 C++ 编译器在不影响最终执行结果的前提下,会尽力减少临时对象的产生!!!
下面来看一个例子:
#include <stdio.h> class Test { int mi; public: Test(int i) { printf("Test(int i) : %d\n", i); mi = i; } Test(const Test& t) { printf("Test(const Test& t) : %d\n", t.mi); mi = t.mi; } Test() { printf("Test()\n"); mi = 0; } int print() { printf("mi = %d\n", mi); } ~Test() { printf("~Test()\n"); } }; Test func() { return Test(20); } int main() { //Test t(10); 等价于 Test t = Test(10); Test t = Test(10); // ==> Test t = 10; Test tt = func(); // ==> Test tt = Test(20); ==> Test tt = 20; t.print(); tt.print(); return 0; }
输出结果如下:
注意两点: