复制构造函数实际上做什么? 我是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;   
}