gpt4 book ai didi

c++ - 拷贝构造函数如何执行?

转载 作者:太空宇宙 更新时间:2023-11-04 15:30:15 25 4
gpt4 key购买 nike

我正在尝试详细了解复制构造函数。在这样做的同时,我做了以下示例,

#include<iostream>

class Test
{
private:
int a;
public:
/*
Test(const Test &t) // User defined copy constructor
{
a = t.a;
} */
Test()
{
a = 120;
}
int display()
{
return a ;
}
void set(int var)
{
a = var;
}
};

int main()
{
Test t1;
std::cout << "t1.a " << t1.display() << std::endl;
Test t2 = t1; //Default copy constructor is called
std::cout << "T2.a " << t2.display() << std::endl;
t2.set(99); //Changing the value
std::cout << "t1.a " << t1.display() << std::endl;
std::cout << "T2.a " << t2.display() << std::endl;
return 0;
}

我在网上读到默认复制构造函数执行“浅复制”所以这意味着如果 obj1 = obj2,即使在赋值之后我在 obj1 或 obj2 中做了什么改变需要反射(reflect)在两个对象上,因为它们指向相同的位置。但是在这个例子中,当我改变一个对象的值时,它并没有反射(reflect)在另一个对象中。使用用户定义的复制构造函数时获得相同的结果。

谁能澄清一下这个话题,浅拷贝是否正在发生!

谢谢!

最佳答案

浅拷贝并不是什么特别的东西,你需要记住它作为规则。相反,它只是由于使用引用或指针而发生的事情。考虑这个例子:

struct foo { 
int* x;
};

int a = 4;
foo f{&a};

这里 x 指向 a 如果你复制 f 新实例 x 将指向相同的一个。那是一个浅拷贝。深拷贝不仅要尊重 x,还要尊重 x 指向的内容,它们是 foo 的组成部分,需要复制为好。一般来说,编译器无法决定你想要什么。 x 只是一个引用,还是 x 所指的也是 foo 的一部分?因此你得到的是显而易见的:只复制成员而不是他们可能引用的内容。

现在,如果您复制 foo,然后修改 x 指向的值,那么这将修改相同的 a。做了一个浅拷贝。根据我的经验,术语深拷贝和浅拷贝与其说是清晰,不如说是在增加困惑。您免费获得的是所有成员都被复制(无论是浅拷贝还是深拷贝)。仅当您需要更多(也复制指针对象)时,您才需要担心浅拷贝与深拷贝。

TL;DR:您的示例中没有深/浅拷贝。对于值(value)观,这种区分没有意义。使用 int* 看效果。

关于c++ - 拷贝构造函数如何执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55825468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com