我正在看一个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() {}
答案 0 :(得分:2)
结构没有&#34;取值&#34;。 函数获取值。构造函数是函数。在new CheshireCat(*other.d_ptr)
中,您调用CheshireCat
的编译器生成的复制构造函数。
您也可以不传递指针而是引用,因为您通过other.d_ptr
operator*
的重载std::unique_ptr
取消引用new CheshireCat(other.d_ptr)
。实际上,如果您编写了new CheshireCat(other.d_ptr.get())
或%
,那么您将收到编译错误。
答案 1 :(得分:1)
表达式*other.d_ptr
被解析为等同于*(other.d_ptr)
。让我们采用语法d_ptr(new CheshireCat(*other.d_ptr))
并从内到外工作以确定它在做什么:
other
- 声明为PublicClass const &
。other.d_ptr
- unique_ptr<CheshireCat> const &
,对d_ptr
other
实例成员的引用。*other.d_ptr
- 在operator*
对象上调用unique_ptr
,这将产生类型CheshireCat const &
的结果(对{{1}的对象的引用对象拥有)。unique_ptr
- 获取此new CheshireCat(*other.d_ptr)
并通过调用CheshireCat const &
类型的复制构造函数来堆分配新的CheshireCat
对象。此表达式的类型为CheshireCat
。CheshireCat *
- 使用d_ptr(new CheshireCat(*other.d_ptr))
值构造正在构造的d_ptr
对象的PublicClass
成员。 (这是此特定CheshireCat *
构造函数的initializer list。)换句话说,这一行所做的就是复制PublicClass
实例拥有的CheshireCat
对象,并将该副本的所有权授予正在构造的other
对象。
答案 2 :(得分:1)
当用户没有定义一个时,C ++默认提供一个复制构造函数:http://en.cppreference.com/w/cpp/language/copy_constructor
该行:
d_ptr(new CheshireCat(*other.d_ptr))
只是取消引用指向现有CheshireCat
对象的指针并将其复制以实例化CheshireCat
对象,实例化对象指向该对象。