C++下面的構造拷貝函數和賦值函數
首先我給出一個類
class A
{
public:
???char *p;
???int nlen;
?? A();
?? A(const char *p1)
???{
????? nlen = strlen(p1);
??????p = new char[nlen+1];
??????strcpy(p,p1);
???}
};
void main()
{
???A a("Hello world");
?? A b = a;
}
如果沒有構造拷貝函數的話,
這樣明顯會出現2個問題,
1.a.p和b.p指向同一個內存區域
//2.a.p資源沒有釋放
3.a和b調用了默認析構函數的話,同一個資源被釋放了2次.
這就是沒有構造拷貝函數的缺陷
在class A中加入
/*-----------------------------add?method ------------*/
A(const A & a1)
{
???nlen = strlen(a1.p);
???p?= new char[nlen+1];
? strcpy(p,p1);
}
/*------------------------------end add ---------------*/
這樣就加入了構造拷貝函數
明顯上面的問題可以解決,
我們可以寫更美觀一點的代碼
void main()
{
???A a("Hello World");
???A b(a);
???cout <<"debug breakpoint is setted here"<<endl;
}
class A
{
public:
???char *p;
???int nlen;
?? A();
?? A(const char *p1)
???{
????? nlen = strlen(p1);
??????p = new char[nlen+1];
??????strcpy(p,p1);
???}
};
void main()
{
???A a("Hello world");
?? A b = a;
}
如果沒有構造拷貝函數的話,
這樣明顯會出現2個問題,
1.a.p和b.p指向同一個內存區域
//2.a.p資源沒有釋放
3.a和b調用了默認析構函數的話,同一個資源被釋放了2次.
這就是沒有構造拷貝函數的缺陷
在class A中加入
/*-----------------------------add?method ------------*/
A(const A & a1)
{
???nlen = strlen(a1.p);
???p?= new char[nlen+1];
? strcpy(p,p1);
}
/*------------------------------end add ---------------*/
這樣就加入了構造拷貝函數
明顯上面的問題可以解決,
我們可以寫更美觀一點的代碼
void main()
{
???A a("Hello World");
???A b(a);
???cout <<"debug breakpoint is setted here"<<endl;
}