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”创建对象,将分配具有类大小的内存。因此,对象的属性“名称”也将在内存中分配。
为什么调试器会显示“”。在我的意见中应该是一些随机数据,这是在...之前的内存部分。
答案 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自己创建的过程中),运行其默认构造函数。字符串类的默认构造函数离开存储文本“”的字符串。