C++基础知识2(第13讲)_第1页
C++基础知识2(第13讲)_第2页
C++基础知识2(第13讲)_第3页
C++基础知识2(第13讲)_第4页
C++基础知识2(第13讲)_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+基础知识2信息学院李崇威ise_licwQQ: 58296786编辑课件C+基础知识2C+语言的产生、特点及结构特性C+标准输入输出流引用类构造函数拷贝构造函数析构函数编辑课件C+语言的产生C+是从C语言发展演变而来的,首先是一个更好的C引入了类的机制,最初的C+被称为“带类的C”1983年正式取名为C+从1989年开始C+语言的标准化工作于1994年制定了ANSI C+标准草案于1998年11月被国际标准化组织(ISO)批准为国际标准,成为目前的C+编辑课件C+的特点全面兼容C它保持了C的简洁、高效和接近汇编语言等特点。对C的类型系统进行了改革和扩充,比C更安全,其编译系统能检查出更多的

2、类型错误。C+也支持面向过程的程序设计,不是一个纯正的面向对象的语言。支持面向对象的机制,可方便地构造出模拟现实问题的实体和操作。 编辑课件C+程序的结构特性#include void main( ) coutHello!n; coutWelcome to c+!n;运行结果:Hello!Welcome to c+!C+示例程序1:#include using namespace std;编辑课件C+示例程序2: 两数相加#include using namespace std;int add(int a, int b); / 函数原型说明void main( ) / 主函数 int x, y

3、, sum; / 定义三个整型变量 coutx; / 从键盘输入变量x的值 ciny; / 从键盘输入变量y的值 sum = add(x, y); / 调用函数add,将得到的值赋给变量sum cout“The sum is:”sum; / 输出两个数的和 int add (int a, int b)int c;c = a + b;return c;编辑课件C+程序的编辑、编译和运行 C源程序文件扩展名为.C,而C+源程序文件扩展名为.CPP。在Windows下,常用Visual C+开发环境来编辑、编译和运行C+程序。编辑课件C + 标准输入输出流在C+中,语言本身并不包含输入和输出功能,但

4、C+标准库提供了一套用于输入和输出的类库。在C+的输入、输出系统中,最核心的对象是流(stream),一个流就是一个字节序列。流的操作包括对流的读和写。C+输入输出流的思想:令标准I/O、文件和存储块看上去都一样,只需记住一个接口就可以了。与标准C的输入输出库中的各种函数相比,C+的输入输出流更容易、更安全、更有效。编辑课件cout输出流cout是预定义的输出流类对象。当程序需要在屏幕上显示输出时,可以使用插入符“”向cout输出流中插入字符。 “”是预定义的插入运算符。格式如下: cout 表达式”从cin输入流中抽取字符,“”是预定义的提取运算符。格式如下: cin表达式表达式编辑课件简单

5、的I/O格式控制用cin、cout进行数据的输入和输出时,都自动按照默认格式处理。但我们经常需要设置特殊的格式。这里只介绍最简单的格式控制。C+的I/O流类库提供了一些控制符,可以直接嵌入到输入/输出语句中来实现I/O格式控制。使用格式控制符首先必须在源程序的开头包含iomanip.h。下表中列出了几个常用的I/O流类库格式控制符。编辑课件控制符含义dec数值数据采用十进制表示hex数值数据采用十六进制表示oct数值数据采用八进制表示endl插入换行符,并刷新流setprecision(int)设置浮点数的小数位(包括小数点)setw(int)设置域宽常用的I/O流控制符编辑课件 例:控制符的

6、使用 #include #include using namespace std; void main() int x;cinx; couthexx octx decxendl; cout123setw(6)456endl; coutsetw(5)setprecision(3)3.14159endl; 编辑课件引用 概念:引用通常被认为是某个变量的别名。声明格式:类型 &引用名 = 已定义的变量名;例如: int i=5; int &j=i;这里,j是一个整数类型的引用,用整型变量i对它进行初始化,这时j就可看作是变量i的别名 。编辑课件引用型变量是从指针型变量发展来的一种特殊类型的变量。引用

