c++中对象的生命周期
Lifetime of objects in c++
class Entity
{
public:
int a;
Entity(int t)
:a(t)
{
std::cout << "Constructor !" << std::endl;
}
~Entity()
{
std::cout << "Destructor !" << std::endl;
}
Entity(Entity& o)
{
std::cout << "Copied !" << std::endl;
this->a = o.a;
}
};
Entity hi()
{
Entity oi(3);
return oi;
}
int main()
{
{
Entity o(1);
o = hi();
}
std::cin.get();
}
输出:
Constructor !
Constructor !
Copied !
Destructor !
Destructor !
Destructor !
我创建了两个对象,我复制了一个,所以三个构造函数和三个析构函数。
输出中的 "Copied!" 行来自复制构造函数,因此您创建了三个对象,而不是两个(然后正如预期的那样,您将销毁所有三个对象)。
请注意,复制构造函数通常应通过 const
引用获取其参数。据推测,您可能正在使用 Microsoft 的 C++ 编译器,它将临时绑定到非常量引用。
另请注意,如果启用优化,您可能会看到只有两个构造函数和两个析构函数,而不会发生复制构造。使用足够新的 (C++17) 编译器,即使您不打开优化也应该发生这种情况(复制省略已成为强制性的)。
这是一个小问题
谁能解释一下三个析构函数的原因?
当你打电话给
o=hi();
你的函数被调用,它生成一个 Entity 类型的对象,在 return 中调用构造函数。
这是您获得一条额外的构造函数消息的地方
替换你的Entity(int t) contructor by this
Entity(int t)
:a(t)
{
std::cout << "Constructor created with integer "<< a << std::endl;
}
您将在 运行 代码中看到调用了哪些构造函数。
class Entity
{
public:
int a;
Entity(int t)
:a(t)
{
std::cout << "Constructor !" << std::endl;
}
~Entity()
{
std::cout << "Destructor !" << std::endl;
}
Entity(Entity& o)
{
std::cout << "Copied !" << std::endl;
this->a = o.a;
}
};
Entity hi()
{
Entity oi(3);
return oi;
}
int main()
{
{
Entity o(1);
o = hi();
}
std::cin.get();
}
输出:
Constructor !
Constructor !
Copied !
Destructor !
Destructor !
Destructor !
我创建了两个对象,我复制了一个,所以三个构造函数和三个析构函数。
输出中的 "Copied!" 行来自复制构造函数,因此您创建了三个对象,而不是两个(然后正如预期的那样,您将销毁所有三个对象)。
请注意,复制构造函数通常应通过 const
引用获取其参数。据推测,您可能正在使用 Microsoft 的 C++ 编译器,它将临时绑定到非常量引用。
另请注意,如果启用优化,您可能会看到只有两个构造函数和两个析构函数,而不会发生复制构造。使用足够新的 (C++17) 编译器,即使您不打开优化也应该发生这种情况(复制省略已成为强制性的)。
这是一个小问题
谁能解释一下三个析构函数的原因?
当你打电话给
o=hi();
你的函数被调用,它生成一个 Entity 类型的对象,在 return 中调用构造函数。 这是您获得一条额外的构造函数消息的地方
替换你的Entity(int t) contructor by this
Entity(int t)
:a(t)
{
std::cout << "Constructor created with integer "<< a << std::endl;
}
您将在 运行 代码中看到调用了哪些构造函数。