C++声明和定义

2020-11-28 09:13

阅读:543

标签:style   blog   class   code   java   ext   

目录

1 参考

2 概念

2.1 声明

2.2 定义

3 对比

3.1 声明但不是定义的情况

3.2 声明且是定义的情况

3.3 特殊情况

 

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

soscw.com,搜素材
extern int i; // 这是声明不是定义,变量i的定义在其他文件中
soscw.com,搜素材

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

soscw.com,搜素材
extern int i = 10; // 这是声明且是定义 
soscw.com,搜素材

            3.1.2 声明类型

soscw.com,搜素材
struct User; // 这是声明不是定义
soscw.com,搜素材

            3.1.3 声明方法

soscw.com,搜素材
double _sqrt(double); // 这是声明不是定义
soscw.com,搜素材

 

  3.2 声明且是定义的情况

soscw.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  T _abs(T a) { return a 0 ? -a : a; }
enum Beer { Carlsberg, Tuborg, Thor};
namespace NS { int a; };
soscw.com,搜素材

  

  3.3 特殊情况

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

soscw.com,搜素材
extern int i = 10; // 这是定义
soscw.com,搜素材

    3.3.2 使用typedef

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

       C++的作者认为

soscw.com,搜素材
typedef compleshort> Point; // C++的作者认为这是定义
soscw.com,搜素材

        但是对于这种情况呢?

soscw.com,搜素材
struct User; // 这是声明非定义 typedef User USER; // 这是不是定义呢?
soscw.com,搜素材

     3.3.3 类定义中的成员变量

soscw.com,搜素材
struct Date 
{ 
    int y; // 这是定义 
}
soscw.com,搜素材

 

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

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

soscw.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;//这个才是定义
soscw.com,搜素材

 

 我的观点

soscw.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;//这个是初始化
soscw.com,搜素材

 

 

C++声明和定义,搜素材,soscw.com

C++声明和定义

标签:style   blog   class   code   java   ext   

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


评论


亲,登录后才可以留言!