【发布时间】:2020-09-18 15:38:28
【问题描述】:
使用 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 行在幕后做什么吗?它会创建一个全新的对象吗?
【问题讨论】:
-
很好的问题,因为您已经强调了新手对 C++ 的一个非常重要的误解。
Person person2 = person1;复制一个人对象。 person1 和 person2 绝对不是指同一个对象。它们是不同(但相等)的对象。我确实感到惊讶的是,如此多的新手假设相反。除了可能使用其他语言的经验之外,我能想到的这种假设没有任何根据。 -
如果您能够清楚地了解复制引用和复制值之间的区别,那么您将克服新手在理解 C++ 时遇到的许多问题。
-
@john-我也是 C++ 新手,并且来自 Java 背景,所以有点困惑。并感谢您欣赏我的问题:)
-
@john - 更公平的说法是,当新手之前学习过一些其他语言时,他们对 C++ 有误解。我遇到过不少人将 C++ 作为他们的第一语言来学习,他们中没有人有过这样的误解。其他一些语言,如 Java、Eiffel(不胜枚举)默认引用语义,我还没有遇到一个对 C++ 有“误解”的人,他没有这些语言的背景,只是假设没有检查 C++ 是否可以作为他们以前学过的语言来工作
-
@Peter 我的观点基于我在这里看到的问题,不幸的是新手通常不会解释自己,但我认为这种误解比你建议的要普遍。我并不是说新手有一个连贯的理解,只是碰巧是错误的(但 Karan 似乎是一个例外),而是他们对复制的实际含义、价值或参考感到困惑。新手通常对此没有一致的想法。
标签: c++ class c++17 dynamic-memory-allocation copy-constructor