用于引用的C ++ const语义

时间:2011-12-28 20:39:31

标签: c++ reference const semantics

如果代码中有以下内容:

func(const base& obj)

const语义是什么意思?这里有什么不变的? obj是const reference to a non-const object还是non-const reference to a const object

8 个答案:

答案 0 :(得分:5)

objconst对象的引用。

没有“非const引用”这样的东西,因为在创建引用之后无法更改引用其他内容。

答案 1 :(得分:5)

没有“非const”引用这样的东西,也就是说,引用总是绑定到同一个对象,并且没有办法改变它。 “const type&”表示对const类型的引用。

答案 2 :(得分:2)

它被称为const引用。您对已传递的数据进行“参照访问”,但无法对其进行修改。

答案 3 :(得分:2)

如果没有const,您将无法将const对象发送到该函数。因此添加const总是有利的。特别是在为许多用户创建功能时。经典示例是setter函数。

x->setXsth(sth& obj)              // works only with  non-const object. 
x->setXsth(const sth& obj)        //works with  const object and non-const.

答案 4 :(得分:1)

obj是对const base的引用,因此它意味着不允许更改引用的对象。它可以写成

func(const base& obj)

func(base const & obj)

使用左右规则来读取此类声明类型,对于这个简单示例,只需从右侧读取即可。更多相关内容:

http://www.codeproject.com/KB/cpp/complex_declarations.aspx

答案 5 :(得分:0)

obj是对func()

参数中传递的对象(对象为const或非const)的常量引用

如果你写:func(B);

这意味着您无法在功能B

内更改func()的内容

func(const base& obj)

答案 6 :(得分:0)

一些未经请求的答案/观点: const 修饰符修改其左侧的任何内容,除了您正在使用的一个结构(在这种情况下,它修改了立即的任何内容)正确的)。我发现在我想修改的任何内容中,总是立即坚持 const 更容易,并从右到左阅读语句。也许这不是最好的做事方式,但它有助于我保持原状。

示例:

// these two statements are equivalent
const int x = 5; // special case usage
int const x = 5;

// using the LHS syntax makes multiple consts easier to understand
int const y = 6;
int const * const x = &y; // x is a const pointer to const int

// const can apply to pointers but not to references
int const & const z = y; // redundant, references are always const

答案 7 :(得分:-1)

正如其他答案所说,obj是对const base对象的引用。但是,这并不意味着它引用的对象具有base类型,或者它引用的对象是const,只是func无法修改{{} 1}} 通过 引用。例如:

obj

是合法的,并且:

struct derived : base { ... };
derived d;
func(d);
如果bool other_func(const base& b, other_object& o) { base b_copy = b; o.foo(); return b_copy == b; } 具有对false(或其内部内容)的内部非const引用,并且o修改b,则

可能会返回o.foo()。这对像

这样的功能有实际意义
b

天真的实现可能会对std::string::operator=(const std::string& other); 做错误。