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 声明来自其他文件的非初始化变量

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

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

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

            3.1.2 声明类型

struct User; // 这是声明不是定义

            3.1.3 声明方法

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

 

  3.2 声明且是定义的情况

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; };

  

  3.3 特殊情况

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

extern int i = 10; // 这是定义

    3.3.2 使用typedef

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

       C++的作者认为

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

        但是对于这种情况呢?

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

     3.3.3 类定义中的成员变量

struct Date 
{ 
    int y; // 这是定义 
}

 

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

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

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;//这个才是定义

 

 我的观点

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++声明和定义,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。