C++声明与定义的区别

Introduce

声明

声明一个变量只是将变量名标识符的有关信息告诉编译器,使编译器“认识”该标识符,但声明不一定引起内存的分配(没有内存分配)。声明有两个作用:

  • 告诉编译器,这个名字已经匹配到一块内存上,下面的代码用到变量或者对象是在别的地方定义的。声明可以出现多次。
  • 告诉编译器,这个名字已经被预定了,别的地方再也不能用它来作为变量名或对象名。
class MyClass
{
  //数据成员细节...
  //成员函数细节...
};

上述声明仅告诉编译器有自定义类型MyClass,编译器仅对其进行语汇分析及名字的决议,并未占用内存!

定义

定义就是(编译器)创建一个对象,为这个对象分配一块内存,并给它取上一个名字,这个名字就是就是我们经常所说的变量名或对象名。

在C++程序中,大多数情况下变量声明也就是变量定义,声明变量的同时也就完成了变量的定义,只有声明外部变量时例外。

声明Vs定义: 是声明还是定义,判断的原则是看是否占用内存

class MyClass //类的声明,无内存占有
{
  string myString; //string的声明
};

这里面的string myString;实在类的声明里面,并没有实际申请内存,所以这就是声明,因为它并没有实际申请内存。

#include<iostream>

//全局作用域
string myString;//定义,myString是实例化的string!

int main()
{
  //Main函数体内
  string myAnotherString;//定义,myAnotherString是实例化的string!
  return 0;
}

这里面的string myString;是全局定义,全局对象一开始就是要申请内存的。

小结:变量和对象不加extern永远是定义,类中的除外。 函数只有函数头是声明,有函数体的是定义。类永远只是声明。类成员函数的函数体是定义。

class MyClass
{
    static int x; //这里的x是声明
    static const int a; //这里的a是声明
    //非static变量在类实例化时才分配内存.
    MyClass();//这里的函数是声明
};
int MyClass::x;//这是定义
const int MyClass::a=11;//这是定义
//这里的Fun是定义,因为有函数体
int  fun(int a,int b)
{  
    int  c;
    c=a+b;
    return c;
}

//这里的Fun是声明,因为这里只有函数头
int  fun(int a,int b);
Terry Tang
Terry Tang
Software Development Engineer

My research interests include distributed robotics, mobile computing and programmable matter.

comments powered by Disqus

Related