怎样使用类和对象.docx
- 文档编号:26961605
- 上传时间:2023-06-24
- 格式:DOCX
- 页数:97
- 大小:73.44KB
怎样使用类和对象.docx
《怎样使用类和对象.docx》由会员分享,可在线阅读,更多相关《怎样使用类和对象.docx(97页珍藏版)》请在冰豆网上搜索。
怎样使用类和对象
8.5.2类声明和成员函数定义的分离
VC++多文件结构
多文件结构的好处是:
1、避免多次无谓的编译,因为编译器总是以文件为单位工作。
2、使程序更加容易管理。
可以将程序按逻辑划分,分解成各个源文件,便于成员任务安排,以及调试。
3、把相关函数放在一个特定源文件中。
头文件作用
一个程序通常有多个文件组成,这就必须计划在每个源文件中哪些信息可以被其他文件见到,那些不行。
C++可以指定那些元素有外部或静态存储类型。
具有外部存储属性的声明可以在多个源文件中引用,方便的方法是将它们放在头文件中。
头文件源文件之间接口的作用。
头文件一般可包含:
●类型、函数、数据的声明
●内联函数、常量、枚举、宏的定义
●注释和包含指令如#include
多文件结构示例1,不包含类的程序
//mycircle.h
doublecircle(doubleradius);
//mycircle.cpp计算圆的面积
#include
#include"circle.h"
usingnamespacestd;
constdoublepi=3.14;
doublecircle(doubleradius)
{
returnpi*radius*radius;
}
//main.cpp
#include
#include"mycircle.h"//注意是双引号,但引号将出现编译错误
usingnamespacestd;
intmain()
{
doubleradius=3.5;
cout<<"theareaofrectis"< system("pause"); return0; } 在VS2008上通过。 多文件结构示例2,包含类的程序 //student.h(这是头文件,在此文件中进行类的声明) classStudent//类声明 { public: voiddisplay();//公用成员函数原型声明 private: intnum; charname[20]; charsex; }; //student.cpp //在此文件中进行函数的定义 #include #include"student.h"//不要漏写此行,否则编译通不过 usingnamespacestd; voidStudent: : display()//在类外定义display类函数 { cout<<"num: "< cout<<"name: "< cout<<"sex: "< } //main.cpp主函数模块 #include #include"student.h"//将类声明头文件包含进来 intmain() { Studentstud;//定义对象 stud.display();//执行stud对象的display函数 system("pause"); return0; } 在VS2008上通过。 多文件结构示例3,不包含类,但是包含有全局变量的程序 使用了string类、数据类型。 //student.cpp #include #include usingnamespacestd; //声明有本文件之外的三个全局变量,要在本文件中的函数里访问 externintnum; externstringname; externcharsex; voiddisplay()//在类外定义display类函数 { cout<<"num: "< cout<<"name: "< cout<<"sex: "< } //main.cpp #include #include usingnamespacestd; //定义三个全局变量,并赋初始值 intnum=3; stringname="Li"; charsex='f'; intmain() {voiddisplay();//调用之前先声明函数 display(); system("pause"); return0;} 程序运行结果: 在VS2008上通过。 说明: 1、两个文件都是cpp文件,不用指定谁包含谁。 2、一个工程项目可以有多个cpp文件,将各个函数分开。 3、一个cpp文件可以用于多个工程项目,代码重用。 4、一个工程项目的多个cpp文件中,只能有一个main()函数。 5、本例中的情况1: 在一个文件中定义全局变量,在另一个文件中使用全局变量。 要在使用全局变量的文件中进行声明: externintnum;…… 全局变量在另一个文件中被使用之前要声明。 在声明时extern关键词是必须的。 如果上面的语句无extern,变成intnum;则成为变量的定义。 在本文件中的全局变量。 与另一个文件中的全局变量重名。 还有一种情况: externinta=0;//定义一个全局变量a并给初值。 inta=0;//定义一个全局变量a,并给初值。 上面两句等价。 都是“定义”,而不是声明。 extern的表现是: 没有赋初值是声明,有赋初值部分就是定义。 谨记: 声明可以多次,定义只能一次。 局部变量的声明不能有extern的修饰,局部变量的作用域小于文件范围,局部变量在运行时才分配内存。 6、本例中的情况2: 在一个文件中定义函数,在另一个文件中使用函数。 只需要在调用之前进行声明。 即使是在同一个文件中的函数调用也有此要求。 与在同一个文件中的函数处理方法一样。 函数的声明,extern关键词是可有可无的,因为函数默认的就是extern的。 7、与示例1比较,示例3少了一个头文件。 主模块中少了一个“包含头文件”的语句,多了一个“声明函数”的语句。 如果要调用多个函数,声明多个函数的语句放在头文件中的方法要好一些。 14.2命名空间(第464页) 在学习本书前面各章时,已经多次看到在程序中用了以下语句: usingnamespacestd; 这就是使用了命名空间std。 在本节中将对它作较详细的介绍。 14.2.1为什么需要命名空间 全局变量的作用域是整个程序,在同一作用域中不应有两个或多个同名的实体(entity),包括变量、函数和类等。 如果程序员甲写了头文件header1.h,在其中定义了类Student和函数fun。 如果程序员乙写了头文件header2.h,在其中也定义了类Student和函数fun,但其内容与头文件header1.h中的Student和函数fun有所不同。 主程序员在其程序中要用到header1.h中的Student和函数fun,因而在程序中包含了头文件header1.h,同时要用到头文件header2.h中的一些内容,因而在程序中又包含了头文件header2.h。 在同一个程序文件中出现了两个Student类和两个fun函数,显然是重复定义,这就是名字冲突,即在同一个作用域中有两个或多个同名的实体。 14.2.2什么是命名空间 为了解决上面这个问题,ANSIC++增加了命名空间(namespace)。 所谓命名空间,实际上就是一个由程序设计者命名的内存区域。 程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。 如 namespacens1//指定命名空间ns1 {inta; doubleb; } 现在命名空间成员包括变量a和b,注意a和b仍然是全局变量,仅仅是把它们隐藏在指定的命名空间中而已。 如果在程序中要使用变量a和b,必须加上命名空间名和作用域分辨符“: : ”,如ns1: : a,ns1: : b。 这种用法称为命名空间限定(qualified),这些名字(如ns1: : a)称为被限定名(qualifiedname)。 C++中命名空间的作用类似于操作系统中的目录和文件的关系。 命名空间的作用是建立一些互相分隔的作用域,把一些全局实体分隔开来,以免产生名字冲突。 可以根据需要设置许多个命名空间,每个命名空间名代表一个不同的命名空间域,不同的命名空间不能同名。 这样,可以把不同的库中的实体放到不同的命名空间中。 过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要用namespace声明的,实际上是由系统隐式声明的,存在于每个程序之中。 在声明一个命名空间时,花括号内不仅可以包括变量,而且还可以包括以下类型: ●变量(可以带有初始化); ●常量; ●函数(可以是定义或声明); ●结构体; ●类; ●模板; ●命名空间(在一个命名空间中又定义一个命名空间,即嵌套的命名空间)。 例如…… 14.2.6标准命名空间std 为了解决C++标准库中的标识符与程序中的全局标识符之间以及不同库中的标识符之间的同名冲突,应该将不同库的标识符在不同的命名空间中定义(或声明)。 标准C++库的所有的标识符都是在一个名为std的命名空间中定义的,或者说标准头文件(如iostream)中函数、类、对象和类模板是在命名空间std中定义的。 这样,在程序中用到C++标准库时,需要使用std作为限定。 如 std: : cout<<″OK.″< 在大多数的C++程序中常用usingnamespace语句对命名空间std进行声明,这样可以不必对每个命名空间成员一一进行处理,在文件的开头加入以下usingnamespace声明: usingnamespacestd; 这样,在std中定义和声明的所有标识符在本文件中都可以作为全局量来使用。 但是应当绝对保证在程序中不出现与命名空间std的成员同名的标识符。 由于在命名空间std中定义的实体实在太多,有时程序设计人员也弄不清哪些标识符已在命名空间std中定义过,为减少出错机会,有的专业人员喜欢用若干个“using命名空间成员”声明来代替“usingnamespace命名空间”声明,如 usingstd: : string; usingstd: : cout; usingstd: : cin; 等。 为了减少在每一个程序中都要重复书写以上的using声明,程序开发者往往把编写应用程序时经常会用到的命名空间std成员的using声明组成一个头文件,然后在程序中包含此头文件即可。 第9章关于类和对象的进一步讨论 9.1构造函数 9.2析构函数 9.3调用构造函数和析构函数的顺序 9.4对象数组 9.5对象指针 9.6共用数据的保护 9.7对象的动态建立和释放 9.8对象的赋值和复制 9.9静态成员 9.10友元 9.11类模板 9.1构造函数 9.1.1对象的初始化 在建立一个对象时,常常需要作某些初始化的工作,例如对数据成员赋初值。 inta=10; intb(a);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 怎样 使用 对象