類的拷貝建構函式和引用
阿新 • • 發佈:2018-12-18
類的拷貝建構函式中傳遞的類引數,一定是引用型別,不能採用值傳遞型別。 如下:
class Person { public: Person(int id): m_id(id) {} Person(const Person &per1) //拷貝建構函式。 { m_id = per1.getId(); } ~Person() {} int getId() const { return m_id; } private: int m_id; }; int main() { Person p1(0); int one = p1.getId(); Person p2 = p1; return 0; }
上面的程式可編譯過。但是下面將拷貝建構函式的引數更換為傳值型別,那麼就無法編譯成功。
class Person
{
public:
Person(int id): m_id(id) {}
Person(const Person per1) //拷貝建構函式。
{
m_id = per1.getId();
}
~Person() {}
int getId() const { return m_id; }
private:
int m_id;
}
這段程式碼在Visual Studio和GCC中都無法編譯成功[1]。即使編譯成功了,也會產生錯誤。因為在呼叫拷貝建構函式時,會產生無限呼叫的情況,最終導致棧空間溢位。
拷貝建構函式的使用情況
- 用一個物件來初始化另一個物件,如上面的p2=p1;
- 函式引數是一個物件時,因為傳實參會進行復制,所以會呼叫拷貝建構函式,如上面的Person(const Person per1);
- 函式體內部返回一個物件時;