C++之类的声明、定义、存储

来源:互联网 发布:oracle导出整个数据库 编辑:程序博客网 时间:2024/06/06 07:45

类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的运算封装在一起的集合体。(所谓运算,也即是一个个函数)

类的成员函数(简称类函数)是函数的一种,它的用法和作用和普通函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是: 它是属于一个类的成员,出现在类体中。它可以被指定为private(私有的)、public(公用的)或protected(受保护的)。在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数)。

类的数据,成员函数都是抽象的,必须定义相应的对象,由对象名才能访问。不能直接访问。


类的定义格式:

class  类名//命名习惯 首字母大写

 //类中方法的编写有两种方式
 //1、直接定义
 //2、在类中声明在类外定义 一定要加上该方法是属于哪个类的,用类名和::

{    private :

            成员数据;

            成员函数;

     public :

            成员数据;

            成员函数;

    protected:

           成员数据;

           成员函数;

};

用关键字private限定的成员称为私有成员,对私有成员限定在该类的内部使用,即只允许该类中的成员函数使用私有的成员数据,对于私有的成员函数,只能被该类内的成员函数调用;类就相当于私有成员的作用域。

用关键字public限定的成员称为公有成员,公有成员的数据或函数不受类的限制,可以在类内或类外自由使用;对类而言是透明的。(但也不能直接调用,要用运算符‘.’)

而用关键字protected所限定的成员称为保护成员,只允许在类内及该类的派生类中使用保护的数据或函数。即保护成员的作用域是该类及该类的派生类。

 

在定义一个类时,要注意如下几点:

1、类具有封装性,并且类只是定义了一种结构(样板),所以类中的任何成员数据均不能使用关键字extern,auto或register限定其存储类型。

2、在定义类时,只是定义了一种导出的数据类型,并不为类分配存储空间,所以,在定义类中的数据成员时,不能对其初始化。如:

class  Test

{  

int x=5,y=6;   //是不允许的

   extern  float x; //是不允许的 

}

3在建立对象时,只为对象分配用于保存数据成员的内存空间,而成员函数的代码为该类的每一个对象所共享。

4用成员选择运算符“.”只能访问对象的公有成员,而不能访问对象的私有成员或保护成员。若要访问对象的私有的数据成员,只能通过对象的公有成员函数来获取。 这也体现了对数据的封装,只留出一些接口供外部使用,其他内部的情况外界无法知道。

 

在C++中,声明了类的类型后,定义对象有两种形式。

(1) class 类名对象名

           如 class Student stud1,stud2;

           把class和Student合起来作为一个类名,用来定义对象。

(2) 类名 对象名

           如 Student stud1,stud2;

直接用类名定义对象。这两种方法是等效的。第1种方法是从C语言继承下来的,第2种方法是C++的特色。第二种更简洁。

 

在程序中经常需要访问对象中的成员。访问对象中的成员可以有3种方法:

1、通过对象名和成员运算符访问对象中的成员;

表示调用对象pt中的函数display().其必须为公有的。其中“.”是成员运算符,用来对成员进行限定,指明所访问的是哪一个对象中的成员。

2、通过指向对象的指针访问对象中的成员;

定义对象syf及指向Student类的指针变量pt。两种调用等价。也可(*pt).display();进行调用,都是等价的。

3、通过对象的引用变量访问对象中的成员。

如果为一个对象定义了一个引用变量,它们是共占同一段存储单元的,实际上它们是同一个对象,只是用不同的名字表示而已。上述两者等价。

 

成员函数的访问限定符的意义及类的声明与定义常用方法:

用户可以调用公用成员函数来实现某些功能,而这些功能是在声明类时已指定的,用户可以使用它们而不应改变它们。实际上用户往往并不关心这些功能是如何实现的细节,而只需知道调用哪个函数会得到什么结果,能实现什么功能即可。(例如傻瓜照相机)

为了防止用户任意修改公用成员函数,改变对数据进行的操作,往往不让用户看到公用成员函数的源代码,显然更不能修改它,用户只能接触到公用成员函数的目标代码。由于在头文件中包含了类的声明,因此在程序中就可以用该类来定义对象。由于在类体中包含了对成员函数的声明,在程序中就可以调用这些对象的公用成员函数。

成员函数一般是不在头文件中定义的,只在头文件中声明。因为函数只能有一次定义,而可以有多次声明,当头文件被多次包含的时候,如果头文件中有函数定义就违背了这个原则~
-------------------------------------------------------------------------------------
#ifndef XXX_H
#define XXX_H
class CA {
......
}
#endif
如果头文件中没有这样定义的话,多次包含一样编译不通过.
成员函数在不在头文件中定义,其实都没多大关系,但如果你的程序是提供给别人作为库,而在头文件中定义成员函数,别人就会看到你程序的实现,.cpp中定义,人家使用时调用的是库文件,看到的只是你的头文件中的声明,而不知道你是怎么实现的(呵呵,商业机密).为了实现信息隐蔽,对类成员函数的定义一般不放在头文件中,而另外放在一个文件中。
还有一些规则是,有些成员函数是必须在类声明中定义的,如类的静态成员函数,inline函数.
在高质量C++编程中好像就这么说过,反正就是尽量把头文件与实现文件分开.但如果一个类声明多次被不同的程序所选用,每次都要对包含成员函数定义的源文件(如student.cpp)进行编译,这是否可以改进呢?的确,可以不必每次都对它重复进行编译,而只需编译一次即可。把第一次编译后所形成的目标文件保存起来,以后在需要时把它调出来直接与程序的目标文件相连接即可。这和使用函数库中的函数是类似的。

类库包括两个组成部分:

(1)类声明头文件;

(2)已经过编译的成员函数的定义,它是目标文件。用户只需把类库装入到自己的计算机系统中(一般装到C++编译系统所在的子目录下),并在程序中用#include命令行将有关的类声明的头文件包含到程序中,就可以使用这些类和其中的成员函数,顺利地运行程序。


 类的存储

类的成员函数代码是存储在对象空间之外的。如果对同一个类定义了10个对象,这些对象的成员函数对应的是同一个函数代码段,而不是10个不同的函数代码段。需要注意的是,虽然调用不同对象的成员函数时都是执行同一段函数代码,但是执行结果一般是不相同的。(因为数据不一样)一个对象所占的空间大小只取决于该对象中数据成员所占的空间,而与成员函数无关。


不同的对象使用的是同一个函数代码段,它怎么能够分别对不同对象中的数据进行操作呢?原来C++为此专门设立了一个名为this的指针,用来指向不同的对象。

0 0
原创粉丝点击