#include <iostream> using namespace std; class MyClass{ int val; public: MyClass(int i){ val=i; cout<<"构造函数!\n"; } MyClass(const MyClass &p){ val=p.val; cout<<"拷贝构造函数!\n"; } ~MyClass(){ cout<<"**析构函数\n";} int getval(){ return val;} MyClass MkBigger(){ MyClass o(val*2); //正常构造 return o; //局部变量返回时,复制构造 } }; void display(MyClass ob){ //值传递:发生1次复制构造 cout<<"val="<<ob.getval()<<endl; } int main(){ MyClass a(10); //正常构造 cout<<"调用display()之前.\n"; display(a); cout<<endl; a=a.MkBigger(); cout<<"调用MkBigger()之后.\n"; display(a); cout<<"第2次调用display()之后.\n"; cout<<endl; }怎么输出的,为什么怎么输出
时间: 2024-04-26 15:27:11 浏览: 150
使用include <iostream>时一定要加using namespace std
这段代码的输出结果和上一段代码的输出结果是一样的。输出结果为:
构造函数!
调用display()之前.
拷贝构造函数!
val=10
**析构函数
构造函数!
拷贝构造函数!
**析构函数
调用MkBigger()之后.
拷贝构造函数!
val=20
**析构函数
第2次调用display()之后.
**析构函数
**析构函数
这是因为程序中使用了值传递的方式来传递 MyClass 对象,这会导致复制构造函数被调用。在调用 display() 函数时,会发生一次复制构造,因此会输出一次拷贝构造函数的信息。在调用 MkBigger() 函数时,由于局部变量 o 是在函数内部创建的,因此在返回时会发生一次复制构造,也会输出一次拷贝构造函数的信息。
阅读全文