将结构C++成员从非常量转换为常量

Convert C++ struct members from non-const to const

本文关键字:常量 转换 非常 结构 C++ 成员      更新时间:2023-10-16

有没有一种简单的方法可以将非常量C++结构(通过指针(传递到函数中,并确保该函数不能更改结构的成员?

例如:结构是从配置文件加载的,这要求结构是非常量。 但是,指向结构的指针被传递到不允许更改任何内容的函数中。

我已经看到这是通过创建结构的第二个逐字"const"副本来完成的,并且繁琐地复制每个成员。 这似乎很奇怪。 不过,我是一名 C# 程序员,所以也许这就是它在 C++ 中完成的方式......?

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关键字将使引用&(此处不是地址运算符(引用此引用无法更改的数据。如果您尝试编译器将编译失败。

阿拉伯数字。 按引用调用(*:指针类型(:

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关键字的位置在引用中无关紧要。引用始终是常量(这是隐式的,没有显式命名(,这意味着一旦设置了它就不能引用另一个对象。但是,该对象是可变的。这意味着&右侧的const关键字将是多余的,不会更改任何内容,只是不要使用它。您应该只是在以下两者之间有所不同:

BigObject&        input /* reference to BigObject           */
const BigObject&  input /* reference to constant BigObject  */
BigObject const & input /* same as before, I don't use this */

解决方案很简单:将指向 const 的指针传递给函数(或者,也许引用会更合适(。该函数将无法通过指向 const 的指针修改对象。