在c++中查找对象的未初始化属性
Looking into an uninitialized property of an Object in c++
嘿,伙计们,我想知道控制台在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自己的创建过程中),它的默认构造函数被运行。字符串类的默认构造函数会留下存储文本"的字符串。
- 类的C++属性似乎已重新初始化
- 我的子类的属性是延迟初始化的
- 如何在不知道属性具有哪些构造函数的情况下初始化属性?
- boost::spirit指针属性是用nullptr初始化的吗?
- C++ 中常量属性的初始化构造函数错误
- 在构造函数 c++ 中初始化属性时出现问题
- 初始化类C++私有属性(值/引用/静态)
- 为什么结构属性声明和初始化顺序的行为是这样的?
- 程序在没有输入的情况下退出,它有基本的,驱动的类属性初始化问题
- 提升捆绑属性:是否需要初始化每个边的所有属性?
- 当我初始化了指针属性 allready 时,如何将 QGraphicsItem 向下投射到创建的类?
- 使初始化变量可供多个属性初始化方法访问
- 如何在C++中初始化孙子的祖父母(const)属性?
- 如果第二个属性未支撑,则将与支撑初始化器配对缩小转换
- 组合框初始化错误:无法读取未定义的属性'constructor'
- 正在使用std::string初始化istream属性
- QObject 自定义属性何时从样式表中指定的值初始化
- 在c++中查找对象的未初始化属性
- 类初始化-属性没有默认构造函数
- 错误C2512:没有合适的默认构造函数可用-如果在构造函数中初始化属性,为什么