C++声明和定义

目录

 

1. 参考

  1. 《C++程序设计语言》4.9

  2. 《C++Primer》2.3.5

  3. http://bbs.csdn.net/topics/190026622

2. 概念

  2.1 声明

              声明用于向程序表明变量的类型名字。(引自参考2)

  2.2 定义

      变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义

3. 对比

    定义声明声明大部分是定义,少数情况不是定义

 

声明

定义

非定义

定义

是否可以出现多次

是否有内存分配

没有

是否可以直接使用该变量

不能

是否知道它的构成

不一定知道

知道

知道

   

  3.1 声明但不是定义的情况

      除了下面三种情况,声明全都是定义

            3.1.1 声明来自其他文件的非初始化变量

C++声明和定义
extern int i; // 这是声明不是定义,变量i的定义在其他文件中
C++声明和定义

                     注意如果对来自其他文件的变量进行初始化,那么这就是定义

C++声明和定义
extern int i = 10; // 这是声明且是定义 
C++声明和定义

            3.1.2 声明类型

C++声明和定义
struct User; // 这是声明不是定义
C++声明和定义

            3.1.3 声明方法

C++声明和定义
double _sqrt(double); // 这是声明不是定义
C++声明和定义

 

  3.2 声明且是定义的情况

C++声明和定义
int i;
char ch;
string s;
int count = 1;
const double pi = 3.14;
const char *name = "Njal";
const char *season[] = {"spring", "summer", "fall", "winter"};
struct Date { int d, m, y; };
int day(Date *p) { return p->d; };
template <typename T> T _abs(T a) { return a < 0 ? -a : a; }
enum Beer { Carlsberg, Tuborg, Thor};
namespace NS { int a; };
C++声明和定义

  

  3.3 特殊情况

    3.3.1 使用extern修饰变量,且初始化

C++声明和定义
extern int i = 10; // 这是定义
C++声明和定义

    3.3.2 使用typedef

       这是个纠结的问题,我现在还没想明白,如果你知道请回复我,谢谢。

       C++的作者认为

C++声明和定义
typedef comple<short> Point; // C++的作者认为这是定义
C++声明和定义

        但是对于这种情况呢?

C++声明和定义
struct User; // 这是声明非定义 typedef User USER; // 这是不是定义呢?
C++声明和定义

     3.3.3 类定义中的成员变量

C++声明和定义
struct Date 
{ 
    int y; // 这是定义 
}
C++声明和定义

 

下面是关于声明与定义的帖子的一个回复以及我的观点,读者可以参考。

论坛上某人的回复如下。(引自参考3)

C++声明和定义
1. 变量和对象不加extern永远是定义,类中的除外. 
2. 函数只有函数头是声明,有函数体是定义. 
3. 类永远只是声明.类成员函数的函数体是定义. 

class C 
{   
  static int x;//这里的x是声明   
  static const int a;;//这里的a是声明   
   //非static变量在类定义对象时才分配内存.  
    C();//这里的函数是声明
}; 
int C::x;//这个才是定义 
const int C::a=11;//这个才是定义
C++声明和定义

 

 我的观点

C++声明和定义
1. "变量和对象不加extern永远是定义"是片面的,例如特殊情况extern int i = 10就是定义。 
   "变量和对象不加extern永远是定义,类中的除外",我认为类中的变量和对象也是声明。 
2. "函数只有函数头是声明,有函数体是定义.",我认为是正确的。
3. "类永远只是声明.类成员函数的函数体是定义.",我认为类永远都是定义。 
class C 
{
   static int x;//这里的x是定义   
   static const int a;//这里的a是定义   
   C();//这里的函数是声明 
}; 
int C::x;//这个是初始化 
const int C::a=11;//这个是初始化
C++声明和定义

 

 

C++声明和定义,布布扣,bubuko.com

C++声明和定义

上一篇:Oracle 12cR1 RAC 在VMware Workstation上安装(中)—图形界面安装


下一篇:Java对象的序列化与反序列化