小弟C++初學者, 在物件與動態記憶體有些疑惑, 請高手幫幫忙

prog1,prog2 是書上提供的程式碼

prog1: 說明當物件裡有指標時,使用預設的拷貝建構元會使兩物件的指標指向同樣的地方

prog2: 說明使用"="運算子的多載,可以改善prog1的問題

prog3: 是自己寫的,在拷貝建構元加入動態記憶體,配置給指標所指向字串,但是當執行win1=win2,且win1重新設值後
兩物件的成員title還是同時被改變, 這是為什麼呢?



prog1
// prog15_4, 使用預設的設定運算子所發生的錯誤
#include <iostream>
#include <cstdlib>
using namespace std;
class CWin // 定義視窗類別CWin
{
private:
char id, *title;

public:
CWin(char i='D', char *text="Default window"):id(i)
{
title=new char[50]; // 配置可容納50個字元的記憶空間
strcpy(title,text); // 將text所指向的字串拷貝給title
}
void set_data(char i, char *text)
{
id=i;
strcpy(title,text); // 將text所指向的字串拷貝給title
}
void show(void)
{
cout << "Window " << id << ": " << title << endl;<br>}

~CWin(){ delete [] title; } // 解構元

CWin(const CWin &win) // 拷貝建構元
{
id=win.id;
strcpy(title,win.title);
}
};

int main(void)
{
CWin win1('A',"Main window");
CWin win2;

win1.show();
win2.show();

win1=win2; // 設定win1=win2
cout << endl << "設定 win1=win2 之後..." << endl;<br>win1.show();
win2.show();

win1.set_data('B',"Hello window");
cout << endl << "更改 win1的資料成員之後..." << endl;<br>win1.show();
win2.show();

system("pause");
return 0;
}


prog2
// prog15_5, 使用設定運算子來修正錯誤
#include <iostream>
#include <cstdlib>
using namespace std;
class CWin // 定義視窗類別CWin
{
private:
char id, *title;

public:
CWin(char i='D', char *text="Default window"):id(i)
{
title=new char[50];
strcpy(title,text);
}
void set_data(char i, char *text)
{
id=i;
strcpy(title,text);
}
void operator=(const CWin &win) // 定義設定運算子「=」的多載
{
id=win.id;
strcpy(this->title,win.title); // 字串拷貝
}
void show(void)
{
cout << "Window " << id << ": " << title << endl;<br>}

~CWin(){ delete [] title; } // 解構元

CWin(const CWin &win) // copy constructor
{
id=win.id;
strcpy(title,win.title); // 拷貝建構元
}
};

int main(void)
{
CWin win1('A',"Main window");
CWin win2;

win1.show();
win2.show();

win1=win2;
cout << endl << "設定 win1=win2 之後..." << endl;<br>win1.show();
win2.show();

win1.set_data('B',"Hello window");
cout << endl << "更改 win1的資料成員之後..." << endl;<br>win1.show();
win2.show();

system("pause");
return 0;
}


prog3
#include <iostream>
#include <cstdlib>
using namespace std;
class CWin // 定義視窗類別CWin
{
private:
char id, *title;

public:
CWin(char i='D', char *text="Default window"):id(i)
{
title=new char[50]; // 配置可容納50個字元的記憶空間
strcpy(title,text); // 將text所指向的字串拷貝給title
}
void set_data(char i, char *text)
{
id=i;
strcpy(title,text); // 將text所指向的字串拷貝給title
}
void show(void)
{
cout << "Window " << id << ": " << title << endl;<br>}

void show_address(void)
{
cout << "Window " << id << ": " << &id << endl;<br>}


~CWin(){ delete [] title; } // 解構元

// CWin(const CWin &win) // 拷貝建構元
// {
// id=win.id;
// title = new char[strlen(win.title)+1]; // 建立動態記憶體
// strcpy(title,win.title);
// }
};

int main(void)
{
CWin win1('A',"Main window");
CWin win2;

win1.show();
win2.show();
win1.show_address();
win2.show_address();

win1=win2; // 設定win1=win2
cout << endl << "設定 win1=win2 之後..." << endl;<br>win1.show();
win2.show();
win1.show_address();
win2.show_address();

win1.set_data('B',"Hello window");
cout << endl << "更改 win1的資料成員之後..." << endl;<br>win1.show();
win2.show();

system("pause");
return 0;
}
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!