我正在学习来自java背景的c ++,据我所知,在Java中,一切都是隐含的指针(原始类型除外),所以当我想使用一个在已经分配之间跳转的变量时,我一直在使用指针类的实例。 我想知道的是当你做这样的事情时会发生什么:
class Thing1{
public:
Thing1() {n = 10;}
int n;
}
Thing1 A; // Creates an instance of Thing1
Thing1 B = A; // What happens here???
B.n = 5;
A.n = 16;
所以在堆栈上创建了两个Thing1对象吗?我混淆了将包含类实例的变量赋值给该类的另一个实例的行为(假设我们不重载=运算符)。有什么帮助吗?
答案 0 :(得分:0)
首先,你的代码非常错误:
Thing1() = {n = 10};
应该是:
Thing1() {n = 10;} // notice deleted = and semicolon position
你需要用分号结束课程定义。
现在,回答你的问题:如果你在相同的类对象之间使用=运算符而没有重载,你只需将B的所有成员变量基本上设置为A的值,这两个目标仍然是相互独立的。
就像:
int a = 5, b = 10;
b = a; // b = 10 and a = 10
b = 3 // b = 3 and a = 10
考虑这段代码:
#include <iostream>
using namespace std;
class Thing1
{
public:
Thing1() {n = 10;}
int n;
};
int main()
{
Thing1 A; // Creates an instance of Thing1
Thing1 B = A; // What happens here???
cout << B.n << endl << A.n << endl; // 10 10
B.n = 5;
A.n = 16;
cout << B.n << endl << A.n; // 5 16
return 0;
}
打印出来:
10
10个
5
16个
答案 1 :(得分:0)
该行的含义: 事1 B = A; //这里发生了什么???
B是Thing1类型的对象,对象B的成员使用对象A的成员的当前值进行初始化。您不是将对象A的指针指定给对象B,而只是将A的另一个副本指定为A.是在C ++中使用复制构造函数完成的。
更改B的任何成员不会反映在A类的相应成员中。