在C++中构造对象的不同方法

lur*_*rks 13 c++ constructor instantiation

我想使用C++在堆栈中构造一个对象.你知道这些与调用构造函数的方法有什么区别(有和没有括号):

一个) MyClass object ;

b) MyClass object() ;

我正在使用MFC,当为主应用程序构造全局变量时,如果我使用后一种方式,我得到一个例外,我认为这两种方式是等价的.

谢谢你们的任何信息.

Leo*_*Hat 24

这是C++的难点之一.

MyClass object();
Run Code Online (Sandbox Code Playgroud)

是在C++中定义函数原型的方式,因此编译器认为您正在尝试在另一个函数的中间声明另一个函数.

如果要调用默认构造函数(即不带参数的构造函数),请改用以下语法:

MyClass object;
Run Code Online (Sandbox Code Playgroud)

另见Garth Gilmour对现已删除的问题的回答你最喜欢的语法是什么?:

在C++中

Employee e1("Dave","IT"); //OK
Employee e2("Jane"); //OK
Employee e3(); //ERROR - function prototype
Run Code Online (Sandbox Code Playgroud)

  • C++中的`()`初始化程序不一定是默认构造函数的调用.`()`initializer执行值初始化,它不等同于默认的构造函数调用,即最后一个表单(没有`()`)不等于第一个表达式中表达的意图.解决"原型"问题的正确方法是使用复制初始化语法`MyClass object = MyClass()`,并希望编译器将其转换为高效代码. (2认同)

cpx*_*cpx 9

例如:

class MyClass
{
   public:
   MyClass()
   {x = 0;}
   MyClass(int X)
   {x = X;}
   private:
   int x;
};

int main()
{
   MyClass myObject(56); // initialize x to value '56'
   MyClass myObject2; //calls default constructor and initializes x to 0
   return 0;
}
Run Code Online (Sandbox Code Playgroud)