使用括号还是不使用括号实例化类?

bal*_*nta 7 c++ constructor

#include <iostream>
using namespace std;

class CTest 
{
    int x;

  public:
    CTest()
    { 
       x = 3;
       cout << "A"; 
    }
};

int main () {
  CTest t1;
  CTest t2();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

CTest t1当然会打印"A".

但似乎没有任何事情发生在t2(),但代码运行良好.

那么我们在没有参数的情况下使用这些括号吗?或者为什么我们这样使用呢?

tem*_*def 19

这是C++语法的一个怪癖.这条线

CTest t1;
Run Code Online (Sandbox Code Playgroud)

声明一个CTest名为的类型的局部变量t1.它隐式调用默认构造函数.另一方面,线

CTest t2();
Run Code Online (Sandbox Code Playgroud)

不是一个变量声明,但被调用函数的局部样机t2,它没有参数和返回CTest.不需要构造函数的原因t2是因为这里没有创建对象.

如果要声明对象类型的局部变量并使用默认构造函数,则应省略括号.

在C++ 11中,您也可以说

CTest t2{};
Run Code Online (Sandbox Code Playgroud)

哪个实际上调用默认构造函数.

希望这可以帮助!

  • 你应该注意`CTest t1; CTest t2 = CTest();` (8认同)
  • @starriet:`CTest t1;`如上所述。`CTest t2 = CTest();` 显式使用默认构造函数(而不是如上所述的前向声明)的正确方法(2012 年)。现在是 2022 年“CTest t2{};” (2认同)