现在的位置: 首页 > 综合 > 正文

学习心得——从静态成员看类的抽象性

2018年05月05日 ⁄ 综合 ⁄ 共 2791字 ⁄ 字号 评论关闭

           静态(static)成员是C++中类的一种特殊的成员。

        在程序中,我们有时希望多个对象公用一个变量,但是使用全局变量会破坏类的封装性。静态成员就是为解决此问题而设计。静态成员的作用域在整个类中,它有全局变量的优点,又不会像全局变量那样破坏类的封装性。

 

一、静态成员的定义

        在类中,在成员函数名或者成员变量名前添加static关键字,则声明此成员为静态成员。

        static关键字只能出现在类中,在类外定义成员函数时不能添加此关键字。

 

二、静态成员的特性

        静态成员与普通的成员不同,有几个特性值得注意。

        1、静态成员不属于任何对象,它是属于类的

              在使用时,静态成员保存在内存中的全局变量区。它不属于类的对象,但是我们可以将它当成对象的成员一样调用。如果它是public的,对象可以直接访问,如果它是private的,对象不能直接访问。通常,将静态数据成员放到private中,否则对象就可以很容易的对静态成员修改,这样就破坏了类的封装性。

        2、静态成员函数的特点。

              静态成员函数不属于对象,所以静态成员函数不可声明为const,不可声明为virtural,也没有this参数

        3、静态数据成员(static date member)的特点。

              静态数据成员和静态成员函数有些不同。

              (1)它可声明为任何类型,如静态常量(const static)、静态引用、静态数组、静态类等等。

              (2)静态数据成员只能在类中声明,必须在类外定义。由于它属于类,而不属于对象,因此静态数据成员也不能出现在对象的构造函数初始化列表中

              (3)静态常数据成员可以在类中指定初始值,但是仍需要在类外定义

 

三、静态常数据成员(static const data member)

        静态常数据成员非常特殊,它有两个关键字,一个是static,一个是const。静态常数据成员从本质上来说仍然是静态成员,它仍然是静态成员,是类的一部分,不属于对象。由于加了const关键字,它同时具有了常成员的特性。

        这里不讨论常成员函数,只考虑常数据成员。一个数据成员被声明为常成员,则对象不可改变它的值。在常成员的声明和定义时,都必须出现const关键字。常成员必须指定其初始值,初始化常成员的唯一机会是在构造函数初始化列表

        静态常数据成员也具有上述特性,我们来看看它是如何定义的。        

        静态常数据成员的定义分为两步,这是因为它是静态成员。

        (1)通常我们将静态常数据成员声明在类的private部分中。定义形式如下:

              static const 类型 变量;                              static const 类型 变量=初始值;               (static和const的顺序不重要,可交换)

        (2)在类外定义静态常数据成员,形式如下:

              const 类型 变量=初始值;              或          
const 类型 变量;                        (一定要加上关键字const,类型和const可交换)

        由于它是静态的,所以我们必须在类中声明,在类外定义。由于它是常量,所以我们必须指定它的初始值。我们可以在类中声明它的时候指定它的初始值,也可以在类外定义它时指定初始值。需要注意的时,我们只能指定一次,如果我们在类中声明时指定其初始值,那么我们在类外定义的时就不要指定其初始值,否则会报错,反之亦然。

        分析静态常数据成员的定义方式,我们可以看到隐藏在其后的通用原理——类的抽象性。

        注:用static和const定义的成员,称为const static member,按照英文为常静态成员,在本文中将其译为静态常成员,这是因为国内大部分的书习惯称之为静态常量。将“静态”放在前面,“常”放在后面,因为我们习惯了“常量”的称呼。在定义时,static和const的顺序无关紧要,但是在声明时,我们可以看到必须加上const关键字,很多时候我们将const和函数名或变量名视为一个整体。

 

四、从静态常量看类的抽象性

        类的一个重要特征就是具有抽象性。什么是抽象性?所谓抽象,是指类是一些对象共性的集合。简单点说,我们定义了一个类,它是一种数据类型,和int这样的内置类型一样,我们可以认为它不占用内存(这里的内存比较狭义,不是说类不占用任何内存,而是说,类不像变量那样占用内存)。

        对于内置类型,当我们定义一个变量时,我们就为这个变量分配了内存。对于类,当我们定义了类的一个对象时,这就为这个对象分配了内存。

        因为类是抽象的,所以类中出现的一切都是抽象的,无论是类的成员函数还是类的成员变量,也无论是const,还是static。正是由于这个原因,所以我们可以在类中定义类的成员函数,却不能在类中定义成员变量。类中的成员变量,都是声明,而不是定义。声明与定义的区别就在于,定义时会为定义的对象分配内存空间,而声明则不会这样。因为类中的成员变量是声明,所以,我们无法为成员变量赋初值。对于const成员变量,为了保证其不可改变的特性,我们在类的构造函数初始化列表中初始化它;对于static成员变量,由于它不属于对象,不能使用类的构造函数初始化列表初始化它,所以我们必须在类外定义它。这就是static成员变量需要在类外定义的元婴。对于const
static成员变量,我们可以在类中指定其初始值,这是为了体现它const的特性,并不是真正意义上的初始化,实际上初始化的过程,仍然是在类外定义的时候完成。

        之前的文章讲述了构造函数,类是抽象的,类的实例化的过程就是在类的对象的构造函数调用时完成的。 

        结论:(1)类是抽象的,类的任何特性都表现了其抽象性;

                    (2)构造函数的作用是用来实例化类,定义对象的数据成员,为对象的各个成员分配内存(有待商榷)。

                    (3)如果一个类的数据成员不属于对象,那么不能用构造函数来完成它的定义。

                    (4)不能用构造函数定义的成员变量,必须使用其他方式定义,比如在类外定义它。

 

The End                   

抱歉!评论已关闭.