Определите переменные в c ++ - PullRequest
3 голосов
/ 12 октября 2011

Я всегда путаюсь с понятием «определить переменную». Что означает определение?

Например:

void main {
map<int,int> *infoMap;

if() {
//some check here,if it passes this check, then new infoMap
}

infoMap = new infoMap; 

}

Так же

map<int,int> *infoMap;

или

map<int,int> *infoMap = new inforMap;

определить переменную?

Ответы [ 6 ]

6 голосов
/ 12 октября 2011

Верхним является объявление , или, если хотите, определение . Здесь компилятор выделяет место для переменной.

Нижним является назначение . Здесь компилятор заполняет пространство, выделенное во время определения. Вы можете иметь более одного присваивания, если хотите изменить значение переменной на другое.

5 голосов
/ 12 октября 2011

Вот случайная, неполная иллюстрация:

class Foo;   // (incomplete forward) class declaration

class Foo {  //  class definition
  int a;           //  member declaration + definition
  int b(int, int); //  member function declaration
  static int c;    //  static member declaration
};

int Foo::b(int a, int b) { return a+b; }  // member function definition
int Foo::c;                               // static member defintion

int bar(int);   // free function declaration

int main() {    // free function declaration + definition
  int q;        // declaration + definition
  q = bar(0);
  return q;
}

int bar(int a) { return 2 * a; }  // free function definition

Возможно, «определение статического члена» является уникальным в том смысле, что оно предоставило фактический экземпляр объекта (т.е. размещение плюс конструкция) для объекта, который был объявлен в другом месте. Это сравнимо только с чисто внешним выражением:

extern int N;  // declaration only, no definition

Не путать с объявлением + определение с внешней видимостью:

extern const int M = 11;  // declaration and definition
2 голосов
/ 12 октября 2011

Определить что-то в C ++ означает привязать идентификатор (в данном случае указатель на map<int, int>) к некоторому хранилищу, в отличие от объявления, которое связывает только идентификатор с типом и не выделяет хранилище.Если компилятору не нужна какая-либо информация об определении типа (т.е. ему нужен только тип), то вы можете просто обойтись без объявления.В противном случае вам нужно определение.

2 голосов
/ 12 октября 2011
map<int,int> *infoMap;

infoMap является декларацией.Обычно, когда происходит инициализация вместе с объявлением, это называется определением переменной.

1 голос
/ 12 октября 2011

С переменными определить и объявить, как правило, можно использовать взаимозаменяемо.Однако есть небольшая разница.

В большинстве случаев вы фактически определяете переменную.

map<int,int> *infoMap;

Термин «определить» объявляет символ и дает ему сущность, место для хранения переменной,структура / тело класса, реализация функции.

В некоторых случаях вы можете "объявить" переменную, используя ключевое слово extern.Это в основном сообщает компилятору о существовании имени символа и его типа, но не выделяет для него место.Пространство выделено в другом месте, где переменная фактически определена.

// foo.c
extern int bar;

// bar.c
int bar;
0 голосов
/ 12 октября 2011

Когда вы объявляете переменную в c ++, вы резервируете место в памяти для нее, но в память не записывается.Это объявление происходит в

map<int,int> *infoMap;

. Оно может содержать что угодно.Когда вы определяете переменную, вы фактически устанавливаете для нее какое-то значение, в этом случае новый infoMap.

...