Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有结构指针的类初始化列表_C++_Pointers_Struct - Fatal编程技术网

C++ 带有结构指针的类初始化列表

C++ 带有结构指针的类初始化列表,c++,pointers,struct,C++,Pointers,Struct,我正在看一个PIMPL习语的例子,发现了一行我真的不懂的代码。由于我是C++新手,我希望有人能解释一下这个函数是什么。 有人能澄清一下这个功能吗? PublicClass::PublicClass(const PublicClass& other) : d_ptr(new CheshireCat(*other.d_ptr)) { // <------- This line // do nothing } 结构不“接受值”。函数接受值。构造函数是函数。在newch

我正在看一个PIMPL习语的例子,发现了一行我真的不懂的代码。由于我是C++新手,我希望有人能解释一下这个函数是什么。 有人能澄清一下这个功能吗?

PublicClass::PublicClass(const PublicClass& other)
    : d_ptr(new CheshireCat(*other.d_ptr)) { // <------- This line 
    // do nothing
}
结构不“接受值”。函数接受值。构造函数是函数。在
newcheshirecat(*other.d_ptr)
中,调用
CheshireCat
编译器生成的复制构造函数

您还可以通过
std::unique\ptr
的重载
操作符*
取消引用
other.d\ptr
,因此不会传递指针,而是传递引用。事实上,如果您编写了
new CheshireCat(other.dptr)
new CheshireCat(other.dptr.get())
,则会出现编译错误。

结构不“获取值”。函数接受值。构造函数是函数。在
newcheshirecat(*other.d_ptr)
中,调用
CheshireCat
编译器生成的复制构造函数


您还可以通过
std::unique\ptr
的重载
操作符*
取消引用
other.d\ptr
,因此不会传递指针,而是传递引用。事实上,如果您编写了
new CheshireCat(other.dptr)
new CheshireCat(other.dptr.get())
,则会出现编译错误。

表达式
*other.dptr
被解析为等价于
*(other.dptr)
。让我们使用语法
dptr(new CheshireCat(*other.dptr))
并从内到外确定它在做什么:

  • 其他
    ——声明的
    公共类常量&
  • other.d_ptr
    ——一个
    唯一的\u ptr常量&
    ,是对
    other
    d_ptr
    实例成员的引用
  • *other.d_ptr
    ——调用
    unique_ptr
    对象上的
    操作符*
    ,将产生类型为
    CheshireCat const&
    (对
    unique_ptr
    对象拥有的对象的引用)
  • new CheshireCat(*other.d_ptr)
    ——获取这个
    CheshireCat常量&
    ,堆通过调用
    CheshireCat
    类型的复制构造函数来分配一个新的
    CheshireCat
    对象。此表达式的类型为
    CheshireCat*
  • d_ptr(new CheshireCat(*other.d_ptr))
    --使用
    CheshireCat*
    值构造正在构造的
    PublicClass
    对象的
    d_ptr
    成员。(这是这个特殊的
    PublicClass
    构造函数的名称。)

换句话说,这行所做的就是复制
other
实例拥有的
CheshireCat
对象,并将该副本的所有权赋予正在构造的
PublicClass
对象。

表达式
*other.d_ptr
被解析为等价于
*(other.dptr)
。让我们使用语法
dptr(new CheshireCat(*other.dptr))
并从内到外确定它在做什么:

  • 其他
    ——声明的
    公共类常量&
  • other.d_ptr
    ——一个
    唯一的\u ptr常量&
    ,是对
    other
    d_ptr
    实例成员的引用
  • *other.d_ptr
    ——调用
    unique_ptr
    对象上的
    操作符*
    ,将产生类型为
    CheshireCat const&
    (对
    unique_ptr
    对象拥有的对象的引用)
  • new CheshireCat(*other.d_ptr)
    ——获取这个
    CheshireCat常量&
    ,堆通过调用
    CheshireCat
    类型的复制构造函数来分配一个新的
    CheshireCat
    对象。此表达式的类型为
    CheshireCat*
  • d_ptr(new CheshireCat(*other.d_ptr))
    --使用
    CheshireCat*
    值构造正在构造的
    PublicClass
    对象的
    d_ptr
    成员。(这是这个特殊的
    PublicClass
    构造函数的名称。)

换句话说,这行所做的就是复制
other
实例所拥有的
CheshireCat
对象,并将该副本的所有权授予正在构造的
PublicClass
对象。

C++默认情况下在用户未定义副本构造函数时提供副本构造函数:

该行:

d_ptr(new CheshireCat(*other.d_ptr))

就是简单地取消对现有
CheshireCat
对象的指针的引用,并复制它以实例化一个新的
CheshireCat
对象,该对象是
d\u ptr
到实例化对象所指向的。

C++默认情况下在用户未定义一个构造函数时提供一个复制构造函数:

该行:

d_ptr(new CheshireCat(*other.d_ptr))

就是简单地取消对现有
CheshireCat
对象的引用,并复制它来实例化一个新的
CheshireCat
对象,
d_ptr
指向实例化对象。

技术上不正确。C++不提供简单的复制构造函数,它提供默认的。在部分小写复制构造函数下读取引用的链接:“如果所有的这些都是真的,则T类的复制构造函数是微不足道的:它不是用户提供的(即隐式定义或默认)。,如果为默认值,则其签名与隐式定义的签名相同;T没有虚拟成员函数;T没有虚拟基类;为T的每个直接基选择的复制构造函数是平凡的;为T的每个非静态类类型(或类类型的数组)成员选择的复制构造函数是平凡的;”你自己的链接与你相矛盾<代码>为T的每个非静态类类型(或类类型的数组)成员选择的复制构造函数很简单。这里没有任何东西表明
d_ptr(new CheshireCat(*other.d_ptr))