为什么没有复制构造函数会导致值一起更改?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么没有复制构造函数会导致值一起更改?相关的知识,希望对你有一定的参考价值。

我正在查看此页面上的代码和说明,但我不太了解。 https://www.geeksforgeeks.org/copy-constructor-in-cpp/

下面是我很困惑的例子。为什么str2.change("GeeksforGeeks");导致str1也改变?我问是因为change做与复制构造函数完全相同的事情。他们都为s分配了一个新的char数组。

#include<iostream> 
#include<cstring> 
using namespace std; 

class String 
 
private: 
    char *s; 
    int size; 
public: 
    String(const char *str = NULL); // constructor 
    ~String()  delete [] s;  // destructor 
    void print()  cout << s << endl;  // Function to print string 
    void change(const char *);  // Function to change 
; 

String::String(const char *str) 
 
    size = strlen(str); 
    s = new char[size+1]; 
    strcpy(s, str); 
 

void String::change(const char *str) 
 
    delete [] s; 
    size = strlen(str); 
    s = new char[size+1]; 
    strcpy(s, str); 
 


int main() 
 
    String str1("GeeksQuiz"); 
    String str2 = str1; 

    str1.print(); // what is printed ? 
    str2.print(); 

    str2.change("GeeksforGeeks"); 

    str1.print(); // what is printed now ? 
    str2.print(); 
    return 0; 
 
答案

str2.change("GeeksforGeeks");删除str1仍指向的旧存储器。然后,str1.print()导致未定义的行为,因此任何事情都可能发生。

以上是关于为什么没有复制构造函数会导致值一起更改?的主要内容,如果未能解决你的问题,请参考以下文章

c++的复制构造函数

是否可以在 C++ 中将返回值移动语义与受保护的复制构造函数一起使用?

没有调用复制构造函数?

即使使用复制构造函数,克隆对象也会更改原始对象[重复]

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

构造函数和原型