【问题标题】:Instantiate class with or without parentheses? [duplicate]实例化带或不带括号的类? [复制]
【发布时间】:2023-03-03 20:55:01
【问题描述】:
#include <iostream>
using namespace std;

class CTest 
{
    int x;

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

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

  return 0;
}

CTest t1 当然会打印“A”。

但是在 t2() 似乎什么也没发生,但代码运行良好。

那么我们是否使用那些没有参数的括号?或者为什么我们可以这样使用它?

【问题讨论】:

  • 在 C++ 中是 the most vexing parse
  • @PeterWood:我个人对此持异议。从历史上看,“最令人头疼的解析”仅指在初始化器出现歧义的情况下,初始化器是一个临时初始化的值,例如CTest t2(CTest()); 而不是这种更简单的情况。
  • @CharlesBailey 'related to the most vexing parse' 会是一个更好的表达方式。谢谢。

标签: c++ constructor


【解决方案1】:

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

CTest t1;

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

CTest t2();

不是变量声明,而是一个名为 t2 的函数的本地原型,它不接受任何参数并返回 CTestt2 没有调用构造函数的原因是这里没有创建对象。

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

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

CTest t2{};

实际上调用了默认构造函数。

希望这会有所帮助!

【讨论】:

  • 你应该注意CTest t1; CTest t2 = CTest();之间的区别
猜你喜欢
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-05
相关资源
最近更新 更多