假设我有一个 Student 类的方法:
Student Student::method(Student x)
{
//nothing important
return x;
}
复制构造函数被调用两次,一次是对象 x 作为参数发送时,第二次是从函数返回 x 时。
为什么当我调用此方法时,以及何时类 Student 的析构函数被调用了两次? 调用是这样的:a = b.method(c),其中 a、b 和 c 是 Student 对象。
最佳答案
对于您的示例,a = b.method(c);
,除了复制省略之外,可能会发生三个拷贝。第一个是当 c
对象被复制到函数参数 x
时。第二个是当 x
对象从函数返回时。第三种是将返回值复制到a
对象中。前两个涉及拷贝构造函数,最后一个涉及拷贝赋值运算符,除非你把它改成Student a = b.method(c);
,那样他们都使用拷贝构造函数。
a
、b
和 c
都将在其范围结束时被销毁。对象 x
将在 method
函数结束时被销毁。函数的返回值将在包含它的完整表达式的末尾销毁 - 也就是说,一旦 a = b.method(c);
完成。
但是,并非所有这些复制都必须发生 - 在某些情况下,允许编译器省略或忽略类的复制/移动构造。将首先复制到函数参数中。在尝试复制之前,函数的第二个拷贝将首先被视为移动。此拷贝或移动可能会被省略。从临时返回值到 a
的最终拷贝,如果您使用复制赋值,将会发生,但如果您使用复制构造函数(如 Student a = b.method 中),则可能会被省略(c);
).
关于c++ - 为什么我的析构函数被调用了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14582022/