Str*_*ory 2 c++ const type-conversion
有没有一种简单的方法将非const C++结构(通过指针)传递给函数,并确保该函数不能更改结构的成员?
例如:从配置文件加载结构,这需要结构为非const.但是然后一个指向结构的指针被传递给一个不允许改变任何东西的函数.
我已经通过创建结构的第二个逐字"const"副本,并且繁琐地复制每个成员来看到这一点.这看起来很奇怪.我是C#程序员,所以也许这就是它在C++中完成的方式......?
在C++中,您可以传递大对象作为引用或指针,它们都被称为"按引用调用",而不是"按值调用",其中进行复制.指针语法由C语言继承,与C++引用不同.
要使编译器抱怨对象的更改,您必须使用const关键字.当然,const无论如何你都可以把目标转移到更改的位置,但是const不推荐使用它.
让我们假设您在以下示例中有一个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 */
Run Code Online (Sandbox Code Playgroud)
该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 */
Run Code Online (Sandbox Code Playgroud)
参数是指针类型,指向此指针无法更改的数据.您还可以使用以下命令使指针保持不变: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 */
|
Run Code Online (Sandbox Code Playgroud)
你也可以结合起来使两者保持不变:
|
const BigObject * const input /* constant pointer to constant BigObject */
|
Run Code Online (Sandbox Code Playgroud)
const关键字的位置与引用无关.一个参考始终恒定(这是隐含的,没有明确地命名),意味着它不能引用到另一个对象,一旦它被设定.然而,该对象是可变的.这意味着const右侧的关键字&将是多余的,不会更改任何内容,只是不要使用它.你应该区别对待:
BigObject& input /* reference to BigObject */
const BigObject& input /* reference to constant BigObject */
BigObject const & input /* same as before, I don't use this */
Run Code Online (Sandbox Code Playgroud)