2012-02-03 2 views
5

Предположит, у меня есть функция, которая принять константный аргумент ссылки пропуска,C++ функция: передать ноны константного аргумента константной ссылки параметру

int func(const int &i) 
{ 
    /* */ 
} 

int main() 
{ 
    int j = 1; 
    func(j); // pass non const argument to const reference 
    j=2; // reassign j 
} 

этот код работает fine.according на грунтовку C++, что это аргумент, переходя к этой функции походит следующим образом,

int j=1; 
const int &i = j; 

, в котором я это синоним (псевдоним) ямайских,

мой вопрос: если я это синоним J, и я определяется как константы, я s код:

сопзЬ Int & I = J

redelcare неофициальный переменную константный на константные переменную? почему это выражение является законным в C++?

ответ

12

Ссылка - это const, а не объект. Это не меняет того факта, что объект изменен, но у вас есть одно имя для объекта (j), через которое вы можете его изменить, и другое имя (i), через которое вы не можете.

В случае константным опорного параметра, то это означает, что main может изменить объект (так как он использует свое имя для него, j), в то время как func не может изменить объект до тех пор, как он использует только свое имя это, i. funcможет в принципе изменить объект, создав еще одну ссылку или указатель на нее с помощью const_cast, но это не так.

+0

Вы имеете в виду ссылку не сам объект. то как понимать i является синонимом j? означает ли это, что i и j являются одним и тем же объектом, поскольку оба i и j имеют один и тот же физический адрес? – fuyi

+0

i - альтернативная ссылка на объект j. Итак, синоним. Вы, однако, сказали, что не можете использовать «i» для изменения объекта, на который он ссылается. Ничто не говорит, что вы не можете использовать какой-либо другой способ изменения объекта, к которому я обращаюсь. Вы ограничиваете возможности i этим объявлением, а не пытаетесь их расширить, и все в порядке. –

+1

@xiaopang: ''i'' и '' j'' - это имена. Оба они относятся к одному и тому же объекту. Часто мы говорим, что что-то «есть» его имя, или что «это» объект. Например, я могу сказать: «Я Стив». Но это неявная терминология, эти два не одно и то же. Я также могу сказать: «Стив» начинается с капитала «S». Это не означает, что * I * начинается с капитала «S». Кавычки вокруг «Стива» указывают, что я говорю об имени, а не о том, к чему он относится. 'i' и' j' являются синонимами, потому что они оба являются именами для одного и того же объекта, но их свойства как имена разные. –

3
const int &i = j; 

Это объявление ссылки на постоянное целое число. Используя эту ссылку, вы не сможете изменить значение целого числа, которое оно ссылается.

Вы все равно можете изменить значение, используя исходное имя переменной j, просто не используя константную ссылку i.

Смежные вопросы