是否可以「添加」到默認的拷貝構造函數?是否可以「添加」到默認的拷貝構造函數?
例如,對於這個類:
class A
{
public:
int a;
int* b;
};
我只想寫
A::A(const A& rvalue):
a(rvalue.a),
b(new int(*(rvalue.b)))
{}
沒有a(rvalue.a)
部分。
(忽略壞/醜陋的代碼和可能的內存泄漏)
是否可以「添加」到默認的拷貝構造函數?是否可以「添加」到默認的拷貝構造函數?
例如,對於這個類:
class A
{
public:
int a;
int* b;
};
我只想寫
A::A(const A& rvalue):
a(rvalue.a),
b(new int(*(rvalue.b)))
{}
沒有a(rvalue.a)
部分。
(忽略壞/醜陋的代碼和可能的內存泄漏)
你問什麼是不可能的。一旦聲明瞭自己的拷貝構造函數,編譯器就不會爲你生成拷貝構造函數。這意味着你將無法簡單地添加或增加默認的拷貝構造函數,因爲它不會存在。這是全部或沒有,可以這麼說。
請注意,這也是避免需要編寫複製構造函數的操作(即:裸指針)的另一個原因。除非你沒有別的選擇。 –
這是不可能的。
struct A1 { int a1; int a2; // .... int aN; }; struct A:public A1 { int* b; A(const A& rhs): A1(rhs), b(new int(*(rhs.b))) {} };
你想要做的不是nartually由C++的支持是什麼:你不能擁有但是,如果你想減少冗餘代碼爲大量的「默認複製」字段,可以用隨中級繼承來實現一半的默認構造函數。
但是,你想要什麼,實現可以通過下面的小技巧來實現:
請注意這個小演示下面有很多缺陷(內存泄漏等),所以它僅適用於筆畫演示臨時解決方案只:
//class A hasa large number date members(but all can take advantage of default
//copy constructor
struct A{
A(int i):a(i){}
int a;
//much more data memberS can use default copy constructor all in class A
};
//class B is simply wrapper for class A
//so class B can use the default constructor of A
//while just write copy constructor for a raw pointer in it's copy constructor
//I think this is what OP want ?
struct B
{
B(int i,int j):m_a(i),m_b(new int(j)){}
B(const B & rval):
m_a(rval.m_a),
m_b(new int(*rval.m_b))
{
}
A m_a;
int * m_b;
};
int main()
{
B c(2,3); // a=2, *m_b=3
B d(c); //after copy constructor, a=2, *m_b=3
}
我認爲這已經被用戶提及396672 –
我不知道,因爲我只是閱讀你的問題,並自己動手解決這個問題...... – Gob00st
這個默認的複製構造函數不是微不足道的 – Benoit
爲什麼你需要這個?你不能改變班級嗎? –
這只是我有一個相當大的類,只有一個指針(我不能使用智能指針),所以我需要爲它寫一個拷貝構造函數,但大部分拷貝構造函數只是做默認的拷貝構造函數會做 –