在C++;,使别名为常量 我是C++初学者,我有一个问题我想确定…我在网上搜索过很多。p>

在C++;,使别名为常量 我是C++初学者,我有一个问题我想确定…我在网上搜索过很多。p>,c++,alias,C++,Alias,假设我有一个类调用a,它有一个函数名为Afunction。该函数如下所示: // this is pseudocode void Afunction (const A& a) { a.something = a.something +1; } 我的理解是我们有一个“类似指针”的东西叫做“a”,它是我们传入的任何东西的别名。在这里,我们只确保别名本身是const,但不能保证它所指向的值不会更改。事实上,我正在改变它…我没有得到任何错误 所以我的问题是,如何确保别名指向的值不能更改?如果

假设我有一个类调用a,它有一个函数名为Afunction。该函数如下所示:

// this is pseudocode
void Afunction (const A& a)
{
 a.something = a.something +1;
}
我的理解是我们有一个“类似指针”的东西叫做“a”,它是我们传入的任何东西的别名。在这里,我们只确保别名本身是const,但不能保证它所指向的值不会更改。事实上,我正在改变它…我没有得到任何错误

所以我的问题是,如何确保别名指向的值不能更改?如果它是指针而不是别名,则更容易实现


提前感谢。

如果编译器接受该代码,您应该立即放弃它

不能修改
a

常量&
(不幸地等同于
常量a&
)是对
常量
对象的引用

类似地,
A const*
是指向
const
对象的指针,
A*const
是指向对象的
const
指针,
A const*const
是指向
const
对象的*
const
指针


关键是从右到左读取(和写入)类型声明

这完全取决于什么是
某物

如果你发布了A类的代码,那么解释为什么你可以更改
某些东西将更容易

通常,您不能修改
常量A&
的内容。但是

  • something
    可以是静态的,那么const并不重要,因为
    something
    在技术上不属于
    a函数中的
    a
    变量
  • 可以声明
    可变的东西
    。有时,即使对象是常量,也可以更改成员变量是有益的。例如,引用计数
  • 某物
    可能是完全不同的东西,具有奇怪的语义。(正如ZYX2000所指出的)
该代码不应编译。如果
A::something
属于赋值运算符重载的类型,并且声明为
const
,则该代码实际上可以编译。(除非我遗漏了什么)如果A::something是可变的,它也可以编译。
//这是伪代码
。。。嗯,show
//real code
@Zyx2000嘿,仅仅因为它可以,并不意味着它应该!有公共可变数据是不寻常的。@juanchopanza这不是语法错误@亚历克斯张伯伦我同意这是罕见的。但这是可能的。你完全正确。打字前我应该先喝杯咖啡。