在 class 成员函数中将 const 引用作为函数参数传递
Passing a const reference as a function parameter in a class member function
假设我们有一个名为 Line
的 class,它包含以下为 class 数据成员赋值的修饰符。
void Start(const Point &start);
行class包含两个名为start和end的数据成员,它们都是Point对象。由于函数参数中的start
变量是一个引用,我实现如下:
void Line::Start(const Point &start) {
m_start = start;
}
在主要功能中我有以下内容。
Line line;
Point start(1, 1);
line.Start(start);
m_start
数据成员现在会直接引用主函数中的 start
Point
对象吗?
Would the m_start data member now refer directly to the start Point
object in the main function since it was passed by reference?
没有。 C++ 引用的一个属性(以及它们的行为不同于指针的一种方式)是不可能 重新设置 一个引用——也就是说,你不能参考 'referring to' 是一回事,后来 'refer to' 又是另一回事。 (当然,如果您的 m_start
成员变量是 Point
类型而不是 Point &
类型,那么无论如何都不会引用 attempt-to-reseat )
相反,start
的复制构造函数将被调用以将 start
的内容复制到您的 m_start
成员变量中。
结果是您的 Start()
方法的行为与类似实现的 void Line::Start(Point start)
方法完全一样,但有以下例外:
在您的 const Point &
版本的 Start()
中,没有创建 Point 对象的 separate/method-local 副本
在您的 const Point &
版本的 Start()
中,尝试从方法内部修改 start
将是一个编译时错误(而在 pass-按值版本,Start()
中的代码可以修改参数,但修改在 Start()
函数外部永远不可见,因为它们只会修改本地 variable/parameter)
假设我们有一个名为 Line
的 class,它包含以下为 class 数据成员赋值的修饰符。
void Start(const Point &start);
行class包含两个名为start和end的数据成员,它们都是Point对象。由于函数参数中的start
变量是一个引用,我实现如下:
void Line::Start(const Point &start) {
m_start = start;
}
在主要功能中我有以下内容。
Line line;
Point start(1, 1);
line.Start(start);
m_start
数据成员现在会直接引用主函数中的 start
Point
对象吗?
Would the m_start data member now refer directly to the start Point object in the main function since it was passed by reference?
没有。 C++ 引用的一个属性(以及它们的行为不同于指针的一种方式)是不可能 重新设置 一个引用——也就是说,你不能参考 'referring to' 是一回事,后来 'refer to' 又是另一回事。 (当然,如果您的 m_start
成员变量是 Point
类型而不是 Point &
类型,那么无论如何都不会引用 attempt-to-reseat )
相反,start
的复制构造函数将被调用以将 start
的内容复制到您的 m_start
成员变量中。
结果是您的 Start()
方法的行为与类似实现的 void Line::Start(Point start)
方法完全一样,但有以下例外:
在您的
const Point &
版本的Start()
中,没有创建 Point 对象的 separate/method-local 副本在您的
const Point &
版本的Start()
中,尝试从方法内部修改start
将是一个编译时错误(而在 pass-按值版本,Start()
中的代码可以修改参数,但修改在Start()
函数外部永远不可见,因为它们只会修改本地 variable/parameter)