1

我只是在浏览 C++ 中的基本 OOP 概念,并遇到了以下问题:

class A{
    public:
    int i(20); //line 1
};
int main()
{
  int j(20);
  cout<<j<<endl;
  A obj;
  cout<<obj.i<<endl;
}

编译时出现以下错误line1(在 gcc 和 MSVC++ 中都试过),

expected identifier before numeric constant

我知道如何为 a 分配默认值non-static member(可以从 C++11 开始以不同的方式完成),但我不明白为什么只有这种默认值初始化是不可能的,因为做同样的初始化(对于正常变量)其他任何地方都是有效的。

这种限制的原因可能是什么?

编辑:

从提供的链接和答案来看,这是因为“在某些情况下它可能读作函数声明。由于这种歧义,它是不允许的。”

但考虑以下情况:

//global scope
struct B{
    int j;
};

int B = 10;

int object(B);

这也是一个类似的情况,int object(B)可以理解为一个以函数objectB object参数并带有int返回类型的函数。我试过了gccMSVC++并且对象被视为int variable. 为什么在这种情况下不受限制?

4

1 回答 1

2

使用括号被认为过于混乱,因为它与函数声明非常相似。考虑默认构造函数的情况:

class A{
    public:
        int i();  // function declaration -- did you mean to
                  // use the default constructor instead?
};

不过还有其他方法可以做到:

class A{
    public:
        int i = 20;
        int i{20};
        int i = {20};

};
于 2017-08-12T14:56:16.907 回答