【问题标题】:What does A a() mean? [duplicate]A a() 是什么意思? [复制]
【发布时间】:2021-09-18 00:20:31
【问题描述】:

考虑这段代码:

#include<iostream>
using namespace std;

class A
{
    public:
    A():age(12){}
    int age;
};

int main()
{
    A a();
    cout << a.age << endl;
    return 0;
}

当我使用 g++ 编译它时,我得到一个错误:

看不到成员年龄,因为a不是A类()

谁能给我解释一下?什么是A a()

【问题讨论】:

  • 我宁愿认为这不是 g++ 给你的错误......

标签: c++


【解决方案1】:

这一行

A a();

声明一个名为a 的函数,返回不带参数的A。 (见Most vexing parse)。

你想要的是

A a = A(); // value-initialization
A a{}; // the same but only valid in C++11 (and currently not supported by MSVS)

A a; // default initialization

C++11,§8.5/10

注意:由于初始化器的语法不允许 (),

X a();

不是类 X 的值初始化对象的声明,而是一个不带参数并返回 X 的函数的声明。

对于您的课程,值初始化 == 默认初始化(至少对于结果而言)。 在此处查看我的答案:C++: initialization of int variables by an implicit constructor 了解有关 POD 或内置类型的值初始化与默认初始化的信息。

【讨论】:

  • 呃,为什么不直接A a;
  • 因为新手经常尝试使用上述语法A a(); 在堆栈上初始化一个新对象,希望调用默认构造函数。不幸的是,这会造成混乱。
  • @GManNickG:谢谢。在这种情况下,A a;A a(A()); 相同,但如果 A 是 POD,则第一个表示未初始化的成员,第二个表示零初始化的成员。我刚刚添加了如何进行值初始化。但在这种情况下,默认初始化至少具有相同的结果(可能成本更低)。
  • void who_would_ever_use_this() { void syntax(); } void syntax() {}
  • 为什么没有人抱怨我的第二个例子仍然是一个最令人烦恼的解析?无论如何...删除:)
【解决方案2】:

它定义了一个名为a 的函数,它返回一个A 类型的对象。这被称为“最令人头疼的解析”。

【讨论】:

  • +1 表示非常正确的正式术语。
  • 这不是最麻烦的解析。这只是令人烦恼。 MVP 是A x(A());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 2021-03-31
  • 2011-04-16
  • 2020-10-04
  • 1970-01-01
  • 2019-02-05
相关资源
最近更新 更多