7、变量的实质仍然是指针,但采用了不同于指针的表示方法,可以简化对函数有多个返回值时的处理,使得程序更加清晰可读。引用型变量是C+的新增特性,是一种不具备自己的实际数据存储空间的变量,它必须与另一个同类型的变量共用一个空间, 其本身不是一个独立的变量。因此,引用只有声明,没有定义。编辑课件C+中的类类是具有相同属性和行为的一组对象的集合。类是一种复杂的数据类型,它是将不同类型的数据(属性)和与这些数据相关的运算(行为)封装在一起的集合体,其内部包括属性和行为两个主要部分。它为属于该类的全部对象提供了统一的抽象描述。利用类可以实现数据的封装、隐藏、继承与派生。利用类易于编写大型复杂程序,其模块化程度

8、比C中采用函数更高。因为类将一些数据及与数据相关的函数封装在一起,使类中的数据得到很好的“保护”。在大型程序中不会被随意修改。编辑课件class 类名 private: 私有成员;public: 公有成员; (外部接口)protected: 保护成员; ;分号不能少例:用一个类来描述日期,其形式如下:class Clock public: void SetTime(int h, int m, int s); void ShowTime( ); private: int hour; int minute; int second;类声明的一般格式如下:成员数据成员函数成员包括:数据和函数编辑课件类

9、声明中访问权限关键字的说明private:用其限定的成员称为私有成员。对私有数据成员:限定其在该类的内部使用,即只允许该类中的成员函数使用私有的数据成员对私有成员函数:限定其只能被该类内的成员函数调用类就相当于私有成员的作用域。 public:用其限定的成员称为公有成员。公有成员的数据或函数不受类的限制,可以在类内或类外自由使用,它们是类与外部的接口protected:用其限定的成员称为保护成员。只允许在类内及该类的派生类中使用保护的数据或函数保护成员的作用域是该类及该类的派生类编辑课件类声明格式中的3个部分必须至少要有一个。三个关键字可以按任意次序出现任意次。一旦使用了关键字,该关键字一直有

10、效,直到下一个关键字开始为止。private若排第一时则可以省去。类中的数据成员可以是任何数据类型,但不能用auto,register,extern来进行说明。不能在类声明中对数据成员进行初始化。class Date int hour, minute, second; public: void SetTime(int h, int m, int s); void ShowTime( );三个均为私有class Test int x=5, y=6; /是不允许的 extern float x; /是不允许的 编辑课件成员函数的声明 1、将成员函数以普通函数的形式进行说明,这种成员函数在类外定义。

11、其一般形式是: 返回类型 类名成员函数名(参数表) / 函数体 2、将成员函数以内联函数的形式进行说明。在C+中,可以用下面两种格式将成员函数声明为类的内联函数:隐式声明:直接将函数声明在类内部。显式声明:这种成员函数在类外定义,其一般形式是:inline 返回类型 类名:成员函数名(参数表) / 函数体 成员函数的声明通常采用以下两种方式:为作用域标志符编辑课件void Date : SetTime(int h, int m, int s) hour=h; minute=m; second=s;void Clock : ShowTime() couthour:minute:second;以普

12、通函数的方式在类外定义成员函数:编辑课件class Point public: void Init(int initX, int initY) x = initX; y = initY; int GetX( ) return x; int GetY( ) return y; private: int x, y;以内联函数的方式在类内隐式声明成员函数:编辑课件class Point public: void Init(int initX,int initY); int GetX( ); int GetY( ); private: int x,y;以内联函数的方式在类外显式声明成员函数:inlin

13、e void Point:Init(int initX, int initY) x = initX; y = initY;inline int Point:GetX() return x;inline int Point:GetY() return y;编辑课件说明说明内联函数时, inline 必须和函数体放在一起, 而不是和函数原型。内联函数是编译时在该函数的调用处用函数体进行替换,这样就节省了参数传递、控制转移等开销。内联函数在第一次被使用之前必须进行声明或定义。只有较短的函数才适用于内联函数。内联函数体内不能有循环语句和switch语句。使用内联函数是一种空间换时间的措施。内联函数具有

14、宏定义#define相同的作用和相似的机理,但消除了#define的不安全因素。编辑课件对象的定义和使用 通常我们把具有共同属性和行为的事物所构成的集合叫做类。类是用户自己定义的一种数据类型。类的对象就是该类的某一特定实体,即类类型的变量。对象的声明形式:1、在声明类的同时,直接定义对象,即在声明类的右花括号“”后,直接写出属于该类的对象名表。2、声明了类之后,在使用时再定义对象,定义的格式与一般变量的定义格式相同。编辑课件形式1:class Clock public: private: myClock1, myClock2;形式2:class Clock public: private:;m

