C++ 带有结构指针的类初始化列表
我正在看一个PIMPL习语的例子,发现了一行我真的不懂的代码。由于我是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
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))