c/c++ 淺拷貝 編譯器合成的 拷貝構造函數 和 =重載函數 ,只是做入下處理: 如果成員變數a是指針,執行完 拷貝構造函數 或者 =重載函數 後,對象1和對象2的成員變數就指向了一個地址了,所以當改變對象1的a的值,對象2的a的值也變化了, 而且,如果在析構函數里寫了free(a)的話,就相當於 ...
c/c++ 淺拷貝
編譯器合成的拷貝構造函數和=重載函數,只是做如下處理:
對象1.成員變數a = 對象2.成員變數a
如果成員變數a是指針,執行完拷貝構造函數或者*=重載函數**後,對象1和對象2的成員變數就指向了一個地址了,所以當改變對象1的a的值,對象2的a的值也變化了,
而且,如果在析構函數里寫了free(a)的話,就相當於對同一個地址free了2次,系統就會在執行時崩潰。
下麵的代碼斷點執行到return 0處,觀察s, s1, s2的data成員變數的地址後,發現都指向同一個地址
#include <iostream>
#include <string.h>
using namespace std;
class String{
public:
String(const char* str = ""){
if(NULL == str){
data = (char*)malloc(sizeof(char));
*data = '\0';
}
else{
data = (char*)malloc(sizeof(char) * (strlen(str) + 1));
strcpy(data, str);
}
}
~String(){
free(data);
data = NULL;
}
char* getData(){
return data;
}
private:
char *data;
};
int main(){
char* a = "abc";
String s(a);
String s1(s);
String s2;
s2 = s;
return 0;
}