这怎么可能在c ++中使用?

nih*_*har 17 c++ class variable-initialization function-declaration

  1. 令我惊讶的是,我发现c ++对象的名称可以与类名相同.有人可以向我解释原因吗?
  2. 当我宣布类的对象aa a1(),它不会引发错误,但不会调用构造函数.为什么会这样?

我的代码:

#include<iostream>
using namespace std;

class a 
{
    public:
    a() 
    {
        cout << "in a\n";
    }
};

int main()
{
    a a1();
    a a;
}
Run Code Online (Sandbox Code Playgroud)

aar*_*man 21

当你编写a a1();它实际上被解析为函数声明而不是对默认构造函数的调用.

a a1;

将正确调用默认构造函数

当你编写a a;它时,因为变量名在所谓的名称隐藏中优先于类名,但是即使它起作用,它只会导致混淆,我会避免这样做.

对于那些喜欢标准报价的人来说,你去吧

类名(9.1)或枚举名(7.2)可以通过在同一范围内声明的变量,数据成员,函数或枚举器的名称隐藏.如果类或枚举名称和变量,数据成员,函数或枚举器在同一作用域(按任何顺序)中声明具有相同名称,则类或枚举名称将隐藏在变量,数据成员,函数或枚举器名称可见.

  • "是的,它有效......"不是解释.我原以为这样:变量`a`的本地定义隐藏了类型名称,以避免干扰外部(包含)名称. (2认同)
  • 我没有说引用标准(虽然总是很高兴有一个明确的权威答案).像我评论中的一些推理就足够了. (2认同)

seg*_*ult 8

a a1(); 是一个函数声明.

这是在C++ 11中创建统一初始化的重要原因.要使用C++ 11中的构造函数初始化对象,请使用a a1{};

  • 或者只是`a a1;`. (3认同)