码迷,mamicode.com
首页 > 编程语言 > 详细

C++声明和定义

时间:2014-05-06 00:35:03      阅读:427      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   ext   

目录

 

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++声明和定义

标签:style   blog   class   code   java   ext   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!