将结构C++成员从非常量转换为常量
Convert C++ struct members from non-const to const
有没有一种简单的方法可以将非常量C++结构(通过指针(传递到函数中,并确保该函数不能更改结构的成员?
例如:结构是从配置文件加载的,这要求结构是非常量。 但是,指向结构的指针被传递到不允许更改任何内容的函数中。
我已经看到这是通过创建结构的第二个逐字"const"副本来完成的,并且繁琐地复制每个成员。 这似乎很奇怪。 不过,我是一名 C# 程序员,所以也许这就是它在 C++ 中完成的方式......?
C++中,您可以将大对象作为引用或指针传递,两者称为"按引用调用",而"按值调用"则进行复制。指针语法由 C 语言继承,与C++引用不同。
要使编译器抱怨对象的更改,您必须使用const
关键字。当然,无论如何,您都可以丢弃const
ness 来更改值,但根本不建议丢弃const
ness。
对于以下示例,假设您有一个类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 的指针修改对象。
- 为什么下面带有非常量转换函数的代码没有歧义?
- 如何将变量内容常量转换为 std::array 的大小?
- 将结构C++成员从非常量转换为常量
- 意外 (IMO) 常量转换警告
- 警告:ISO C++禁止将字符串常量转换为'char*' [-Wwrite-strings]
- 为什么无法将常量 X 转换为 X &?
- 重载常量和非常量转换运算符返回数组类型时出现 MSVC 错误 C2593
- 将字符串常量转换为char
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”
- 错误C2662无法从常量转换为引用
- 常量转换运算符的行为
- 如何在 C 中将多字符常量转换为整数
- 从字符串常量转换,c++ 中的指针
- 从字符串常量转换为字符*
- 在这里做常量转换安全吗
- boost序列化错误C4308:负整数常量转换为无符号类型
- 不赞成从字符串常量转换为“char*”[-Wwrite strings]
- C++非常量到常量转换编译错误
- C++-不赞成在第三方标头中从字符串常量转换为“char*”
- 空指针常量转换为右值