15、ain( )Clock myClock1, myClock2;全局对象 编辑课件类中成员的访问方式类中成员互访直接使用成员名类外访问通过类的对象访问公有数据成员和成员函数访问的一般形式是: 对象名.数据成员名或 对象名.成员函数名(参数表)“.”叫做对象选择符,简称点运算符编辑课件#include using namespace std;class Clock ./类的声明略/.类的实现略void main(void) Clock myClock; myClock.SetTime(8,30,30); myClock.ShowTime( );举例说明:编辑课件构造函数构造函数是一种特殊的成员函数

16、,它的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。它有一些特殊的性质:构造函数的名字必须与类名相同。构造函数可以有任意类型的参数,但不能指定返回类型。它有隐含的返回值,该值由系统内部使用。如果程序中未声明,则系统自动产生出一个默认形式的构造函数。构造函数的函数体可写在类体内,也可写在类体外。构造函数可以为内联函数、重载函数、带默认形参值的函数。构造函数被声明为公有函数,但它不能像其他成员函数那样被显式地调用,它是在对象创建时被系统自动调用的。编辑课件class Clockpublic:Clock (int NewH, int NewM, int NewS);

17、/构造函数void SetTime(int NewH, int NewM, int NewS);void ShowTime( );private:int Hour, Minute, Second;例:编辑课件构造函数的实现:Clock:Clock(int NewH, int NewM, int NewS)Hour = NewH;Minute = NewM;Second = NewS;建立对象时构造函数的作用:void main( ) Clock c (0,0,0); /隐含调用构造函数,将初始值作为实参。 c.ShowTime( );编辑课件通常,利用构造函数创建对象有以下二种方法:利用构造函

18、数直接创建对象。其一般形式为: 类名 对象名(实参表);例: Clock c (0,0,0); 通过指针和new来实现。其一般形式为: 类名 *指针变量 = new 类名 (实参表);例:Clock c = new Clock(0, 0, 0);编辑课件拷贝构造函数如果想生成一个对象的副本怎么做?新建一个对象,然后将已有对象的数据成员一一赋给新对象。可行,但繁琐。拷贝构造函数是一种特殊的构造函数,具有一般构造函数的所有特性,其形参为本类的对象引用。其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一个新的同类的对象。如果没有定义类的拷贝构造函数,编译器就会自动生成一个默认

19、的函数,这个默认拷贝构造函数的功能是把初始值对象的每个数据成员的值都复制到新建立的对象中。编辑课件一般形式:class 类名 public : 类名(形参); /构造函数 类名(类名 &对象名);/拷贝构造函数 .;类名: 类名(类名 &对象名) /拷贝构造函数的实现 函数体 编辑课件class Point public: Point(int xx=0, int yy=0) x=xx; y=yy; Point(Point &p); int GetX( ) return x; int GetY( ) return y; private: int x, y;Point:Point (Point &

20、p) x = p.x; y = p.y; cout拷贝构造函数被调用endl;例:编辑课件普通构造函数是在对象创建时被调用,而拷贝构造函数在以下三种情况下都会被调用:1、当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。例如: void main(void) Point A(1, 2); Point B(A); /拷贝构造函数被调用 coutB.GetX( )endl;拷贝构造函数的调用编辑课件2、若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。例如:void fun1(Point p) coutp.GetX( )endl; void

21、main( ) Point A(1, 2); fun1(A); /调用拷贝构造函数 编辑课件3、当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:Point fun2() Point A(1,2); return A; /调用拷贝构造函数void main( ) Point B; B = fun2( ); 编辑课件析构函数析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理任务,如释放分配给对象的内存空间等。析构函数有以下一些特点:析构函数与构造函数名字相同,但它前面必须加一个波浪号()。析构函数没有参数,也没有返回值,而且不能重载。因此在一个类中只能有一个析构函数。在对象的生存期结束时,编译系统会自动地调用析构函数。 如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数。编辑课件#include using namespace std;class Date public: Date(int y, int m, int d); / 构造函数 Date( ); / 析构函数 void setDate(int y, int m, int d); void showDate( ); private: int year, month, day; ;例:编辑课件Date:Date(int y, int m, int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论