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

Jua*_*esa 2 c++ arrays pointers object

我对C++比较陌生,并且很难理解对象的实例化和对象的指针.

这两个声明在内存和使用方面有何区别?:

MyClass obj1;
MyClass *obj2;
Run Code Online (Sandbox Code Playgroud)

而且我遇到的具体问题是我有一个类有一个无符号短数组,如果我这样做,数组的最后一个空格会改变:

MyClass obj;
obj = MyClass("123");
Run Code Online (Sandbox Code Playgroud)

MyClass有两个构造函数,它们将采用一个int,默认情况下将其赋值为零,并将其拼接为3位或更少的部分.而另一个将采用数字的字符串表示并做同样的事情...希望这是有道理的!

如果我宣布它,它运作良好

MyClass obj = MyClass("123123123");
Run Code Online (Sandbox Code Playgroud)

但如果我以另一种方式这样做,那就不行了.为什么?

Mar*_*ork 8

区别:

MyClass  obj1;
MyClass *obj2;
Run Code Online (Sandbox Code Playgroud)

这里obj1是MyClass的一个实例.
而obj2可能会保存MyClass实例的地址.

此外,obj1将由构造函数自动初始化,而obj2默认情况下未初始化(因此指向随机存储器).初始化后,obj2可以采用特殊值NULL,表示它没有指向对象.

obj2 = &obj1;
Run Code Online (Sandbox Code Playgroud)

这里我们将obj2初始化为指向obj1内存中的地址.如果你改变了obj1的任何成员,那么你可以通过obj2查看它们来看到这些变化(但是因为obj2是你需要取消引用的指针).

obj1.plop = 5;

std::cout << obj1.plop << "\n";
std::cout << obj2->plop << "\n";  Should print the same values. 
Run Code Online (Sandbox Code Playgroud)

以下实际上是两件不同的事情:

MyClass obj;
obj = MyClass("123");
Run Code Online (Sandbox Code Playgroud)
  • 第一行用默认构造函数初始化'obj'.
  • 第二行:创建一个用字符串"123"构造的临时对象.创建此临时对象后,将使用赋值运算符将其复制到"obj".如果没有定义赋值运算符,编译器将为您生成一个赋值运算符.如果您的类包含指针,则默认版本可能无法正常工作(在大多数其他情况下,默认赋值运算符应该可以正常工作).

这条线可能有效:

MyClass obj = MyClass("123123123");
Run Code Online (Sandbox Code Playgroud)

因为编译器已将其优化为:

MyClass obj("123123123");
Run Code Online (Sandbox Code Playgroud)