在c++中查找对象的未初始化属性

Looking into an uninitialized property of an Object in c++

本文关键字:初始化 属性 对象 c++ 查找      更新时间:2023-10-16

嘿,伙计们,我想知道控制台在C++中的这个简单代码中会显示什么

using namespace std;
class Tier {
public:
    string name;
};
int main()
{
    Tier Affe;
    cout << Affe.name << endl;
}

我来自C#,知道会抛出一个"null"-错误。但是在C++中,控制台什么也不显示。调试时,属性为"。

这是否意味着属性"name"被引用到一个null指针?考虑从类"Tier"创建一个对象,会分配与类大小相同的内存。因此,对象的属性"name"也将在内存中分配。

为什么调试器显示"。在我的观点中,应该有一些随机数据,这些数据之前在内存部分。。。

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

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

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

因此,只有一条空行(来自std::endl的新行)

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

Affe.name = "foo";

则将发生分配、将分配足够的存储器来存储"foo"和空终止符。

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

class TierContainingPointer {
public:
    string* name;
};

注意*。创建一个TierContainingPointer实例会留下一个"名称",指向任何有用的东西,正如您所想象的那样。

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

啊,为了解决这个问题的剩余部分(尽管另一个答案已经完成了):当Tier内部的"name"实例被创建时(在Tier自己的创建过程中),它的默认构造函数被运行。字符串类的默认构造函数会留下存储文本"的字符串。