我是 C++ 的新手,很难理解对象的实例化和指向对象的指针。
这两个声明在内存和使用方面有什么区别? :
MyClass obj1;
MyClass *obj2;
而且我遇到的具体问题是我有一个类,它有一个无符号短数组,如果我这样做,数组的最后一个空间会改变:
MyClass obj;
obj = MyClass("123");
MyClass 有两个构造函数,其中一个接受一个 int,默认情况下会将其赋值为零,并将其拼接为 3 位或更少的数字。另一个将采用数字的字符串表示并执行相同的操作...希望这是有道理的!
如果我声明它会很好用
MyClass obj = MyClass("123123123");
但如果我以其他方式进行,则不会。为什么?
最佳答案
区别:
MyClass obj1;
MyClass *obj2;
这里 obj1 是 MyClass 的一个实例。
而 obj2 可能持有 MyClass 实例的地址。
此外,obj1 将由构造函数自动初始化,而 obj2 默认不初始化(因此指向随机内存)。一旦初始化 obj2 可能会取特殊值 NULL,这表明它没有指向一个对象。
obj2 = &obj1;
这里我们初始化obj2指向obj1在内存中的地址。如果您更改了 obj1 的任何成员,那么您可以通过 obj2 查看它们来查看更改(但因为 obj2 是一个指针,您需要取消引用)。
obj1.plop = 5;
std::cout << obj1.plop << "\n";
std::cout << obj2->plop << "\n"; Should print the same values.
下面其实是两个不同的东西:
MyClass obj;
obj = MyClass("123");
- 第一行使用默认构造函数初始化“obj”。
- 第二行:创建一个用字符串“123”构造的临时对象。创建此临时对象后,使用赋值运算符将其复制到“obj”上。如果您没有定义赋值运算符,编译器会为您生成一个。如果您的类包含指针,则默认版本可能无法正常工作(在大多数其他情况下,默认赋值运算符应该可以正常工作)。
这条线可能有效:
MyClass obj = MyClass("123123123");
因为编译器已经将其优化为:
MyClass obj("123123123");
关于C++问题初始化一个对象两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/821667/