c++ - 创建带有和不带有 new 关键字的 C++ 对象

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

使用 new 关键字创建对象:

#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

创建一个没有 new 关键字的对象:

#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这行在幕后做了什么?它会创建一个全新的对象吗?

最佳答案

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

第一种情况

  • 在使用 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 时,这里涉及到一个叫做 Copy constructor 的东西。

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

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

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

  • 当您将值更改为 1 时,该值仅更改为 1,即您真正想要更改的值。另一个独立的对象和之前一样。

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

关于c++ - 创建带有和不带有 new 关键字的 C++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62113549/

相关文章:

c++ - 我们也可以从客户端套接字启用 keepalive 吗?

c++ - 对多字节 native 类型进行按字节操作

c++ - 如何共享运营商返回的数据

c++ - 主对话框在命令消息处理程序返回之前销毁

c++ - 在 qt 4.8.6 中打开模态窗口

javascript - 如何转换 JavaScript 对象以从 C++ 访问其数据?

c++ - 什么是访问说明符?我应该以私有(private)、 protected 还是公共(public)继承?

python - 将类 init 作为列表对象或标准对象

r - 在 R 中使用 apply 时丢失类信息

c++ - std::make_array<size_t> 来自 signed int