变量和类的声明和定义

本文详细解释了变量、声明和定义的概念,强调了它们在C++编程中的区别和作用。变量是存储空间,声明用于指定类型和名字,定义则包括分配内存。在C++中,声明可以多次,但定义只能有一次。extern关键字用于声明已定义在其他地方的变量,避免重复定义。类的定义仅描述类型,数据成员的声明不涉及内存分配。头文件中不应包含变量定义,以防重复定义问题,但类定义因其特性可以放在头文件中。
摘要由CSDN通过智能技术生成

什么是变量?

变量或者叫对象,是一个有具名的、可以供程序操作的存储空间。这里具名是指变量是有名字的,可供操作是指能进行加减乘除或者输入输出等操作,存储空间则是指有一块属于它的内存空间。

什么是定义,什么是声明?

  • 定义:用于为变量分配存储空间,还可为变量指定初始值。在程序中,变量有且仅有一个定义。
  • 声明:用于向程序表明变量的类型和名字。在程序中,变量可以有多个声明。【没有分配内存】
  • 定义也是声明:当定义变量时我们声明了它的类型和名字。

很多情况下,定义就是声明,由于C++支持分离式编译,因此一个C++程序允许别分成许多块,由这些块共同组成完整的程序。既然程序可以分成多块,那么如果要在所有块之间共用一个变量,那就要能够在这些块之间共享代码。为了支持这种分离式编译机制,C++中就将声明和定义区分开来了。

定义也是声明,那么如果仅仅声明?

1.在需要声明一个变量之前,先想一想为什么需要声明变量?

  • 因为程序需要使用定义在别的文件中的变量。
  • 这里使用别处的变量暗含了一个意义,这个变量应当是个全局变量,因为当前作用域找不到,所以需要去别的地方找,而别的地方定义的变量应当全局变量,能够被我看到(这里只考虑全局变量,其他情况暂不考虑)。
  • 既然变量已经在别的地方定义过了,而且变量有且仅有一个定义,那么我不能再次定义而只能声明了

2.如何声明其他地方的变量?
声明的方式是使用extern关键词,形如extern int i,这里有了关键词extern的修饰,因此是一个声明,而不是定义。从这个声明中,得知了变量的类型和名字,但是没有分配内存。
3.假如给上面声明的变量一个值,那还是不是声明呢?
回答是:不是。如果这样extern int i = 10;那么这里的extern关键词就失效了,这句代码则变成了定义。

为什么不能在头文件中定义全局变量?

因为变量只能被定义一次,包含了头文件的源文件,都将会定义同样的全局变量,造成冲突,所以,头文件中不能定义全局变量。(包含了全局变量的头文件的不同源文件,会对全局变量分别定义)那么引申到的问题来了:

定义在一个源文件中的全局变量,如何让程序所有的其他块使用?

回答是要么每次在每个块(即源文件)中手动使用extern声明,要么使用extern关键词仅仅声明该全局变量,然后将声明放在一个头文件中,该头文件被所有其他快使用。

类的定义?

只是单纯地描述了这个类的属性和行为,没有定义里面的变量,只是声明,不知其内存大小。仅仅是描述了它。
定义类的语法如下:
首先是关键词class或者struct,两种区别是默认访问权限。上面我们定义了一个类A_example,也就是定义了一种新的类型A_example,就像int一样,它是一种类型

class A_example
{
public:
    int i;
    double d;
    float f = 10.0f;
    static char c = 'A';
};
  • 定义了一种类型,那么这个类里面的int i和double d是定义还是声明?

     答案是声明。
    
  • 对于其中的float f = 10.0f;是声明还是定义呢?

     答案是声明。虽然这里声明的同时赋予了值,但它仍然是一个声明。
    
  • 对于static char c = ‘A’;是声明还是定义?

     答案还是声明!如果你认为它是定义,那么你可以试试直接编译能否通过,编译器通常会这样告诉你:
     **error: non-const static data member must be initialized out of line**(大致意思是,你并没有初始化,你需要在类外进行定义并初始化,因为类里面的只是声明而已)
    

从以上我们能很直观的感受到一个特点:定义一个类时,对于其中的数据成员,不论有无默认值,也不论是static还是非static的,我们只是描述了一个类,注意,仅仅是描述了类,也即,我们只知道它含有哪些类型,如果还定义了函数成员,我们还描述了这种类型的操作。
在A_example的定义中,我们并不知道这个类的具体情况,我们只知道它的属性,它含有什么类型,但不知道具体相应类型变量的值大小。对于默认值,只是一旦用这个类去实例化一个对象,就像int i那样,给对象一个默认值而已。
在C语言中则更明显,为什么使用结构体struct定义一种类型时,不允许对结构体中的变量赋予默认值?
原因就是,仅仅定义了类型而已,只是一些声明而非定义,声明没有开辟内存空间,你给它默认值,它没有地方存储,因此C语言中结构体是没有默认值的。

类的声明

类的声明和普通的内置类型相似,普通的内置类型是声明变量,即告知变量的类型和名字。对于类声明,形如class A_example,这里class表明是一种类型,而A_example则是具体的类型名。
从文章最开头,我们知道:不能在C++的头文件中放置变量的定义,因为变量只能定义一次

为什么类的定义可以放在头文件中呢?

在类的定义部分我们又得知,类定义只是定义了一种类型,也即说明了一个类,并没有实际定义类的对象,定义的是类,定义类描述的是新的类型,而描述新类型并不会开辟内存空间去存储这样一种新类对象,因此类定义可以存放在头文件中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值