【发布时间】:2021-10-24 02:39:17
【问题描述】:
C 代码
#include <stdio.h>
typedef struct
{
int a;
}A;
int main()
{
A(); // this line gives error
return 0;
}
输出
Error: Expected identifier or '('
C++ 代码
#include <iostream>
struct A
{
int a;
A()
{
std::cout<<"Ctor-A\n";
}
~A()
{
std::cout<<"Dctor-A\n";
}
};
int main()
{
A(); // creates temporary object and destroyed it
return 0;
}
输出
Ctor-A
Dctor-A
我知道“三法则”,但代码会变得复杂,如果我们不遵守该法则,大多数编译器都不会出错。所以我避免创建一个复制构造函数和一个重载的赋值运算符。
为什么A()/A{} 在 C++ 中创建临时对象,而在 C 中却没有?在 C 中创建临时对象的另一种方法是什么?
【问题讨论】:
-
C 中没有构造函数。
-
结构在 C 中没有构造函数,所以没有什么是临时的。最接近的事情是只做“A a”,你会得到一个分配给 A 的堆栈。
-
@AbhishekMane:好的,这是真的,警告是合理的。表达式结果也没有在 C++ 中使用。
-
@AbhishekMane:C 中没有这样的连接。但是您在 C++ 中使用的语法
A()是函数样式的强制转换/构造函数调用。 C 没有函数风格的强制转换。 -
@BenVoigt:复合文字在 C 中不是临时的。函数定义之外的那些具有静态存储持续时间,而那些内部具有通常的生命周期的自动存储持续时间。 C 中唯一的临时结构是包含数组的非左值结构或联合。这种临时可以由返回这种结构或联合(按值)的函数创建。当包含完整表达式的评估结束时,它的生命周期结束。
标签: c++ c struct constructor temporary-objects