3

我总是对“定义变量”这个概念感到困惑。定义是什么意思?

例如:

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;

定义一个变量?

4

6 回答 6

6

最上面的一个是声明,或者如果你喜欢,定义。在这里,编译器为变量分配空间。

最下面的是一个任务。在这里,编译器填充它在定义时分配的空间。如果要将变量的值更改为其他值,则可以有多个赋值。

于 2011-10-12T13:37:59.930 回答
5

这是一个随机的、不完整的插图:

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
于 2011-10-12T13:44:31.837 回答
2
map<int,int> *infoMap;

infoMap是声明。通常当有初始化和声明时,它被称为定义变量。

于 2011-10-12T13:38:44.747 回答
2

在 C++ 中定义某些东西是将标识符(在本例中为指向 a 的指针map<int, int>)绑定到某个存储,而不是仅将标识符绑定到类型而不分配存储的声明。如果编译器不需要关于类型定义的任何信息(即它只需要类型),那么您只需声明即可。否则你需要一个定义。

于 2011-10-12T13:41:36.760 回答
1

与变量一起定义和声明往往可以互换使用。但是有一个细微的差别。

在大多数情况下,您实际上是在定义变量。

map<int,int> *infoMap;

术语“定义”声明了一个符号并赋予它实质、变量的存储空间、结构/类主体、函数实现。

extern在某些情况下,您可以使用关键字“声明”变量。这基本上通知编译器符号名称及其类型的存在,但不为其分配空间。空间分配在实际定义变量的其他地方。

// foo.c
extern int bar;

// bar.c
int bar;
于 2011-10-12T13:45:31.377 回答
0

当您在 c++ 中声明一个变量时,您会在内存中为它保留空间,但不会写入内存。这个声明发生在

map<int,int> *infoMap;

它可以包含任何东西。当您定义变量时,您实际上将其设置为某个值,在这种情况下是一个新的 infoMap。

于 2011-10-12T13:45:54.917 回答