C++声明和定义

目录



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


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++声明和定义,布布扣,bubuko.com

时间: 2025-01-04 10:23:56

C++声明和定义的相关文章

C++ 变量的声明与定义的区别

变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中定义的. 前者是“定义性声明(defining declaration)”或者称为“定义

C语言,函数的声明与定义

函数声明与定义 变量: 在讲变量前,先讲一下变量的声明和定义这两个概念. 声明一个变量,意味着向编译器描述变量的类型,但不为变量分配存储空间. 定义一个变量,意味着在声明变量的同时还要为变量分配存储空间,在定义变量的同时为变量初始化. 局部变量:通常只定义不声明. 全局变量:通常在源文件中定义,在头文件中声明. 在一个函数内部定义的变量成为局部变量,它在本函数内有效. 函数中的局部变量,如果不定义类型,其缺省是自动变量auto, 例如:int a,b=2; 其等价于auto int a,b =

变量声明和定义的区别

我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中定义的. 前者是“定义性声明(defining declaration)”或者称为“定义(definition

【C】 05 - 声明和定义

仅从形式上看,C程序就是由各种声明和定义组成的.它们是程序的骨架和外表,不仅定义了数据(变量),还定义了行为(函数).规范中的纯语言部分,声明和定义亦花去了最多的篇幅.完全说清定义的语法比较困难,这里也只是个人的理解. 1. 标识属性 对C编译器而言,标识(identifier)包括对象名.函数名.复合类型及枚举tag.typedef类型名.label和枚举常量.标识的各种属性构成了C的复杂功能,理清这些概念对C的高级使用尤其重要. 域(scope)可以看做是标识的活动范围,一个编译单元中该范围

【零基础学习iOS开发】【02-C语言】11-函数的声明和定义

在上一讲中,简单介绍了函数的定义和使用,只要你想完成一个新功能,首先想到的应该是定义一个新的函数来完成这个功能.这讲继续介绍函数的其他用法和注意事项. 一.函数的声明 1.在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用前面定义过的函数 1 int sum(int a, int b) { 2 return a + b; 3 } 4 5 int main() 6 { 7 int c = sum(1, 4); 8 return 0; 9 } 第5行定义的main函数调用

第2章 变量和基本类型 附2 --声明和定义的区别

变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间.----定义 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中定义的.-----声明 前者是“定义性声明(defining declara

【C++注意事项】2 变量声明和定义

不可能将所有的C++程序放到一个文件中咯,因此C++就支持了分离式编译(separate compilation)机制,它允许将程序分为若干个文件,每个文件可被独立编译.这样说明了,当你的程序有很多文件时,修改其中一个文件后不需要将所有文件都重新编译一遍,只需要编译修改过的就好,然后将它们都链接起来. C++是如何支持分离式编译的呢?通过将声明和定义分离开来. 声明(declaration)使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含该名字的声明. 定义(definition)

声明和定义的区别

声明部分的作用是对有关的标识符(如变量?函数?结构体?共用体等)的属性进行说明.对于函数,声明和定义的区别是明显的,函数的声明是函数的原型,而函数的定义是函数功能的确立.对函数的声明是可以放在声明部分中的,而函数的定义显然不在函数的声明部分范围内,它是一个文件中的独立模块. 在声明部分出现的变量有两种情况:一种是需要建立存储空间的(如int a;):另一种是不需要建立存储空间的(如extern int a;).前者称为定义性声明(defining declaration),或简称为定义(defi

变量声明和定义的关系

extern int i;    //声明i而非定义i int j;        //声明并定义j 任何包含了显示初始化的声明即成为定义.我们能由extern关键字标记的变量赋一个初始值,但是这么做也就抵消了extern的作用.extern语句如果包含初始值就不再是声明,而变成定义了: extern double pi = 3.1416;    //定义 在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误. Note:变量能且只能被定义一次,但是可以被多次声明

C++全局变量的声明和定义

(1)编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件: 第二步,将工程中所有的obj文件进行LINK,生成最终.exe文件. 那么,错误可能在两个地方产生: 一个,编译时的错误,这个主要是语法错误: 一个,链接时的错误,主要是重复定义变量等. 编译单元指在编译阶段生成的每个obj文件. 一个obj文件就是一个编译单元. 一个.cpp(.c)和它相应的.h文件共同组成了一个编译单元.