创建带有和不带有新关键字的C ++对象

时间:2020-05-31 08:31:44

标签: c++ class c++17 dynamic-memory-allocation copy-constructor

使用新关键字创建对象:

#include <iostream>
#include <string>

using namespace std;

class Person {
  private:
  string name;

  public:
  Person(string name) {
    setName(name);
  }

  string getName() {
    return this->name;
  }

  void setName(string name) {
    this->name = name;
  }
};

int main() {
  Person *person1 = new Person("Rajat");
  Person *person2 = person1;

  person2->setName("Karan");

  cout << person1->getName() << endl;
  cout << person2->getName() << endl;

  return 0;
}

输出:

Karan  
Karan

创建没有新关键字的对象:

#include <iostream>
#include <string>

using namespace std;

class Person {
  private:
  string name;

  public:
  Person(string name) {
    setName(name);
  }

  string getName() {
    return this->name;
  }

  void setName(string name) {
    this->name = name;
  }
};

int main() {
  Person person1("Rajat");
  Person person2 = person1;

  person2.setName("Karan");

  cout << person1.getName() << endl;
  cout << person2.getName() << endl;

  return 0;
}

输出:

Rajat  
Karan  

我期望输出为“ Karan Karan”,就像我在Person person2 = person1中所想到的那样,person2指向相同的person1。事实并非如此。

有人可以解释一下Person person2 = person1这行是什么吗?它会创建一个全新的对象吗?

3 个答案:

答案 0 :(得分:5)

让我们看看后台发生了什么。

第一种情况

  • new使用new关键字创建了一个对象,并返回了指向该对象的指针。

                               +--------------------------+
           person1 ----------> |    Person Object         |
                               |        name = Rajat      |
                               +--------------------------+
    
  • 然后在另一个指向对象的指针中将 地址 复制到该对象。所以基本上现在两个指针都指向同一个对象。

                               +--------------------------+
           person1 ----------> |    Person Object         |
                               |        name = Rajat      |
           person2-----------> |                          |
                               +--------------------------+
    
  • 现在,您随后使用一个指针更改了name的值,并使用一个指针更改了person1person2的值。

person2->setName("Karan")
                               +--------------------------+
           person1 ----------> |    Person Object         |
                               |        name = Karan      |
           person2-----------> |                          |
                               +--------------------------+

是吗?

否!基本上,它仅更改了它指向的对象。因此对于一个对象。实际上,从来没有两个对象,也从未创建过两个对象。它是由两个指针指向的同一对象。

第二种情况

  • 您创建了一个对象,然后创建了该对象(而不是指向该对象的指针),并将其存储在变量person1中。

                               +--------------------------+
                               | Person Object (Person 1) |
                               |        name = Karan      |
                               |                          |
                               +--------------------------+
    
  • 现在,当您分配person2 = person1时,这里涉及到复制构造函数

  • 它为person2创建另一个对象,将person1中的所有内容复制到person2

                               +--------------------------+
                               | Person Object (Person1)  |
                               |        name = Rajat      |
                               |                          |
                               +--------------------------+
    
                               +--------------------------+
                               | Person Object (Person2)  |
                               |        name = Rajat      |
                               |                          |
                               +--------------------------+
    

因此,这里有两个 independent 对象。

  • 当您将值更改为1时,对于您实际想要更改的值,该值仅更改了一个。还有另一个独立的对象,就像以前一样。

                               +--------------------------+
                               | Person Object (Person1)  |
                               |        name = Rajat      |
                               |                          |
                               +--------------------------+
    
                               +--------------------------+
                               | Person Object (Person2)  |
                               |        name = Karan      |
                               |                          |
                               +--------------------------+
    

答案 1 :(得分:2)

在第一个代码段中,您有两个指针指向两个相同的对象,这很危险,因此,使用两个指针中的任何一个进行更改时,您都将更改同一对象。请注意,您仅创建了一个对象。

Person *person2 = person1;

上一行创建一个新指针,该指针指向指针person1所指向的同一对象

在第二个代码段中,您创建了person2对象,该对象与person1不同,但是对name数据成员具有相同的值(因为您使用了复制ctor),并且那么您已经更改了name的{​​{1}}的值,因此有了两个不同的名称。

person2

上一行使用copy actor创建一个新对象,因此数据成员具有相同的值。

答案 2 :(得分:2)

在第一种情况下,您有指向Person的指针,该指针实际上指向同一动态分配的对象。两个指针,但是没有两个单独的对象。因此,更改名称会同时影响两者。

在第二个中,您做 copy initialization ,并在这里实际上创建了两个不同的对象。

Person person2 = person1;

因此,在设置它们后,您将使用不同的名称。