复制构造函数实际上做什么? 我是C++编程新手,我被困在一个成员都显示相同值的部分。你们能解释一下为什么吗?Thx提前 #include<iostream> using namespace std; class test{ public: int all,sum; test(int x){ all=x; } test(test &a){ all=a.all+5; cout<<all; } void one(test m){ cout<<endl; cout<<endl<<m.all; cout<<endl<<all; } }; int main(){ test a(10),b(a); b.one(a); return 0; } #包括 使用名称空间std; 课堂测试{ 公众: int all,sum; 测试(INTX){ all=x; } 测试(测试与分析){ all=a.all+5; cout
问题不在于复制构造函数实际上做什么? 我是C++编程新手,我被困在一个成员都显示相同值的部分。你们能解释一下为什么吗?Thx提前 #include<iostream> using namespace std; class test{ public: int all,sum; test(int x){ all=x; } test(test &a){ all=a.all+5; cout<<all; } void one(test m){ cout<<endl; cout<<endl<<m.all; cout<<endl<<all; } }; int main(){ test a(10),b(a); b.one(a); return 0; } #包括 使用名称空间std; 课堂测试{ 公众: int all,sum; 测试(INTX){ all=x; } 测试(测试与分析){ all=a.all+5; cout,c++,constructor,copy-constructor,C++,Constructor,Copy Constructor,问题不在于a和b具有相同的值。因为它们不具有相同的值。调试器会向您显示a.all是10,而b.all是15,正如预期的那样 真正的问题是,您正在通过值将a传递给one(),因此编译器必须对a进行临时复制。这意味着编译器将使用复制构造函数复制构造m(并在one()退出时销毁m)。因此,m.all值始终是一个递增5的值,而不是原始值 在您的示例中,b.all和m.all的值恰好是相同的值,只是因为它们都是从相同的a对象复制构造的。尝试将b传递给one()(b.one(b);),您将看到m.all将是
a
和b
具有相同的值。因为它们不具有相同的值。调试器会向您显示a.all
是10,而b.all
是15,正如预期的那样
真正的问题是,您正在通过值将a
传递给one()
,因此编译器必须对a
进行临时复制。这意味着编译器将使用复制构造函数复制构造m
(并在one()
退出时销毁m
)。因此,m.all
值始终是一个递增5的值,而不是原始值
在您的示例中,b.all
和m.all
的值恰好是相同的值,只是因为它们都是从相同的a
对象复制构造的。尝试将b
传递给one()
(b.one(b);
),您将看到m.all
将是20而不是15
要解决您的问题,您需要将one()
更改为通过引用获取其m
参数:
void one(const test &m) {
cout<<endl;
cout<<endl<<m.all;
cout<<endl<<all;
}
您确实需要学习如何正确设置代码格式。此外,我建议每行只进行一次声明/初始化,而不是多个变量。复制构造函数可以执行您希望它执行的任何操作。通常,成员会从另一个对象复制到此对象。调试器将帮助您比发布到StackOver更快地回答此问题流动并等待答案。Thx!但是你能详细解释一下这些值是如何变为相等的吗?我真的不明白这部分。当调用b.one(a)时会发生什么?
test(const test &a){
all=a.all+5;
cout<<all;
}