использование const для предотвращения изменения типа данных и изменения значения - PullRequest
1 голос
/ 17 марта 2009

Есть ли разница между использованием const:

Невозможно изменить тип данных, но можно изменить значение a или b

int add(const int a, const int b);

Может изменить тип данных, но не может изменить значение a или b

int add(int const a, int const b);

Невозможно изменить тип данных и не может изменить значение a или b

int add(const int const a, const int const b);

Большое спасибо за любые предложения

Ответы [ 4 ]

8 голосов
/ 17 марта 2009

Я не знаю, как можно изменить тип данных переменной в C ++ ...

'const' - это обещание, которое вы даете компилятору об отсутствии изменения значения. Он жалуется, когда вы этого не делаете (вероятно, обнаруживая ошибку z в процессе). Это также помогает ему выполнять различные оптимизации.

Вот несколько примеров и что они означают:

f ( const int a  )

f не может изменить значение «a».

f ( int const a )

то же самое, но написано странным образом

f ( const int const a )

ничего не значит, gcc говорит мне "дубликат const"

f ( const int * pa )

f не может изменить значение, на которое указывает pa

f ( int * const pa )

f не может изменить значение указателя

f ( const int * const pa )

f не может изменить значение указателя или значение, указанное на

f ( int a ) const 

Функция-член f не может изменить свой объект

Надеюсь, это прояснит ситуацию.

8 голосов
/ 17 марта 2009

Разница между const int и int const:

int const и const int одинаковы.

Существует разница с указателями:

char sz[3] = "hi";

//const char* allows you to change what is pointed to,
//but not change the memory at the address that is pointed to
const char *p = sz;
p = "pi";//ok
//p[0] = 'p';//not valid, bad

//char * const allows you to change the memory at the address that is 
//pointed to, but not change what is pointed to.
char * const q = sz;
//q = "pi";//not valid, bad
q[0] = 'p';//ok

//or disallow both:
const char * const r = sz;
//r = "pi";//not valid, bad
//r[0] = 'p';//not valid, bad

Большую часть времени вы хотите использовать const char *.

Изменение типа varaible:

Вы не можете изменить тип переменной, но вы можете заново интерпретировать адрес переменной как другой тип. Для этого вы используете кастинг.

2 голосов
/ 17 марта 2009

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

На самом деле,

int add(const int a, const int b);

и

int add(int a, int b);

Или любая комбинация const в ней объявляет одну и ту же функцию. Снаружи они все одинаковы, и на самом деле имеют одинаковый тип. Это имеет значение только для определения функций. Если не поставить const

int add(int a, int b) { a++; /* possible, increment the parameter */ }

Вы можете изменить параметры (которые в этом примере являются копиями переданных аргументов). Но если вы введете const, параметры будут постоянными в определении функции

int add(int const a, int const b) {
    a++; // bug, a is a constant integer!
}

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

int add(int a, int b);

Затем, в определении, если вы хотите, чтобы параметр был const, вставьте const в.

#include "add.hpp"

// remember, const int and int const is the same. we could have written
// int add(const int a, const int b); too
int add(int const a, int const b) { return a + b; }

То же самое для функций-членов

struct foo {
    void f(int);
};

void foo::f(int const a) { ... }

Обратите внимание, что мы говорили только о const, который напрямую влияет на константу параметра. Существуют и другие константы, которые влияют на константность при использовании ссылок или указателей. Эти константы не , которые следует игнорировать, и они действительно важны.

1 голос
/ 17 марта 2009
const int x;

совпадает с

int const x;

Порядок ключевых слов не имеет значения. Это относится и к таким ключевым словам, как unsigned :

const unsigned int x;

int unsigned const x;

Это правило не применяется к указателям, но звездочка (*) - это не ключевое слово, это оператор. Таким образом, предыдущее правило не применяется:

const int *x;

Является ли не таким же, как:

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