首页 > 编程语言 > 详细

C++声明和定义

时间:2014-05-06 00:34:26      阅读:493      评论:0      收藏:0      [点我收藏+]

目录

 

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

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

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

bubuko.com,布布扣
extern int i = 10; // 这是声明且是定义 
bubuko.com,布布扣

            3.1.2 声明类型

bubuko.com,布布扣
struct User; // 这是声明不是定义
bubuko.com,布布扣

            3.1.3 声明方法

bubuko.com,布布扣
double _sqrt(double); // 这是声明不是定义
bubuko.com,布布扣

 

  3.2 声明且是定义的情况

bubuko.com,布布扣
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; };
bubuko.com,布布扣

  

  3.3 特殊情况

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

bubuko.com,布布扣
extern int i = 10; // 这是定义
bubuko.com,布布扣

    3.3.2 使用typedef

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

       C++的作者认为

bubuko.com,布布扣
typedef comple<short> Point; // C++的作者认为这是定义
bubuko.com,布布扣

        但是对于这种情况呢?

bubuko.com,布布扣
struct User; // 这是声明非定义 typedef User USER; // 这是不是定义呢?
bubuko.com,布布扣

     3.3.3 类定义中的成员变量

bubuko.com,布布扣
struct Date 
{ 
    int y; // 这是定义 
}
bubuko.com,布布扣

 

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

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

bubuko.com,布布扣
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;//这个才是定义
bubuko.com,布布扣

 

 我的观点:

bubuko.com,布布扣
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;//这个是初始化
bubuko.com,布布扣

 

 

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

C++声明和定义

原文:http://www.cnblogs.com/lovers/p/cpp_definition_decalartion.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!