c++总结Word格式文档下载.docx
《c++总结Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《c++总结Word格式文档下载.docx(17页珍藏版)》请在冰点文库上搜索。
:
构造函数名(【参数表】)
【:
成员初始化表】{【构造函数体】}
一般要分别声明有参和无参的构造函数,以避免在定义对象时没有赋值电脑报错。
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<
endl;
(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;
t2;
(非法,p1不能改变指向)
(2)指向常对象的指针变量的一般形式:
const类名*指针变量名;
constTimet1(10,12,15);
ConstTime*p2;
Time*p1;
(非法,因为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;
intsec;
};
voiddisplay(time&
t)
{cout<
t.hour<
t.minute<
t.sec<
endl}
(2)友元成员函数
classdate;
//对date类的提前引用声明
classtime
public:
time(int,int,int);
voiddisplay(date&
//private:
classdate
date(int,int,int);
friendvoidtime:
display(date&
//声明time中display函数为本类的友元成员函数
intmonth;
intday;
intyear;
};
(3)友元类(如果B类是A类的友元类,友元类B中的所有函数都是A类的友元函数,可以访问A类中所有成员)
友元的关系是单向的而不是双向的,友元的关系不能传递!
14.类模板
#include<
iostream>
usingnamespacestd;
template<
classnumtype>
classcompare
{
public:
compare(numtypea,numtypeb)
{x=a;
y=b;
numtypemax()
{returnx>
y?
x:
y;
numtypex,y;
intmain()
compare<
int>
cmp1(3,7);
cmp.max()<
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)一般将双目运算符重载为友元函数。
重载运算符“<
Usingnamespacestd;
classcomplex
Complex(intr=0;
inti=0);
ostream&
operator<
(ostream&
complex&
intreal;
intimag;
complex:
complex(intr,inti)
real=r;
imag=i;
ostream&
(ostream&
output,complex&
a)
output<
a.real<
””<
a.imag<
complexc1(2,4);
c1;
//系统解释为operator<
(cout,c1)
第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。
多态性举例:
string>
usingnamespacestd;
classstudent
student(int,string,float);
virtualvoiddisplay();
protected:
intnum;
stringname;
floatscore;
classgraduate:
publicstudent
graduate(int,string,float,float);
voiddisplay();
floatwage;
student:
student(intn,stringnam,floats)
num=n;
name=nam;
score=s;
voidstudent:
display()
num<
name<
”“<
score<
graduate:
graduate(intn,stringnam,floats,floatw):
student(n,nam,s),wage(w){}
voidgraduate:
display()
Cout<
wage<
Intmain()
Studentstud1(1001,”li”,87.5);
Graduategra1(2001,”wang”,1200);
Student*pt=&
stud1;
Pt->
display();
Pt=&
grad1;
Return0;
第13章:
输入输出流
1.c语言采用函数实现输入输出(如scanf和printf函数),c++采用类对象来实现输入输出(如cin,cout)。
2.C++流库有两个基类:
ios类(是输入输出操作在用户的接口,为用户的输入输出提供服务)和streambuf类(处理“流缓冲区”的类,包括缓冲区起始地址,读写指针,和对缓冲区的读写操作),所有其他流类都是从他们直接或间接派生出来的。
3.
类名
作用
在哪个头文件中声明
ios
抽象基类
iostream
istream
ostream
通用输入流和其他输入流的基类
通用输出流和其他输出流的基类
通用输入输出流和其他输入输出流的基类
ifstream
ofstream
fstream
输入文件流类
输出文件流类
输入输出文件流类
istrstream
ostrstream
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个字符或遇到指定的终止字符时提前结束。
charc[20];
intch;
"
pleaseenterasentence:
cin.getline(c,15,'
/'
thefirstpartis:
c<
ch=cin.peek();
thenextcharacteris:
ch<
cin.putback(c[0]);
thesecondpsrtis:
}
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);