2013-04-01 29 views
2

我是C++的初学者,我有一个问题,我想确保...我已经在网上搜索过了。在C++中,做一个别名const

假设我有一个类调用A,它有一个名为Afunction的函数。该函数的样子:

// this is pseudocode 
void Afunction (const A& a) 
{ 
a.something = a.something +1; 
} 

我的理解是,我们有一个名为“A”的“类指针”的事情,它是一个别名,无论我们在通过这里我们只确保别名本身是常量,但。不保证它指向的价值不会改变。事实上,我正在改变它..而且我没有得到任何错误。

所以我的问题是,我如何确保别名指向的值不能更改?如果它的指针不是别名,它会容易得多...

在此先感谢。

+1

该代码不应编译。 – Pubby

+3

如果'A :: something'是一个赋值运算符被重载并声明为'const'的类型,那么代码*可以*实际编译。 (除非我错过了某些东西) –

+6

如果A :: something是可变的,它也可以编译。 –

回答

2

如果编译器接受该代码,则应该立即关闭它。您可以修改a

2

A const&(其unforunately相当于const A&)是参照const对象

同样,A const*指针const对象,同时A * constconst指向对象的指针和A const * const是* const指针const object`。

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

1

这一切都取决于什么是something

如果您发布了A类代码,将更容易解释为什么您可以更改something

一般来说,您不能修改const A&的内容。但是......

  • something可以是静态的,那么const不会因为something关系在技术上不属于a变量Afunction
  • something可以声明为mutable。有时候,即使对象是const,也可以改变成员变量是有益的。例如,引用计数。
  • something可能是完全不同的东西,奇怪的语义。 (正如Zyx 2000指出的那样)。
+0

公开可变数据是很少见的。 –

+0

@juanchopanza这不是一个语法错误。 [自己检查一下](http://ideone.com/b6f5sa)。 – milleniumbug

+0

@AlexChamberlain我同意这将是罕见的。但这是可能的。 – milleniumbug

相关问题