c++总结.docx
- 文档编号:5433885
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:17
- 大小:31.70KB
c++总结.docx
《c++总结.docx》由会员分享,可在线阅读,更多相关《c++总结.docx(17页珍藏版)》请在冰点文库上搜索。
c++总结
c++总结
第8章:
类和对象的特性
1.面向对象的程序设计有四个特点:
抽象,封装,继承,多态。
C++的类对象体现了抽象和封装的特性,在此基础上再利用继承和多态,就成为面向对象的程序设计,其主要涉及到类和对象。
2.类是一个很抽象的概念,现实中没有和类相对应的事物。
类是对象的抽象(抽象的作用是表示同一类事物的本质),对象是类的具体实例(即类的具体表现形式)。
类是抽象的,不占内存的,但对象是具体的,占用存储空间。
任何一个对象都有两个要素:
属性和行为(即把数据和有关操作封装在一起)。
3.在基于过程的结构化程序设计中:
程序=算法+数据结构
在基于对象和面向对象程序设计中:
对象=算法+数据结构
程序=(对象+对象+对象+....)+消息
4.如果在类的定义既不指定private也不指定public,则系统默认为private。
5.对类类型声明的一般形式:
Class类名
{
Private:
私有的数据和成员函数;
Public:
公有的数据和成员函数;
};
除了private(只能被此类访问),public(可以被类外访问,它是类的对外接口),还有protected(不能被类外访问,但能被派生类的成员函数访问)。
6.不论是否用inline声明,成员函数的代码段都不占用对象的存储空间(inline只影响执行效率)。
7.为了实现信息隐蔽,c++程序实际上是由三部分组成的:
(1)类声明头文件(后缀为.h)
(2)类实现文件(后缀为.cpp),它包括类成员函数的定义
(3)类的使用文件(后缀为.cpp),即主文件
一般格式是:
#ifndef<标识>
#define<标识>
......
#endif
<标识>在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。
标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:
stdio.h
#ifndef_STDIO_H_
#define_STDIO_H_
......
#endif
第9章:
怎样使用类和对象
1.构造函数,不需要用户调用,它是在建立对象时自动执行的,名字必须与类名同名,不具有任何类型和返回值,作用是初始化。
其形式为:
类名:
:
构造函数名(【参数表】)【:
成员初始化表】{【构造函数体】}
一般要分别声明有参和无参的构造函数,以避免在定义对象时没有赋值电脑报错。
Classtime
{
public:
time(){hour=0;minute=0;sec=0;}
time(inth,intm,ints):
hour(h),minute(m),sec(s){}
private:
inthour;
intminute;
intsec;
}s,w(2,19,4);
2.如想使用参数默认值,则应在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值。
3.析构函数不返回任何值,没有函数类型,也没有函数参数,不能被重载。
(一个类可以有多个枸造函数,但只能有一个析构函数);一般情况下,调用析构函数的次序与调用构造函数的次序相反。
4.
(1)指向对象数据成员的指针:
数据类型名*指针变量名;
例:
p1=&t1.hour;
cout<<*p1< (2)指向对象公用成员函数的指针变量的一般形式: 数据类型名(类名: : *指针变量名)(参数表列); 使指针变量指向一个公用成员函数的一般形式为: 指针变量名=&类名: : 成员函数名; 例: void(time: : *p2)(); P2=&time: : get_time; (3)指向普通函数的指针变量的形式: 类型名(*指针变量名)(参数表列); 例: void(*p)(); P=fun; (*p)(); 5.this指针: 指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址 例: 本来,成员函数的定义是: intBox: : volume() {return(height*width*length); C++把它处理为: intBox: : volume(Box*this) {return(this->height*this->width*this->length);} 6.定义常对象的一般形式: 类名const对象名【(实参表)】; 或const类名对象名【(实参表)】; 例: consttimet1(12,34,46); (1)在定义常对象时,构造函数只能通过参数表对常数据成员初始化,之后不能再改变;如果一个对象被声明为常对象,则它只能访问常成员函数,而不能调用该对象的普通成员函数。 (2)常成员函数可以访问常对象中的数据成员,但仍不允许修改常对象中数据成员的值。 7.常成员函数: 类型名函数名(参数表)const 例: voidget_time()const; (常成员函数可以引用const数据成员,也可以引用非const的数据成员;const数据成员可以被const成员函数引用,也可以被非const的成员函数使用;常成员函数不能调用另一个非const成员函数) 8. (1)指向对象的常指针变量的一般形式为: 类名*const指针变量名; 例: Timet1(10,12,15),t2; Time*constp1; P1=&t1; P1=&t2;(非法,p1不能改变指向) (2)指向常对象的指针变量的一般形式: const类名*指针变量名; 例: constTimet1(10,12,15); ConstTime*p2; Time*p1; P2=&t1; P1=&t1;(非法,因为p1不是指向常对象的指针变量) 《指向const的指针能访问非const变量地址,指向非const的指针不能访问const变量地址》 9.用new运算符动态建立对象: newBox; 用运算符delete撤销对象: deleteBox; 10.对象赋值的一般形式: 对象名1=对象名2;(对象名1,2必须为同一个类) 11.对象的复制的一般形式: 类名对象2(对象1);或类名对象名1=对象名2; 但建立对象时需调用一个特殊的构造函数----复制构造函数(也是构造函数,但是只有一个参数(即本类的对象)),形式为: Box: : Box(Box&b) { height=b.height; width=b.width; Length=b.length; } 12.静态数据成员(各对象中的数据成员的值一样) 初始化的一般形式: 数据类型类名: : 静态数据成员名=初值; (只在类体中声明时加static,不必在初始化语句中加static;静态数据成员既可以通过对象名引用,也可以通过类名引用;) 公用的成员函数既可以引用静态成员也可以引用一般数据成员; 只用静态成员函数引用静态数据成员,而不引用非静态数据成员 13.友元 (1)将普通函数声明为友元函数: classtime{public: Time(int,int,int); Friendvoiddisplay(time&); private: inthour; intminute; intsec; }; voiddisplay(time&t) {cout< (2)友元成员函数 classdate;//对date类的提前引用声明 classtime { public: time(int,int,int); voiddisplay(date&);//private: inthour; intminute; intsec; }; classdate { public: date(int,int,int); friendvoidtime: : display(date&);//声明time中display函数为本类的友元成员函数 private: intmonth; intday; intyear; }; (3)友元类(如果B类是A类的友元类,友元类B中的所有函数都是A类的友元函数,可以访问A类中所有成员) 友元的关系是单向的而不是双向的,友元的关系不能传递! 14.类模板 例: #include usingnamespacestd; template classcompare { public: compare(numtypea,numtypeb) {x=a;y=b;} numtypemax() {returnx>y? x: y;} private: numtypex,y; } intmain() { compare cout< return0; } 第10章: 运算符重载 1.重载运算符的函数一般形式如下: 函数类型operator运算符名称(形参表) {对运算符的重载处理} 例: complexoperator+(complex&c1,complex&c2); 调用时: c5=c3+c4;(即c1.operator+(c2)) 2.重载运算符的规则: (1)c++不允许用户自己定义新的运算符,只能对已有的c++运算符进行重载 (2)c++不能重载的运算符只有五个: .*: : sizeof? : (3)重载不能改变运算符运算对象的个数;优先级;结合性 (4)重载运算符的函数不能有默认的参数 (5)重载运算符必须和用户定义的自定义类型的对象使用,其参数至少应有一个是类对象。 (6)用于类对象的运算符一般必须重载,但有两个例外,运算符“=”和“&” 3. (1)c++规定,赋值运算符“=”、“下标运算符【】”、“函数调用运算符()”、成员运算符“->”必须作为成员函数重载。 (2)流插入运算符“<<”和流提取运算符“>>”、类型转换运算符函数只能作为友元函数。 (3)一般将单目运算符和复合运算符(+=,-=,/=,*=,&=,! =,^=,%=,>>=,<<=)重载为友元函数。 (4)一般将双目运算符重载为友元函数。 例: 重载运算符“<<” #include Usingnamespacestd; classcomplex { public: Complex(intr=0;inti=0); ostream&operator<<(ostream&,complex&); private: intreal; intimag; }; complex: : complex(intr,inti) { real=r; imag=i; } ostream&operator<<(ostream&output,complex&a) { output< } intmain() { complexc1(2,4); cout< return0; } 第11章: 继承与派生 1.类的继承(公用继承,私有继承,保护继承): 一个新类从已有的类那里获得其已有属性。 (构造函数和析构函数不能从基类继承) 2.声明派生类的一般形式为: class派生类名: 【继承方式】基类名 { 派生类新增的成员; }; 3.公用继承: 基类的公有成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。 私有继承: 基类的私有成员和保护成员在派生类中成为私有成员。 其私有成员仍为基类私有。 保护继承: 基类的公有成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。 (保护成员的意思是,不能被外界引用,但可以被派生类的成员引用) 4.多级派生: A->B->C若类A是类B的直接基类,是类C的间接基类。 5.派生类构造函数一般形式: 派生类构造函数名(总参数表): 基类构造函数名(参数表){派生类新增数据成员初始化语句} --------这里的参数指的是形参 6.若有子对象,则派生类构造函数的一般形式: 派生类构造函数名(总参数表): 基类构造函数名(参数表),子对象名(参数表){派生类新增数据成员初始化语句} 7.多重继承: classD: publicA,privateB,protectedC {类D新增加的成员} 派生类构造函数名(总参数表): 基类1构造函数(参数表),基类2构造函数(参数表),基类3构造函数(参数表列){新增成员初始化语句} 8.虚基类: 在继承间接共同基类时只保留一份成员 声明虚基类的一般形式: class派生类名: virtual继承方式基类名 第12章: 多态性与虚函数 1.多态性: 向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。 包括静态多态性和动态多态性。 其表现形式之一: 具有不同功能的函数可以用同一个函数名,这样就可以实现用同一个函数名调用不同内容的函数。 2.虚函数的作用: 允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类的同名函数。 3.在基类用virtual声明成员函数为虚函数;当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。 (构造函数不能声明为虚函数) 4.声明纯虚函数的一般形式: Virtual函数类型函数名(参数表列)=0; 例: virtualfloatarea()=0; 注意: 虚函数没有函数体,“=0”只是形式,并非返回值为0。 多态性举例: #include #include usingnamespacestd; classstudent { public: student(int,string,float); virtualvoiddisplay(); protected: intnum;stringname;floatscore; }; classgraduate: publicstudent { public: graduate(int,string,float,float); voiddisplay(); private: floatwage; }; student: : student(intn,stringnam,floats) { num=n;name=nam;score=s; } voidstudent: : display() { cout< } graduate: : graduate(intn,stringnam,floats,floatw): student(n,nam,s),wage(w){} voidgraduate: : display() { Cout< } Intmain() { Studentstud1(1001,”li”,87.5); Graduategra1(2001,”wang”,1200); Student*pt=&stud1; Pt->display(); Pt=&grad1; Pt->display(); Return0; } 第13章: 输入输出流 1.c语言采用函数实现输入输出(如scanf和printf函数),c++采用类对象来实现输入输出(如cin,cout)。 2.C++流库有两个基类: ios类(是输入输出操作在用户的接口,为用户的输入输出提供服务)和streambuf类(处理“流缓冲区”的类,包括缓冲区起始地址,读写指针,和对缓冲区的读写操作),所有其他流类都是从他们直接或间接派生出来的。 3. 类名 作用 在哪个头文件中声明 ios 抽象基类 iostream istream ostream iostream 通用输入流和其他输入流的基类 通用输出流和其他输出流的基类 通用输入输出流和其他输入输出流的基类 iostream iostream iostream ifstream ofstream fstream 输入文件流类 输出文件流类 输入输出文件流类 fstream fstream fstream istrstream ostrstream strstream, 输入字符串流类 输出字符串流类 输入输出字符串类 strstream strstream strstream 4.cerr,clog均为向输出设备输出出错信息,但cerr是不经过缓冲区直接向显示器输出信息,而clog中的信息存放在缓冲区,缓冲区满后或遇endl时向显示器输出。 5.用流成员函数put输出字符: cout.put(‘a’); 6.输入流 1)用get函数读入一个字符 无参cin.get(); 有一个参数cin.get(ch); 有三个参数cin.get(字符数组(或字符指针),字符个数n,终止字符); 2)用成员函数getline函数读入一行字符 Cin.getline(字符数组(或字符指针),字符个数n,终止标志字符) 例: cin.getline(ch,20,’/’); 7.istream类的其他成员函数 1)eof函数: 表示文件结束。 从输入流读取数据,如果到达文件末尾,eof函数值为非0值,否则为0。 2)peek函数: 观测下一个字符调用时: c=cin.peek(); 其返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。 3)putback函数: 调用形式为: cin.putback(ch); 其作用是将前面用get或getline函数从输入流中读取的字符ch返回到输入流,插入到当前指针位置,以供后面读取。 4)ignore函数,调用形式为cin,ignore(n,终止字符),作用是跳过输入流n个字符或遇到指定的终止字符时提前结束。 例: #include usingnamespacestd; intmain() { charc[20]; intch; cout<<"pleaseenterasentence: "< cin.getline(c,15,'/'); cout<<"thefirstpartis: "< ch=cin.peek(); cout<<"thenextcharacteris: "< cin.putback(c[0]); cin.getline(c,15,'/'); cout<<"thesecondpsrtis: "< return0; } 8.文件: 包括程序文件和数据文件两大类。 根据其组织形式分为: ASC||文件和二进制文件。 9. (1)打开磁盘文件 ~~~~调用成员函数的一般形式: 文件流对象.open(磁盘文件名,输入输出方式); 例: ofstreamoutfile;outfile.open(“f1.dat”,ios: : out); (2)关闭磁盘文件 例: outfile.close(); 10.ASC||文件: 如果文件中的每一个字节中均以ASC||代码形式存放数据,即一个字节存放一个字符。 对其读写操作可以用两种方法: ......................用流插入运算符<<和流提取运算符>>输入输出标准类型数据。 ......................用put,get,getline等成员函数进行字符的输入输出。 11.对二进制文件的读写操作 读: istream&read(char*buffer,intlen); 写: ostream&write(constchar*buffer,intlen); (字符指针buffer指向内存中一段存储空间;len是读写的字节数) 12.字符串流: 以内存中用户定义的字符数组(字符串)为输入输出的对象 1)建立输出字符串流 Ostream类提供的构造函数原型为 Ostream: : ostream(char*buffer,intn,intmode=ios: : out) (字符指针buffer指向内存中一段存储空间,n为指定的流缓冲区的大小,第三个参数是可选的) 2)建立输入字符串流 Istrstream类提供的构造函数原型为 Istrstream: : istrstream(char*buffer); Istrstream: : istrstream(char*buffer,intn); 3)建立输入输出流对象 Strstream: : strstream(char*buffer,intn,intmode);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+ 总结