C++ 对象实例化

标签 c++ c++11 default-constructor

<分区>

这个问题是关于 C++ 中的对象实例化的。有几种方法可以在堆上和堆栈上实例化对象,我很想知道其中的细微差别。

using namespace std;

class Raisin
{
private:
    int x;
public:
    Raisin():x(3){}
    Raisin(int input):x(input){}
    void printValue()
    {
       cout<< "hey my Deliciousness is: " << x <<endl;
    }
};

基本上 Raisin 是我用于此演示的一个简单类:

int main()
{

Raisin * a= new Raisin;
a->printValue();

Raisin * b= new Raisin{};
b->printValue();

Raisin * c= new Raisin();
c->printValue();

Raisin x;
x.printValue();

Raisin y{};
y.printValue();

Raisin z();
z.printValue(); 
//error: request for member 'printValue' in 'z', 
//which is of non-class type 'Raisin()'


Raisin alpha(12);
alpha.printValue();

Raisin omega{12};
omega.printValue();

return 0;
}

我想知道为什么Raisin * c可以用空括号实例化,但是Raisin z不能。 (实际上 Raisin z() 是合法但不正确的)

我还了解到 Raisin (2)Raisin{2} 之间存在细微差别。如果有人能阐明这些特质,我将不胜感激。

最佳答案

这一行

Raisin z();

声明一个函数(不带参数)返回一个 Raisin 对象,而不是默认构造的 Raisin

关于C++ 对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34658303/

相关文章:

c++ - 如何在 c++11/c++14 中定义一个以枚举为键、以整数为值的映射?

c++ - 使用 2D Vector (std::vector) 在 C++ 中查找重复项

c++ - 在 C++ winsock 中处理多个客户端的方法

c# - 如何防止调用结构的默认构造函数?

c++ - VS2017不会将其他包含目录复制到远程环境(Linux),从而导致编译错误

c++ - 如何以优雅的方式将 vector 复制到STL中的 map

c++ - 使用 boost::serialization 跳过层次继承中的中间类

c++ - Gtk::Notebook 不显示

c++ - 为什么在堆中创建对象或堆栈中的临时对象时,隐式构造函数将结构中的 POD 初始化为零?

java - 为什么在实例化Object时需要在具有Parameterized Constructor的POJO文件中声明Default constructor?