繁体   English   中英

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

[英]Creating a C++ object with and without new keyword

使用新关键字创建 object:

#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;
}

Output:

Karan  
Karan

创建没有新关键字的 object:

#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;
}

Output:

Rajat  
Karan  

我预计 output 是“Karan Karan”,正如我在Person person2 = person1中所想的那样, person2指的是同一个person1 但事实并非如此。

有人可以解释一下Person person2 = person1在幕后做了什么吗? 它会创建一个全新的 object 吗?

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

第一个案例

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

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

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

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

是这样吗??

不! 基本上它只改变了它指向的 object。 因此对于一个 object。 事实上,从来没有两个对象,从来没有创建过两个对象。 它是由两个指针指向的同一个 object。

在第二种情况下

  • 您创建了 object 和 object(不是指向对象的指针)并存储在变量person1中。

     +--------------------------+ | Person Object (Person 1) | | name = Karan | | | +--------------------------+
  • 现在,当您分配person2 = person1时,这里涉及到一个称为Copy 构造函数的东西。

  • 它为person2创建另一个 object ,将person2 person1

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

因此,这里我们有两个独立的对象。

  • 当您将值更改为 1 时,该值仅更改为 1,即您实际想要更改的值。 而另一个独立的 object 和之前一样。

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

在第一个片段中,您有两个指针指向两个相同的 object,这很危险,因此使用两个指针中的任何一个进行更改时,您都会更改相同的 object。 请注意,您只创建了一个 object。

Person *person2 = person1;

上一行创建了一个新指针,指向指针 person1 所指向的同一个person1

在第二个片段中,您创建了person2 object ,它与person1不同,但name数据成员具有相同的值(因为您使用了复制 ctor),然后您更改了person2 name的值,因此两个不同名字。

Person person2 = person1;

上一行使用复制参与者创建了一个新的 object,因此数据成员具有相同的值。

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

在第二个中,您进行了复制初始化,并在这里创建了两个不同的对象。

Person person2 = person1;

因此,您在设置它们后会有不同的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM