定義一個有序數組類來說明這個問題:
#include <iostream>using namespace std;#define MAXSIZE 20class A {public:A(void);//建構函式A (const A &);//複製建構函式A & operator= (const A &);//重載賦值運算子~A() {//解構函式cout << "解構函式" << endl;}void Display(void);int Size(void);bool IsEmpty(void);bool IsFull(void);void Insert(double);void Delete(double);private:double arr[MAXSIZE];int length;};A::A(void)//建構函式{cout << "建構函式" << endl;length = 0;memset(arr, 0, MAXSIZE * sizeof(double));}A::A (const A &Obj)//複製建構函式{cout << "複製建構函式" << endl;for(int i = 0; i < Obj.length; i++) {arr[i] = Obj.arr[i];}length = Obj.length;}A & A::operator= (const A &Obj)//重載賦值運算子{cout << "重載賦值運算子" << endl;if(this == &Obj)return *this;for(int i = 0; i < Obj.length; i++) {arr[i] = Obj.arr[i];}length = Obj.length;return *this;}void A::Display(void){if (IsEmpty()) {cout << "空" << endl;return;}for (int i = 0; i < length; i++)cout << arr[i] << endl;cout << endl;}int A::Size(void){return length;}bool A::IsEmpty(void){return ( length <= 0 ? true : false );}bool A::IsFull(void){return ( length >= MAXSIZE ? true : false );}void A::Insert(double x)// 可以插入重複的元素{if (IsFull()) {cout << "Full!" << endl;return;}for (int i = 0; i < length; i++) {if (x < arr[i]) {//找到要插的位置,插在arr[i]之前double *p = arr + length;//p指向最後一個元素的後一位置int count = length - i;//將arr[i]及其之後的元素(共有length - i個)整體向後平移while(count--) {*p = *(p - 1);// 從後往前移p--;}arr[i] = x;//將x插入,此時p = arr + ilength++;return;}}arr[length] = x;// 若x比原數組中所有元素都大,則插在最後length++;}void A::Delete(double x){for (int i = 0; i < length; i++) {if (x == arr[i]) {for( int j = i; j < length - 1; j++ )arr[j] = arr[j + 1];length--;return;}}if( IsEmpty() )cout << "空" << endl;elsecout << "找不到" << x << endl;}A Fun(void){cout << "進入Fun()函數體" << endl;A obj;obj.Insert(20);obj.Insert(30);cout << "return前" << endl;return obj;//obj的臨時對象obj'的複製建構函式//obj的解構函式cout << "return後" << endl;//不執行}int main(void){double _arr[] = {2,5,10,6,8,4,1,3,9,7};int _len = sizeof(_arr) / sizeof(*_arr);cout << "my" << endl;A myobj;for(int i = 0; i < _len; i++) {myobj.Insert(_arr[i]);}myobj.Display();cout << "your" << endl;A yourobj(myobj);yourobj.Display();cout << "his" << endl;A hisobj;hisobj = yourobj;hisobj.Display();cout << "her" << endl;A herobj = hisobj;hisobj.Display();cout << "調用Fun()前" << endl;hisobj = Fun();//obj'的解構函式cout << "調用Fun()後" << endl;hisobj.Display();return 0;}
運行結果:
my建構函式12345678910your複製建構函式12345678910his建構函式重載賦值運算子12345678910her複製建構函式12345678910調用Fun()前進入Fun()函數體建構函式return前複製建構函式解構函式重載賦值運算子解構函式調用Fun()後2030解構函式解構函式解構函式解構函式
p.s.請強烈關注當類中含指標對象的成員時的情況!!!