拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù)是使用類對(duì)象的引用作為參數(shù)的構(gòu)造函數(shù),它能夠?qū)?shù)的屬性值拷貝給新的對(duì)象,完成新對(duì)象的初始化。
通常在一下三種情況下,程序會(huì)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。
1.使用一個(gè)對(duì)象初始化另一個(gè)對(duì)象
#include <iostream>
#include<string>
using namespace std;
class Car
{
public:
Car(){}; //初始化構(gòu)造函數(shù)
Car(string name, int seats);
Car(Car &con_refcar);
~Car(); //析構(gòu)函數(shù)
private:
string m_name;
int m_seats;
};
Car::Car(string name, int seats)
{
m_name = name;
m_seats = seats;
}
Car::Car(Car &con_refcar)
{
m_name = con_refcar.m_name;
m_seats = con_refcar.m_seats;
}
Car::~Car() {}
int main()
{
Car mynewcar("rrrr2", 4);
Car myseccar(mynewcar); //用一個(gè)對(duì)象對(duì)另一個(gè)對(duì)象初始化
return 0;
}
2.對(duì)象作為實(shí)參傳遞給函數(shù)參數(shù)
#include <iostream>
#include<string>
using namespace std;
class Car
{
public:
Car(){}; //初始化構(gòu)造函數(shù)
Car(string name, int seats);
Car(Car &con_refcar);
void print();
~Car(); //析構(gòu)函數(shù)
private:
string m_name;
int m_seats;
};
Car::Car(string name, int seats)
{
m_name = name;
m_seats = seats;
}
Car::Car(Car &con_refcar)
{
m_name = con_refcar.m_name;
m_seats = con_refcar.m_seats;
}
Car::~Car() {}
void Car::print()
{
cout<<"name: "<<m_name<<endl;
cout<<"sizes: "<<m_seats<<endl;
}
void print_carinfo(Car carinfo) //對(duì)象最為實(shí)參傳遞給函數(shù)
{
carinfo.print();
}
int main()
{
Car mynewcar("rrrr2", 4);
print_carinfo(mynewcar); //調(diào)用該函數(shù)
return 0;
}
3.函數(shù)返回值為類對(duì)象,創(chuàng)建臨時(shí)對(duì)象作為返回值
#include <iostream>
#include<string>
using namespace std;
class Car
{
public:
Car(){}; //初始化構(gòu)造函數(shù)
Car(string name, int seats);
Car(Car &con_refcar);
Car get_carinfo(); //****
void print();
~Car(); //析構(gòu)函數(shù)
private:
string m_name;
int m_seats;
};
Car::Car(string name, int seats)
{
m_name = name;
m_seats = seats;
}
Car::Car(Car &con_refcar)
{
m_name = con_refcar.m_name;
m_seats = con_refcar.m_seats;
}
Car::~Car()
{
}
void Car::print()
{
cout<<"name: "<<m_name<<endl;
cout<<"sizes: "<<m_seats<<endl;
}
Car Car::get_carinfo() //關(guān)鍵函數(shù)
{
Car tmp(m_name, m_seats); //定義類對(duì)象
return tmp; //返回類對(duì)象
}
int main()
{
Car mynewcar("rrrr2", 4);
Car ret;
ret = mynewcar.get_carinfo(); //ret接受返回的類對(duì)象
ret.print();
return 0;
}
以上都是淺拷貝, 淺拷貝有個(gè)特點(diǎn)就是:類的私有成員不需要new出新的空間,像上面的m_name都是用string類型;如果換成char類型,上面的程序就會(huì)出錯(cuò),原因是,淺拷貝并未為拷貝對(duì)象開(kāi)辟空間,只是讓拷貝對(duì)象的地址指向被拷貝對(duì)象的地址,相當(dāng)于“引用”。為了解決這個(gè)問(wèn)題,就要用到深拷貝!
深拷貝
#include <iostream>
#include<string>
using namespace std;
class Car
{
public:
Car(char *name, int seats);
Car(Car &con_refcar);
~Car();
private:
char *m_name; //char型數(shù)據(jù)成員
int m_seats;
};
Car::Car(char *name, int seats)
{
int len = strlen(name) + 1;
m_name = new char[len]; //每個(gè)對(duì)象初始化都要臨時(shí)開(kāi)劈空間
strcpy(m_name, name ); //字符串之間賦值要用strcpy()函數(shù)
m_seats = seats;
}
Car::Car(Car &con_refcar) //深拷貝
{
m_name = new char[strlen(con_refcar.m_name)+1]; //淺拷貝無(wú)需開(kāi)劈空間,數(shù)據(jù)成員賦值需要開(kāi)辟空間的都只能用深拷貝實(shí)現(xiàn)!
strcpy(m_name,con_refcar.m_name);
m_seats = con_refcar.m_seats;
}
Car::~Car()
{
delete[] m_name;
}
int main()
{
char c[] = "rrrr2";
Car mynewcar(c, 4);
Car myseccar(mynewcar);
return 0;
}
若有錯(cuò),望指出