我想知道在将匿名对象临时分配给命名对象时内部发生了什么:
#include <iostream>
class Object {
public:
Object (void) {
this->PrintAddress();
}
Object (const Object& another_object) {
std::cout << "Copy constructor is called!\n";
}
~Object (void) noexcept {}
void PrintAddress (void) const {
std::cout << "Object Address: " << this << '\n';
}
};
int main (int arg_count, char* arg_vector[]) {
// The following line:
Object object = Object();
object.PrintAddress();
return 0;
}
编译并执行生成的二进制文件表明未调用复制构造函数,并且命名对象(&#39; object&#39;)和RHS临时文件具有相同的地址,这意味着它们是同一个对象。我不知何故感觉编译器将临时名称与名称相关联,因此为什么没有执行构造函数(除了在创建临时RHS时)。为了更好地了解这一点,请查看以下内容:
Object object (Object()); // Line 1
object.PrintAddress() // Line 2
请注意,尽管第1行与执行复制构造函数的对象具有相同的语法,但它的语法也类似于函数指针。注释第2行不会影响程序编译的能力,但是取消注释第2行(假设我刚创建了一个Object命名对象)会产生编译错误(可能是因为你无法在函数上执行成员函数)指针)。
很抱歉,如果这拖延了太长时间,但是当你这样做时内部会发生什么?
感谢您的时间!