为什么我们必须在复制构造函数的参数中使用引用而不是指针
Why we have to use a reference in argument of copy constructor instead of a pointer?
为什么我们必须在复制构造函数的参数中使用引用而不是指针?这个问题是在一次采访中被问到的。我回答了以下几点:
- 引用不能为NULL 如果使用指针,那么它就不是复制构造函数。
- 标准对此有规定(第12.8.2节)。
但是面试官并不满意。他说这"与继承和虚函数有关"。我需要帮助或一些相关的点,我可以想到一个答案在那个方向。
你的观点看起来很有道理,我不明白你的面试官想从你这里听到什么。
但是,据我所知,为复制构造函数和赋值操作符启用统一的语法是Stroustrup引入引用的一个重要原因。例如,假设c++中没有引用,我们想做一些复制构造,通过指针传递一个参数:
class MyClass {
// Copy ctor and assignment operator are declared
// like this in our referenceless "C with classes" language:
MyClass(const MyClass* const);
MyClass* operator=(const MyClass* const);
};
MyClass a, b, c;
//Let's copy-construct:
MyClass d = &a; // Dereferencing looks ugly.
//Let's assign:
a = &b; // Dereferencing again.
// Even worse example:
a = b = c = &d; // Only the last variable should be dereferenced.
a = b = &c; // Awfully inhomogeneous code.
/*
The above line is equivalent to a = (b = &c),
where (b = &c) returns a pointer, so we don't need to
dereference the value passed to assignment operator of a.
*/
这显然不是内置类型的工作方式:
int a, b, c;
int d = a;
a = b = c = d;
因此引入了引用来解决这些不均匀性。
乌利希期刊指南
关于这一点的权威证明,请参考Stroustrup的《c++的设计和进化》的§3.7。不幸的是,我没有这本书的英文文本,但这一章的第一句话是(回译成英文):
引用主要是为了支持操作符重载而引入的。
在接下来的几页中,Stroustrup深入讨论了这个主题。
你的面试官错了,你是对的。
你的答案最重要的方面是2。和3(本质上是相同的点,但措辞不同):因为标准规定了(见12.8.2):
类
X
的非模板构造函数是复制构造函数,如果它的第一个形参是X&
,const X&
,volatile X&
或const volatile X&
类型,并且没有其他形参或所有其他形参都有默认实参(…)。
我们使用引用而不是指针,因为标准是这样规定的。否则它就不是复制构造函数。
当涉及到继承和虚函数时,引用可以做指针所能做的一切。
正如Gautam Jha在评论中指出的那样,您可以提供的唯一另一个原因是引用允许您从临时副本中创建副本。
相关文章:
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题