1.相關數據結構成員方法的調用
class Stack
{
public:
Stack()
{
cout << this << endl;
cout << "Stack()" << endl;
mpstack = new int[10];
mtop = -1;
msize = 10;
}
//explicit:你明確的調用了這個構造函數,我纔給你構造對象;否則
//編譯錯誤 explicit:防止隱式產生臨時對象用的!
//explicit Stack(int size)
Stack(int size)
{
cout << this << endl;
cout << "Stack(int)" << endl;
mpstack = new int[size];
mtop = -1;
msize = size;
}
Stack(int size, int len, int initVal)
{
cout << this << endl;
cout << "Stack(int, int, int)" << endl;
mpstack = new int[size];
msize = size;
mtop = -1;
for (int i = 0; i < len; ++i)
{
mpstack[++mtop] = initVal;
}
}
~Stack()
{
cout << this << endl;
cout << "~Stack()" << endl;
delete[]mpstack;
mpstack = NULL;
}
Stack(const Stack &src)
{
cout << &src << "=>" <<this << endl;
cout << "Stack(const Stack &src)" << endl;
mpstack = new int[src.msize];
msize = src.msize;
mtop = src.mtop;
for (int i = 0; i <= mtop; ++i)
{
mpstack[i] = src.mpstack[i];
}
}
void operator=(const Stack &src)
{
cout << &src << "=>" << this << endl;
cout << "void operator=(const Stack &src)" << endl;
if (this == &src)
return;
delete[]mpstack;
mpstack = new int[src.msize];
msize = src.msize;
mtop = src.mtop;
for (int i = 0; i <= mtop; ++i)
{
mpstack[i] = src.mpstack[i];
}
}
private:
int *mpstack;
int mtop;
int msize;
};
class Test
{
public:
Test(int a = 5, int b = 5) :ma(a), mb(b)
{
cout << "Test(int, int)" << endl;
}
~Test()
{
cout << "~Test()" << endl;
}
Test(const Test &src) :ma(src.ma), mb(src.mb)
{
cout << "Test(const Test&)" << endl;
}
void operator=(const Test &src)
{
ma = src.ma; mb = src.mb; cout << "operator=" << endl;
}
private:
int ma;
int mb;
};
Test t1(10, 10);//程序運行時開闢,調用帶有兩個整型參的構造函數
int main()
{
Test t2(20, 20);//調用帶有兩個整型參的構造函數
Test t3 = t2;//調用自定義的拷貝構造函數
static Test t4 = Test(30, 30);//t4起初開闢內存,在運行時調用拷貝構造函數
t2 = Test(40, 40);
//1.調用帶有兩個整型參(20,20)的構造函數構造臨時對象 2.賦值運算符的重載函數 3.析構臨時對象
t2 = (Test)(50, 50);//相當於強轉逗號表達式,相當於t2=Test(50,5)[5是默認大小]
//1.調用帶有兩個整型參(20,20)的構造函數構造臨時對象 2.賦值運算符的重載函數 3.析構臨時對象
t2 = 60;//相當於隱式產生一個臨時對象,等價於t2=Stack(60,5)
//1.調用帶有兩個整型參(20,20)的構造函數構造臨時對象 2.賦值運算符的重載函數 3.析構臨時對象
Test *p1 = new Test(70, 70);//動態開闢對象的內存,調用帶有兩個整型參的構造函數
Test *p2 = new Test[2];//動態開闢對象的內存,調用帶有兩個默認的構造函數
//堆上動態開闢的內存必須手動delete,否則永遠不會析構
Test *p3 = &Test(80, 80);
//指針:1.調用帶有兩個整型參的構造函數構造一個臨時對象 2.語句結束臨時對象析構
Test &p4 = Test(90, 90);
//引用:調用帶有兩個整型參的構造函數構造一個臨時對象,並給這個臨時對象起了個別名p4,所以語句結束臨時對象不會析構
delete p1;//手動釋放p1所佔用的外部資源
delete[]p2;//手動釋放p2所佔用的外部資源
}
Test t5(100, 100);//程序運行時開闢,調用帶有兩個整型參的構造函數
//釋放的順序是:p4,t3,t2,t4,t5,t1
class Test
{
public:
Test(int a = 5) :ma(a)
{
cout << "Test(int=5)" << endl;
}
~Test()
{
cout << "~Test()" << endl;
}
Test(const Test &src) :ma(src.ma)
{
cout << "Test(const Test&)" << endl;
}
void operator=(const Test &src)
{
ma = src.ma;
cout << "operator=" << endl;
}
int getValue(){ return ma; }
private:
int ma;
};