c++ - 析构函数如何在一个简单的程序中工作?
问题描述
我不明白这个程序的输出:
class A {
public :
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
};
A f (A & a) {
return a;
}
int main() {
A a ;
a = f(a);
return 0;
}
我期望
A()
~A()
因为我只创建了一个A
对象:a
。但是,输出是
A()
~A()
~A()
你知道这是为什么吗?
后续问题
好的,所以每当调用 时f
,我都会构造 an 的副本A
,所以我有 1 次调用复制构造函数和 1 次调用析构函数...
现在说我的主要功能是:
int main() {
A a ;
A b = f(a);
cout << "returning 0" << endl;
return 0;
}
我希望输出是
A(),
A(const A &) (for using f(a))
~A() (for deleting temporary f(a))
returning 0
~A() (destroying B)
~A() (destroying A)
但输出是
A()
A(const& A)
returning 0
~A()
~A()
这是为什么 ?
解决方案
您只显式创建了一个对象,但您在这里创建了一个对象:
A f (A & a) { return a ;} //when returning A
当您复制对象以将其从 f 传回时,该副本是由默认的复制构造函数构造的,因为您没有提供一个。如果您将班级更改为:
class A {
public :
A () { cout << "A() " << endl;}
A (const A &) { cout << "A(const &) " << endl;}
~A () { cout << "~A ()" << endl; }
};
您将看到复制构造函数被调用(正如您提供的那样)。
推荐阅读
- c# - 明确排除实体框架核心中的属性
- git - 将git分支信息注入swagger ui info
- python - Gurobi/Python:通过 addVars 添加二进制变量
- python - Python if else time sleep 冻结另一个 else 函数
- css - 如何将短代码(嵌入)添加到 wordpress 的附加 css 中?
- javascript - 如何在父组件中定义的子组件中将函数作为道具访问?
- amazon-web-services - 在 AWS 云上扩展本地 MS Active Directory 的更好方法?
- java - 用于修改 txt 文件内容的 Java 代码将无法正常运行
- django - Django遗留数据库反向关系不起作用
- azure-eventgrid - 事件网格中的 HA 和服务器端地理 DR 选项