我正在看PIMPL成語的一個例子,並且我發現了一行代碼,我真的不明白。由於我剛接觸C++和OOP,我希望有人能夠解釋這個函數的功能。帶結構指針的類初始化列表
有人可以澄清這個功能嗎?
PublicClass::PublicClass(const PublicClass& other)
: d_ptr(new CheshireCat(*other.d_ptr)) { // <------- This line
// do nothing
}
/
這裏是例子。
//header file:
class PublicClass {
public:
PublicClass(); // Constructor
PublicClass(const PublicClass&); // Copy constructor
PublicClass(PublicClass&&); // Move constructor
PublicClass& operator=(const PublicClass&); // Copy assignment operator
~PublicClass(); // Destructor
// Other operations...
private:
struct CheshireCat; // Not defined here
unique_ptr<CheshireCat> d_ptr; // opaque pointer
};
/
//CPP file:
#include "PublicClass.h"
struct PublicClass::CheshireCat {
int a;
int b;
};
PublicClass::PublicClass()
: d_ptr(new CheshireCat()) {
// do nothing
}
PublicClass::PublicClass(const PublicClass& other)
: d_ptr(new CheshireCat(*other.d_ptr)) {
// do nothing
}
PublicClass::PublicClass(PublicClass&& other)
{
d_ptr = std::move(other.d_ptr);
}
PublicClass& PublicClass::operator=(const PublicClass &other) {
*d_ptr = *other.d_ptr;
return *this;
}
PublicClass::~PublicClass() {}
技術上不正確。 C++不提供*瑣碎的*拷貝構造函數,它提供*默認的*。 – SergeyA
閱讀引用的鏈接下的Trivial Copy構造函數:「類T的複製構造函數是微不足道的,如果滿足以下所有條件: 它不是用戶提供的(即它是隱式定義或默認),並且如果它是默認的,它的簽名與隱含定義相同; T沒有虛擬成員函數; T沒有虛擬基類; 爲T的每個直接基地選擇的複製構造函數是微不足道的; 選擇了複製構造函數對於T的每個非靜態類類型(或類類型數組)都是微不足道的;「 –
你自己的鏈接與你相矛盾。 '爲T的每個非靜態類類型(或類類型數組)的成員選擇的拷貝構造函數是微不足道的'。這裏沒有任何暗示'CheshireCat'構造函數是微不足道的。同樣,正確的定義是「......提供**默認**拷貝構造函數......」。有時候這些默認構造函數是微不足道的,有時它們不是,它與問題無關。 – SergeyA