在 C++ 中,您可以将大对象作为引用或指针传递,这两者都称为“按引用调用”,而“按值调用”则进行复制。指针语法由 C 语言继承,与 C++ 引用不同。
要让编译器抱怨对象的更改,您必须使用 const 关键字。当然,您无论如何都可以将constness 转换为更改值,但根本不建议将constness 转换为离开。
对于以下示例,假设您有一个类 BigObject 和一个公共成员 a,它是一个整数 int。
1.
引用调用(&:引用类型):
void function(const BigObject& input)
{
int a = input.a; /* read from BigObject */
input.a = 42; /* the compiler will fail! */
}
/* call that function */
BigObject input();
function(input); /* no address operator needed */
const 关键字将使引用&(不是此处的地址运算符)引用此引用无法更改的数据。如果你尝试编译器会编译失败。
2。
引用调用(*:指针类型):
void function(const BigObject* input)
{
int a = input->a; /* read from BigObject */
int b = (*input).a /* alternative to -> */
input->a = 42; /* the compiler will fail! */
}
/* call that function */
BigObject input();
function(&input); /* pass address */
参数是一个指针类型,它指向不能被这个指针改变的数据。您也可以通过使用:const BigObject* const input 使指针保持不变,更多说明如下。
下面是引用和指针的区别:
- 需要取消引用指针,这是通过取消引用(星号)
operator * 或使用 -> 对类/结构成员完成的,请参见上面的代码。
- 您还必须使用地址运算符
& 传递对象的地址以获取指针。
- 另一个区别是,引用不能是
NULL,它们必须是有效的,但指针可以指向NULL。
const关键字的位置:
const 关键字的位置决定了什么应该是常量,是指针还是指针指向的对象。
一般来说,如果您只是想到一条穿过*(星号)的垂直线,您会更容易记住以下内容。如果const 在* 的左侧,它将应用于类型(对象),如果在右侧,它将应用于指针:
|
BigObject * input /* pointer to BigObject */
const BigObject * input /* pointer to constant BigObject */
BigObject const * input /* same as before, I don't use this */
BigObject * const input /* constant pointer to BigObject */
|
您也可以将它们结合起来使两者保持不变:
|
const BigObject * const input /* constant pointer to constant BigObject */
|
const 关键字的位置与引用无关。 reference is always constant(这是隐式的,没有显式命名)意味着一旦设置它就不能引用另一个对象。然而,该对象是可变的。这意味着& 右侧的const 关键字将是多余的,不会改变任何东西,只是不要使用它。您应该只是在以下方面有所不同:
BigObject& input /* reference to BigObject */
const BigObject& input /* reference to constant BigObject */
BigObject const & input /* same as before, I don't use this */