调用C++中的构造函数
Calling constructor in C++
我有和这篇文章基本相同的问题,但当我去测试最高答案时,我没有得到预期的结果。
我有以下课程:
class Test
{
public:
Test()
{
std::cout << "default constructor" << std::endl;
}
Test(const Test &other)
{
std::cout << "copy constructor" << std::endl;
}
Test& operator=(const Test &other)
{
std::cout << "assignment operator" << std::endl;
return *this;
}
~Test()
{
std::cout << "destructor" << std::endl;
}
};
只是为了跟踪调用了哪些构造函数。然后我主要有以下代码:
Test t1 = Test();
根据链接帖子中的答案,我预计会有四行输出:一行用于默认构建临时对象,一行用于复制,还有两个析构函数调用:一个用于销毁临时对象,另一行用于t1。然而,我只得到了两行:"default constructor"answers"destructor",可能都是在退出main()后为t1指定的。有人能详细解释一下发生了什么吗?有人能解释一下为什么这里使用赋值运算符吗?难道它不应该期望一个左值(因为它需要一个左值ref),而临时对象是一个右值吗?
C++不必在实际不需要时调用构造函数。在您的情况下,它知道对象是用右边的调用结果创建的,所以它跳过中间步骤。
通过添加-fno-elide构造函数标志,您可以看到您期望的结果,但在实践中永远不应该这样做。
http://en.cppreference.com/w/cpp/language/copy_elision
现场观看:http://melpon.org/wandbox/permlink/OoxFy1dV6LB3QDbH
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为