C++ 使用类指针作为参数复制构造函数VS构造函数

C++ 使用类指针作为参数复制构造函数VS构造函数,c++,constructor,C++,Constructor,Q1:这个“自类类型指针构造函数”有一个合适的/正式的名称吗 Q2:为什么复制构造函数比“自类类型指针构造函数”更有名 或者在什么情况下我们必须使用复制构造函数而不是“自类类型指针构造函数” 它没有特别的名字,因为它没有什么特别的 复制构造函数“更有名”,因为它是特殊的。它之所以特别,是因为它是语言运作方式的基本组成部分。如果您没有声明副本构造函数,在大多数类中,都会隐式地为您定义一个副本构造函数。它涉及许多基本操作,例如: void foo(MyClass obj) // the copy c

Q1:这个“自类类型指针构造函数”有一个合适的/正式的名称吗

Q2:为什么复制构造函数比“自类类型指针构造函数”更有名

或者在什么情况下我们必须使用复制构造函数而不是“自类类型指针构造函数”


它没有特别的名字,因为它没有什么特别的

复制构造函数“更有名”,因为它是特殊的。它之所以特别,是因为它是语言运作方式的基本组成部分。如果您没有声明副本构造函数,在大多数类中,都会隐式地为您定义一个副本构造函数。它涉及许多基本操作,例如:

void foo(MyClass obj) // the copy ctor is (potentially) called to create this parameter
{
    ...
}

MyClass bar() // the copy ctor is (potentially) called when this function returns, and when it result is used
{
    ...
}

MyClass a;
MyClass b(a); // This calls the copy constructor
MyClass c = b; // So does this
请注意,在许多情况下,副本都经过了优化。看见此外,在C++11中,在以前调用复制构造函数的许多地方都会调用。但是move构造函数也可以在复制省略可能发生的地方进行优化

我想不出有多少理由你会使用你所说的“构造器”

另一方面,副本构造函数几乎应该始终具有以下签名:

MyClass(MyClass const &)
不是这个:

MyClass(MyClass &)

它没有特别的名字,因为它没有什么特别的

复制构造函数“更有名”,因为它是特殊的。它之所以特别,是因为它是语言运作方式的基本组成部分。如果您没有声明副本构造函数,在大多数类中,都会隐式地为您定义一个副本构造函数。它涉及许多基本操作,例如:

void foo(MyClass obj) // the copy ctor is (potentially) called to create this parameter
{
    ...
}

MyClass bar() // the copy ctor is (potentially) called when this function returns, and when it result is used
{
    ...
}

MyClass a;
MyClass b(a); // This calls the copy constructor
MyClass c = b; // So does this
请注意,在许多情况下,副本都经过了优化。看见此外,在C++11中,在以前调用复制构造函数的许多地方都会调用。但是move构造函数也可以在复制省略可能发生的地方进行优化

我想不出有多少理由你会使用你所说的“构造器”

另一方面,副本构造函数几乎应该始终具有以下签名:

MyClass(MyClass const &)
不是这个:

MyClass(MyClass &)

对C++中的对象,我们通常使用引用而不是指针。我们可以使用引用来获取对象的地址,而不是使用“.”来访问其方法或数据,它比“->”更简单、更直接。


在C++中,我们不需要使用“构造函数”.< /p> ,我们通常使用引用而不是指针。我们可以使用引用来获取对象的地址,而不是使用“.”来访问其方法或数据,它比“->”更简单、更直接。

我认为没有必要使用“构造函数”。

谢谢。您在复制构造函数的声明中是否遗漏了一个“&”?@milesma:在哪个复制构造函数的声明中?我直到刚才才声明一个,那是在你发布了那条评论之后,所以你不可能一直在谈论它。@BenjaminLindley他可能指的是
foo
@milesma:如果你指的是
foo
,就像Potatoswatter说的那样,那么不,那里什么都没有遗漏。我按值获取参数,因此调用复制构造函数(或移动构造函数)。如果那里有一个
&
,那么我将通过引用获取对象,并且不会调用构造函数。@milesma:是的,这是一个原因。可能是主要的。通过值传递和返回使用复制(或移动)构造函数。谢谢。您在复制构造函数的声明中是否遗漏了一个“&”?@milesma:在哪个复制构造函数的声明中?我直到刚才才声明一个,那是在你发布了那条评论之后,所以你不可能一直在谈论它。@BenjaminLindley他可能指的是
foo
@milesma:如果你指的是
foo
,就像Potatoswatter说的那样,那么不,那里什么都没有遗漏。我按值获取参数,因此调用复制构造函数(或移动构造函数)。如果那里有一个
&
,那么我将通过引用获取对象,并且不会调用构造函数。@milesma:是的,这是一个原因。可能是主要的。通过值传递和返回使用复制(或移动)构造函数。谢谢,实际上这也是我想的原因。但我仍然认为,对于复制构造函数来说,还有一些更为特殊的东西。这就是为什么我要发布这篇文章。@milesma除了Ben提供的答案之外,引用是特殊的,因为它们不能为空。指针构造函数可能会选择复制构造函数或默认构造函数,因此它不会太原始。@Potatoswatter+1 for reference不能为null,因此它在函数内部更安全。那么,如果提供了“检查指针”,我可以说“自类型指针构造函数”可以完成与复制构造函数相同的工作吗?@milesma它的功能由您决定。尽管标准对复制构造函数提出了一些要求,但对于传递给标准设施的对象,“指针构造函数”是您自己的域。我只是假设您的初衷是检查null,在这种情况下使用默认值。@Potatoswatter谢谢。实际上我知道如何编写复制构造函数;我可以确认符合标准。这篇文章只是想“挖掘”更深一点,以防我能找到一些宝藏(知道为什么复制构造函数很特别)。谢谢,实际上这也是我想的原因。但我仍然认为,对于复制构造函数来说,还有一些更为特殊的东西。这就是为什么我要发布这篇文章。@milesma除了Ben提供的答案之外,引用是特殊的,因为它们不能为空。指针构造函数可能会选择复制构造函数或默认构造函数,因此它不会太原始。@Potatoswatter+1 for reference不能为null,因此它在函数内部更安全。那么,如果提供了“检查指针”,我可以说“自类型指针构造函数”可以完成与复制构造函数相同的工作吗?@milesma它的功能由您决定。鉴于本标准对复制施工提出了一些要求