C++问题初始化一个对象两次

标签 c++ arrays pointers object

我是 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/

相关文章:

c++ - 遍历指向类的指针 vector

c - 将二维数组保存在指针数组中

C 结构体分配给结构体数组

c++ - Python 和 C 语言的服务器和客户端

c++ - 如何编写 Lambda 包装具有可选返回值的函数

Javascript 无法推送到函数内部的全局数组

javascript - 我如何在一系列百分比上最佳地分配值?

arrays - 引用 Delphi 变体数组而不进行复制

c++ - 双*数组,与双*指针

c++ - HTTP 流 : what realizations of Push Technology are available?