константный параметр - PullRequest
3 голосов
/ 19 июля 2011

В C ++ имеет ли смысл следующее:

main()
{
 int a=10;
 fun(a);
}

void fun(const int a)
{
...
}

Я вижу программу, похожую на эту компиляцию, но с проблемами компоновщика. Я просто хотел убедиться, что присвоение неконстантных переменных константным переменным возможно в C ++.

Ответы [ 6 ]

5 голосов
/ 19 июля 2011

Да, все в порядке.

a нельзя переназначить в fun(), точно так же, как если бы это было объявлено таким образом:

void fun(int param)
{
    const int a(param);

    ...

    a = 5; // this is illegal and won't compile.
}

По мере передачив любом случае, main() a не оказывает никакого влияния.Даже если fun() s a был объявлен как неконстантный и измененный.

3 голосов
/ 19 июля 2011

В объявлении функции верхний уровень 1 const удаляется компилятором, пока он сохраняется в определении.

Причина в том, что элемент верхнего уровня скопирован , и с точки зрения вызывающей стороны на самом деле не имеет значения, является ли копия постоянной или нет, так что с этой стороны const-несс не проблема.С другой стороны, в определении функции сохраняется константа аргумента, поскольку она может помочь компилятору обнаружить непреднамеренные изменения аргумента внутри функции.

Итак, в основном:

void foo( int );
void foo( const int );    // redeclaration of the same function
void foo( const int x ) {
   ++x;                   // error: x is const!!
}

В приведенном выше коде есть два точно эквивалентных объявления foo (компилятор удалит const из объявления) и одно определение.Поскольку в сигнатуре foo в определении x объявлено постоянное целое число, компилятор будет жаловаться, если вы попытаетесь увеличить его.

Некоторые люди будут использовать const в определениизаставить компилятор пометить ++x как ошибочный, но это не распространено.С другой стороны, независимо от того, объявлен ли аргумент как int или const int, для вызывающей стороны они одинаковы.

1 Обратите внимание, что это относится только к верхнему уровню const, который применим к аргументам, передаваемым по значению и указателям, но никогда не к ссылкам (ссылка всегда константная: вы не можете переназначить ссылку).Итак, это разные объявления функций:

void f( int& );
void f( int const & );
void f( int* );            // equivalent to void f( int * const )
void f( int const * );     // equivalent to void f( int const * const )
3 голосов
/ 19 июля 2011

Было бы разумно, если бы вы добавили возвращаемые типы к своим функциям и предварительно объявили fun перед тем, как вызывать его (или изменили порядок своих функций в этом модуле компиляции).

Для простого int это ничего не меняет для вызывающей стороны - вызываемая функция не может изменить значение этой переменной в вызывающей стороне независимо от этого квалификатора. Но для вызываемой функции параметром является const, поэтому он не может быть изменен - ​​это имеет значение, не уверенный, если это вообще "полезно" или нет.

Теперь рассмотрим это:

int foo(int& a);
int bar(int const& a);

Это два разных зверя. bar может читать только a и может принимать либо int, либо const int (или const int&).

foo, с другой стороны, может изменить a, если сочтет нужным, и не может взять const.

См. Запись Constкорректность в C ++ FAQ Lite для получения дополнительной информации об этом, включая информацию о том, как это применяется (или нет) к const-pointers, pointers-to-const и const-pointer -в-Const.

2 голосов
/ 19 июля 2011

Это не имеет особого смысла, потому что в функции вы получаете копию переменной, а не саму переменную.Но это законно.

0 голосов
/ 19 июля 2011

«Назначение» в порядке - новая переменная в забаве, которая остается постоянной внутри забавы.

Но у fun должен быть тип возврата, то есть void. И прежде чем использовать его в main, должно быть объявление о веселье.

0 голосов
/ 19 июля 2011

Вы можете назначить неконстантный констант

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...