为什么我们在拷贝构造函数的参数中要使用引用而不是指针?这个问题在面试中被问到。我回答了以下几点:
- 引用不能为NULL。
- 如果我们使用指针,那么它就不是一个拷贝构造函数。
- 标准规定如此(第12.8.2节)。
我们使用引用而不是指针因为标准规定如此。否则就不是拷贝构造函数。如果类
X
的非模板构造函数的第一个参数是类型为X&
、const X&
、volatile X&
或const volatile X&
的引用,并且没有其他参数或者所有其他参数都有默认值(...),则它是类X
的拷贝构造函数。
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深入探讨了这个主题。
f(a+b)
-- 其中a和b是类A的对象,而f
是A::f(A obj)
。 - g-217