C++语言程序设计知识点及示例文档格式.docx
《C++语言程序设计知识点及示例文档格式.docx》由会员分享,可在线阅读,更多相关《C++语言程序设计知识点及示例文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
示例11:
只有类的非静态成员函数才有this指针。
√
知识点9:
一个类的友元函数是非成员函数,友元函数可以访问这个类中的护保成员和私有成员。
示例12:
非成员函数只有声明为()才能访问这个类的所有护保成员和私有成员。
友元函数
知识点10:
纯虚函数没有函数体,纯虚函数不能被调用,含有纯虚函数的类为抽象类或抽象基类,抽象类无法建立对象的,而只作为一种用作继承的基类。
示例13:
抽象类可以用于定义对象。
知识点11:
类的静态数据成员被该类的所有对象共享。
示例14:
某个类的静态数据成员被该类的所有对象共享。
知识点12:
构造函数不能声明为虚函数,而析构函数最好声明为虚函数,并且析构函数中调用虚函数采用动态联编。
示例15:
构造函数可以声明为虚函数。
示例16:
析构函数不能声明为虚函数。
知识点13:
ifstream流类定义流对象并打开磁盘文件时的的隐含打开方式为ios:
:
in;
ofstream流类定义流对象并打开磁盘文件时的的隐含打开方式为ios:
out。
示例17:
使用ifstream流类定义流对象并打开磁盘文件时,文件的隐含打开方式为ios:
in|ios:
知识点14:
基类的私有成员为派生类中的不可访问的成员。
示例18:
派生类可以直接访问基类的私有成员。
知识点15:
声明纯虚函数的一般形式是:
virtual返回值类型函数名(形参表)=0;
返回值类型为void,函数名为Show,没有参数的纯虚函数声明为()。
virtualvoidShow()=0;
知识点17:
面向对象方法的主要特征是多态性,继承性和封装性。
示例19:
面向对象方法的主要特征是多态性,继承性和()。
封装性
知识点18:
运算符重载只能重载C++中已经有的运算符,不能定义新运算符。
示例20:
可以重载所有的运算符及定义新运算符。
可以将基类与派生类中的原型相同的成员函数声明为虚函数,虚函数可以通过基类指针来访问基类和派生类中的原型相同的函数。
示例21:
虚函数一定是成员函数。
知识点19:
C++的多态性分为编译时多态性和运行时多态性。
示例22:
C++的多态性分为编译时多态性和静态时多态性。
知识点20:
构造函数的名字与类名同名,没有返回值类型。
示例23:
有给一个名为Test的无参构造函数的声明是()。
Test();
知识点21:
在派生类的构造函数中采用参数初始化表来实现对基类数据成员的初始化。
示例24:
在派生类的构造函数中只能采用参数初始化表来实现对基类数据成员的初始化。
示例25:
将如下程序补充完整。
#include<
iostream>
//编译预处理命令
usingnamespacestd;
//使用命名空间std
classA
{
private:
intx;
//数据成员
public:
A(intm):
x(m){}//构造函数
voidShow()const{cout<
<
x<
endl;
}//输出信息
};
classB:
A
inty;
B(intm,intn):
{}//构造函数
voidShow()const//输出信息
{
A:
Show();
//调用基类A的Show()
cout<
y<
//输出b
}
intmain()//主函数main()
Bobj(1,6);
//对象
obj.Show();
//输出信息
return0;
//返回值0,返回操作系统
}
A(m),y(n)
知识点22:
采用class定义的类中数据成员和成员函数的默认访问权限是private;
采用struct定义的类中数据成员和成员函数的默认访问权限是public。
示例26:
采用struct定义的类中数据成员和成员函数的默认访问权限是()。
public
知识点23:
运算符重载的格式是:
返回值类型operator运算符(形参表);
示例27:
重载运算符“/”的函数名为()。
operator/
示例28:
iostream.h>
classPoint
{
doublex,y;
//坐标值
Point(doublea=0,doubleb=0):
x(a),y(b){}//构造函数
voidShow(){cout<
"
"
<
}//显示坐标值
(constPoint&
obj)//重载加法运算符
{returnPoint(x+obj.x,y+obj.y);
}
voidmain()
Pointp1(3.5,4.5),p2(2.5,5.5),p3;
//定义对象
p3=p1+p2;
//对象求和
p3.Show();
//显示坐标值
Pointoperator+
知识点24:
声明类的静态成员的关键字为static,定义内置函数的关键字为inline,声明模板的关键字是template。
示例29:
声明模板的关键字是()。
template
知识点25:
在一个类中,若在一个数据成员声明前加上static,则该数据成员称为静态数据成员,静态数据成员被该类的所有对象共享。
类的静态数据成员必须在类外进行初始化,初始化方式为:
类型名类名:
静态数据成员名=初始值;
示例30:
阅读下面程序,写出输出结果。
//编译预处理命令
//使用命名空间std
A(){n+=1;
}//构造函数
~A(){n-=1;
}//析构函数
staticintn;
//静态成员
intA:
n=0;
//初始化n
intmain()//主函数main()
A*p=newA;
//定义指针p
cout<
n="
A:
n<
//输出n
deletep;
//释放p指向的动太对象
//返回值0,返回操作系统
n=1
n=0
点评:
本例中的n初值为0,造构对象时n的值自加1,对象消失时n的值自减1,所以n的值为当前的对象个数。
示例31:
classA
staticints;
//静态数据成员
A(inti){s+=i;
}//构造函数
staticvoidShow(){cout<
s<
}//显示s
//初始化静态数据成员
voidmain()
Aa
(1),b
(2),c(4);
//定义对象
//显示静态数据成员
运行结果:
s=0;
通过“类型名类名:
”方式来初始化静态成员函数。
知识点26:
常对象只能调常成员函数,而一般对象既可调常成员函数,也可调非常成员函数。
示例32:
阅读如下程序,写出运行结果。
classMyTest
intnum;
//数据成员
MyTest(inti):
num(i){}
voidPrint(){cout<
1:
num="
num<
;
}//一般函数
voidPrint()const{cout<
"
2:
}//常函数
MyTesta(5);
//一般对象
constMyTestb(18);
//常对象
a.Print();
//一般对象优先调用一般函数
b.Print();
//常对象只能调用常函数
上面程序的输出结果为:
num=5,2:
num=18
知识点27:
在定义对象时没有写参数,将调用无参构造函数。
示例33:
A(){cout<
无参构造函数"
}//无参构造函数
A(inta){cout<
含参构造函数a="
a<
}//带参构造函数
~A(){cout<
析构函数"
}//析构函数
Aobj;
//定义对象
无参构造函数
析构函数
知识点28:
在使用函数模板生成模板函数时,有两种使用方式“函数模板名(实参表)”或“函数模板名<
类型1,类型2,…>
(实参表)”,第一种使用方式将根据实参类型确定类型形式参数的具体类型,第二种方式中,<
称为类型实参表,用类型实参表中的类型来确定类型形式参数具体类型。
示例34:
//编译预处理命令
//使用命名空间std
template<
classT>
TMin(constT&
a,constT&
b)
if(a<
b)returna;
//a更小
elsereturnb;
//b更小
intmain()//主函数main()
Min(1.1,6.8)<
Min<
int>
(2,1.6)<
//输出信息
//返回值0,返回操作系统
1.1,1
示例35:
试使用函数模板实现求一个数组各元素的最大值,要求编写测试程序。
函数模板声明如下:
TMax(Ta[],intn)//求数组a各元素的最大值
参考程序:
Tm=a[0];
//用m存储最大值
for(inti=1;
i<
n;
i++)
if(a[i]>
m)m=a[i];
//m更大
returnm;
//返回最大值
inta[]={1,2,3,4,5,6,7,8,9};
//定义数组
Max(a,9)<
//输出各元素之和
//返回值,返回操作系统
知识点29:
构函数的执行次序:
基类构造函数派生类构造函数;
析构函数的执行次序与构造函数的执行次序相反:
派生类析构函数基类析构函数;
构造函数一般按各对象生成的次序执行各对象的构造函数,而析构函数则按各对象生成顺序的相反次序执行各对象的构造函数。
示例36:
classA//基类
inta;
A(intx):
a(x){cout<
A("
)"
~A():
}//析构函数
publicA//派生类
intb;
B(intx=0,inty=0):
A(x),b(y){cout<
B("
b<
}//构造函数
~B(){cout<
~B():
}//析构函数
Bobj1,obj2(1,2);
//派生类对象
A(0)
B(0)
A
(1)
B
(2)
2
1
析构函数的执行次序与构造函数的执行次序相反。
知识点30:
虚函数通过基类指或基类引用实现动态多态性。
示例37:
//编译预处理命令
//使用命名空间std
virtualvoidShow1()const{cout<
A"
}//输出信息
voidShow2()const{cout<
publicA
voidShow1()const{cout<
B"
voidFun1(Aobj){obj.Show1();
}//定义Fun1()
voidFun2(constA&
obj){obj.Show1();
}//定义Fun2()
intmain()//主函数main()
Bobj;
//定义对象
A*p=&
obj;
//指针
p->
Show1();
Show2();
Fun1(obj);
//调用Fun1()
Fun2(obj);
//调用Fun2()
//返回值0,返回操作系统
B
A
Show1()为虚函数,p->
Show1()调用派生类B的实现版本,Show2()为非虚函数,p->
Show1()调用基类A的实现版本;
Fun1()的形参为不为基类引用与基类指针,Fun1(obj)中的Show1()调用基类的实现版本,Fun2()的形参为不为基类引用,Fun2(obj)中的Show1()调用派生类的实现版本。
知识点31:
当函数的参数带有缺省值时,在调用函数如没有实参,其对应参数将取缺省值。
示例38:
classTest
intn;
//数据成员
Test(intm=0):
n(m){}//构造函数
n<
Testa,b
(1);
//对象
a.Show();
//输出信息
b.Show();
知识点32:
成员函数中,当形参与数据成员相同时,形参优先,即数据成员将被隐藏,这时为操作数据成员,可使用this指针,this指向当前对象,例如用this->
n表示当前对象的数据成员。
示例39:
Test(intn){=n;
}//构造函数
Testa
(1);
this->
n或A:
n
知识点33:
常用将用于显示对象信息的函数Show()声明为常函数,这样显得更具专业性。
示例40:
定义一个复数类Complex,其数据成员包括real和image,定义带有2个参数的构造函数(函数原型为“Complex(doubler=0,doublei=0);
”),显示复数值的函数Show()(函数原型为“voidShow()const”),并编写测试程序进行测试。
//编译预处理命令
//声明复数类
classComplex
//数据成员
doublereal;
//实部
doubleimage;
//虚部
//公有函数
Complex(doubler=0,doublei=0):
real(r),image(i){}
voidShow()const//输出复数
{cout<
real<
+"
image<
i"
}
Complexz(2,3);
//定义复数对象
z.Show();
//输出z
//返回值,返回操作系统
知识点34:
文本文件流对象可以使用输入运算符“>
>
”和输出运算符“<
”来输入输出文件中的数据,与用cin,cout和“<
”,“>
”对标准设备进行输入输出操作相同。
示例41:
有一个实型数组,含4个整数,将这些数据存入到一个文本文件my_file.txt中,然后再从这个文件中读数据并显示在屏幕上。
实型数组定义如下:
doublea[]={1.6,5.8,7.8,9.1};
fstream>
intmain(void)//主函数main()
double