C ++ const семантика для справки - PullRequest
4 голосов
/ 29 декабря 2011

Если в коде есть что-то похожее на:

func(const base& obj)

что означает семантика const? Что здесь постоянно? Является ли obj const reference to a non-const object или non-const reference to a const object?

Ответы [ 8 ]

5 голосов
/ 29 декабря 2011

Не существует такой вещи, как «неконстантная» ссылка, то есть ссылка всегда привязана к одному и тому же объекту, и нет способа изменить это. «const type &» означает ссылку на const type.

5 голосов
/ 29 декабря 2011

obj - это ссылка на const объект .

Не существует такого понятия, как "неконстантная ссылка", поскольку ссылка не может быть изменена для ссылкипосле того, как оно было создано.

2 голосов
/ 29 декабря 2011

Без const вы не сможете отправить объект const в эту функцию. Так что всегда полезно добавить const. особенно когда вы создаете функцию для многих пользователей. Классическими примерами являются функции сеттеров.

x->setXsth(sth& obj)              // works only with  non-const object. 
x->setXsth(const sth& obj)        //works with  const object and non-const.
2 голосов
/ 29 декабря 2011

Это называется константной ссылкой. У вас есть «ссылочный доступ» к передаваемым данным, но вы не можете его изменить.

1 голос
/ 29 декабря 2011

obj - это ссылка на const base, поэтому это означает, что вам не разрешено изменять ссылочный объект.Он может быть записан как

func(const base& obj)

или

func(base const & obj)

Используйте правило правого левого для чтения таких типов объявлений, для этого простого примера просто прочитайте его справа.Подробнее об этом здесь:

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

0 голосов
/ 29 декабря 2011

Как уже говорилось в других ответах, obj является ссылкой на объект const base. Однако это не означает, что объект, на который он ссылается, имеет либо тип base, либо объект, на который он ссылается, const, просто func не может изменить 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, если o имеет внутреннюю неконстантную ссылку на b (или что-то внутри нее) и o.foo() изменяет b. Это имеет практическое значение для таких функций, как

std::string::operator=(const std::string& other);

, где наивная реализация может сделать неправильную вещь для my_str = my_str.

0 голосов
/ 29 декабря 2011

Отчасти нежелательный ответ / точка зрения: модификатор 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
0 голосов
/ 29 декабря 2011

obj - это постоянная ссылка на объект (является ли объект постоянным или не постоянным), передаваемый в аргументе func()

если вы напишите: func(B);

это означает, что вы не можете изменить содержимое B внутри функции func()

(где func(const base& obj))

...