带有struct指针的类初始化列表

时间:2016-04-14 16:22:04

标签: c++ pointers struct

我正在看一个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() {}

3 个答案:

答案 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对象,实例化对象指向该对象。