在c ++中查看Object的未初始化属性

时间:2016-01-13 19:09:32

标签: c++ class properties

Hey Guys我想知道控制台在这个简单的C ++代码中会显示什么

using namespace std;

class Tier {
public:
    string name;
};

int main()
{
    Tier Affe;
    cout << Affe.name << endl;
}

我来自C#并且知道会抛出“null”-Error。但在C ++中,控制台没有显示任何内容。调试属性时是“”。

这是否意味着属性“name”被引用为nullpointer? 考虑从类“Tier”创建对象,将分配具有类大小的内存。因此,对象的属性“名称”也将在内存中分配。

为什么调试器会显示“”。在我的意见中应该是一些随机数据,这是在...之前的内存部分。

2 个答案:

答案 0 :(得分:5)

它将为空,因为std::endl的默认构造函数是构造一个空字符串

请参阅此处的构造函数1:http://en.cppreference.com/w/cpp/string/basic_string/basic_string

  

1)默认构造函数。构造空字符串(零大小和   未指明的容量)

因此,只有一个空行(来自Affe.name = "foo"; 的新行)

如果您稍后为字符串成员分配值

"foo"

然后会发生分配,有足够的内存来存储G++ 5.3.0 C++0X ENABLED,并且会分配一个空终止符。

答案 1 :(得分:2)

这里没有“null”错误或类似错误,因为什么都不是null。在C#中,您的Affe.name将是指向某事物(或什么都不是)的指针。在C ++中,它不是指针。这是一个价值。要使它成为指针,您需要特别声明它:

class TierContainingPointer {
public:
    string* name;
};

注意*。创建一个TierContainingPointer实例会给你留下一个“名字”,指向没有用的东西,正如你想象的那样。

但是创建Tier的实例会为您提供一个完整的字符串对象,该对象在Tier对象中具有自己的成员。您可以想象Tier包含指向字符串的指针,而Tier包含字符串的实际成员数据。该字符串嵌入在层中(尽管一个或多个字符串类'自己的成员可能是指针本身)。

啊,并解决问题的其余部分(虽然另一个答案已经完成):当创建Tier中的“name”实例时(在Tier自己创建的过程中),运行其默认构造函数。字符串类的默认构造函数离开存储文本“”的字符串。