C++赋值拷贝函数方面,为什么成员变量地址一样呢?

使用了默认的赋值拷贝构造函数,此时应该是浅拷贝,那么有点疑惑:
为什么&(s1.m_data.name) 和 &(s2.m_data.name) 的地址不一样? 难道进行了深拷贝吗?

class STU {
public:
  struct DATA {
    int num;
    std::string name;
  };
  DATA m_data;
};

int main() {
  STU s1;
  STU s2;
  s1.m_data.name = "Tom";
  s1.m_data.num = 20;
  s2 = s1;
  printf("%p == %p, %p == %p, %p == %p\n", &s1, &s2, &s1.m_data, &s2.m_data, &(s1.m_data.name), &(s2.m_data.name));

输出如下:
0x7ffcb22a1350 == 0x7ffcb22a1380, 0x7ffcb22a1350 == 0x7ffcb22a1380, 0x7ffcb22a1358 == 0x7ffcb22a1388

阅读 1.3k
1 个回答

string 是个容器啊,它有自己的拷贝方法,当你的结构需要拷贝 string 的时候,会调用 string 的拷贝方法,所以这里不存在浅拷贝。
只有你的结构成员是指针型变量,而结构本身又没提供针对这个指针型变量的拷贝处理的时候,才会出现浅拷贝的问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题