C 向构造函数和临时对象的明确调用
c++ explicit call to constructor and temporary object
#include <iostream>
using namespace std;
class Test
{
public:
Test() { cout << "Constructor is executedn"; }
~Test() { cout << "Destructor is executedn"; }
};
int main()
{
Test(); // Explicit call to constructor
return 0;
}
在上面的代码中,我们正在明确调用构造函数,当构造函数明确称为构造函数时,编译器会创建一个无名的临时对象,并立即被破坏。为什么我们需要这个临时对象?
因为构造函数&amp;破坏者具有副作用。他们都打印了东西。
如果他们没有副作用,则编译器可能足够聪明,可以弄清楚它实际上不需要创建临时性,并完全跳过。
您正在使用的功能类型转换符号,Test(...)
,实际上是指从C 98到C 的"创建类型Test
"的临时对象14。因此,根据要求创建临时性,并调用构造函数以初始化对象。它确实是不是的意思是"调用构造函数"。实际上,构造函数的执行永远无法与对象的创建分开。
在C 17中,Test()
是一种序言,因为它被用作丢弃值表达式。在物质化时,创建了临时对象,并调用构造函数。确实,构造函数的执行永远不会与对象的创建分开。
标准(C 14)简要提到了临时对象的某些情况:
1. Binding a reference to a prvalue
2. Returning a prvalue
3. A conversion that creates a prvalue
4. Throwing an exception
5. In some initializations
您可以从Stackoverflow获取prvalue
的描述。我已经从Quora那里收集了情况。
re
&rdquo; 为什么我们需要这个临时对象??
&hellip;我们没有。只要效果是 构造函数和驱动器均已称为副作用。
编译器无法删除构造函数和驱动器副作用,因为标准明确要求它不要删除其构造或破坏具有副作用的本地对象:
c 11§3.7.3/3 basic.std.auto/3 :&rdquo; 如果具有自动存储持续时间的变量具有初始化或具有副作用的破坏者,则不得 在其块结束之前被摧毁,即使它似乎是优化的,也不应将其消除 未使用,除了可以按照12.8中指定的类对象或副本/移动。
中的指定。
相关文章:
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 在函数调用中C++临时对象的生存期
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?
- 为什么我不能直接在临时对象上调用 operator()?
- C 向构造函数和临时对象的明确调用
- 何时在函数调用中发生临时对象的破坏
- 使用临时对象调用构造函数
- 为什么在传递临时对象时不调用复制构造函数
- 何时调用使用"new"创建的临时对象'delete'?
- 将临时对象分配给调用对象
- 为什么不从临时对象中调用move ctor进行构造(运算符+的结果)
- 理解临时对象上下文中的函数调用
- 使用默认构造函数返回临时对象时,Destuctor调用了两次
- 临时对象的生命周期:嵌套函数调用中指向临时向量的迭代器
- 有多少种方法可以生成临时对象/不必要地调用构造函数
- 为什么不调用复制构造函数将临时对象复制到新定义的对象
- 当有额外的括号时,在临时对象上调用用户定义的操作符+出错
- 如何为C++中函数返回的临时对象调用析构函数
- 我可以直接调用operator()而不创建临时对象吗?
- 连续调用临时对象的方法