C++语言程序设计期末总结材料.docx
- 文档编号:26421736
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:17
- 大小:22.83KB
C++语言程序设计期末总结材料.docx
《C++语言程序设计期末总结材料.docx》由会员分享,可在线阅读,更多相关《C++语言程序设计期末总结材料.docx(17页珍藏版)》请在冰豆网上搜索。
C++语言程序设计期末总结材料
C++程序设计总结:
1.C与C++的区别:
引入类和对象,成为面向对象的程序设计语言…
一、类
二、引用
三、函数的重载
四、流操作符
五、操作符重载
六、继承,以及虚函数
参考(C是一个结构化语言:
它的重点在于算法和数据结构。
C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。
之所以说C++比C更先进,是因为“设计这个概念已经被融入到C++之中”,而就语言本身而言,在C中更多的是算法的概念。
那么是不是C就不重要了,错!
算法是程序设计的基础,好的设计如果没有好的算法,一样不行。
而且,“C加上好的设计”也能写出非常好的东西。
对语言本身而言,C是C++的子集,那么是什么样的一个子集?
从上文可以看出,C实现了C++中过程化控制及其它相关功能,而在C++中的C(我称它为“C+”),相对于原来的C还有所加强,引入了重载、内联函数、异常处理等等玩艺儿,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等等。
再提高一点,在C++中,数据封装、类型这些东东已不是什么新鲜事了,需要考虑的是诸如:
对象粒度的选择、对象接口的设计和继承、组合与继承的使用等等问题。
所以相对于C,C++包含了更丰富的“设计”的概念,但C是C++的一个自洽子集,也具有强大的功能,同样值得学习。
)
●*全面兼容C
–它保持了C的简洁、高效和接近汇编语言等特点
–对C的类型系统进行了改革和扩充
–C++也支持面向过程的程序设计,不是一个纯正的面向对象的语言
●支持面向对象的方法
2.友元函数
友元函数在类中用friend修饰的非成员函数,在其函数体中可以通过对象名访问类的
Private和protected成员。
●作用:
增加灵活性,使程序员可以在封装和快速性方面做合理选择。
●访问对象中的成员必须通过对象名。
友元类:
若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,
都可以访问B类的私有和保护成员。
语法形式:
classB
{
···//B类中成员函数声明
friendclassA;//声明A为B的友元类
···
};
注意:
(1.友元关系是不能传递的2.友元关系是单向的3.友元关系是不被继承的。
)
3.重载
哪些运算符不能重载:
类属关系运算符“.”,成员指针运算符“.*”,作用域分辨符“:
:
”,三目运算符“?
:
”。
运算符重载的两种形式:
重载为类的非静态成员函数(函数只有一个形参)和重载为非成员函数(函数的形参有两个)。
***运算符重载成员与非成员之间的差异:
如何实现
差异:
308至315页例8-1、8-2、8-3***
4.继承(实现代码重用)与派生
类的继承方式:
公有继承、私有继承、保护继承。
继承:
公有继承(public):
(1)基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。
(2)派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。
(3)通过派生类的对象只能访问基类的public成员。
私有继承(private):
●基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。
●派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。
●通过派生类的对象不能直接访问基类中的任何成员
保护继承(protected):
●基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。
●派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。
●通过派生类的对象不能直接访问基类中的任何成员
5.拷贝构造函数(无返回类型110~113)
●构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。
●在对象创建时由系统自动调用。
●如果程序中未声明,则系统自动产生出一个隐含的参数列表为空的构造函数
●允许为内联函数、重载函数、带默认形参值的函数
●拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。
拷贝构造函数被调用的情况:
●当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。
●若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。
●当函数的返回值是类对象时,系统自动调用拷贝构造函数。
方法:
class类名
{
public:
类名(形参表);//构造函数
类名(类名&对象名);//复制构造函数
···//各成员函数
};
类名:
:
类名(类名&对象名);//复制构造函数的实现
{
函数体···
}
例题:
classPoint
{
public:
Point(intxx=0,intyy=0)//构造函数
{
x=xx;
y=yy;
}
Point(Point&p);//复制构造函数
intgetX(){returnx;}
intgetY(){returny;}
private:
intx,y;
};
//复制构造函数的实现
Point:
:
Point(Point&p)
{
x=p.x;
y=p.y;
cout<<“”< } 6.引用 引用传递: ●引用(&)是标识符的别名,例如: inti,j; int&ri=i; //建立一个int型的引用ri,并将其 //初始化为变量i的一个别名 j=10; ri=j;//相当于i=j; ●声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。 ●一旦一个引用被初始化后,就不能改为指向其它对象。 ●引用可以作为形参 voidswap(int&a,int&b){...} ? ? //函数参数的引用 7.内联函数的使用 内联函数的引用和声明: ●声明时使用关键字inline。 ●编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。 ●注意: –内联函数体内不能有循环语句和switch语句。 –内联函数的声明必须出现在内联函数第一次被调用之前。 –对内联函数不能进行异常接口声明 8.派生类的构造函数初始化如何实现? 派生类构造函数语法形式: (265页) **(166例7-4)** **(268~269例7-5)** 派生类与基类的构造函数: ●当基类中声明有缺省构造函数或未声明构造函数时,派生类构造函数可以不向基类构造函数传递参数,也可以不声明,构造派生类的对象时,基类的缺省构造函数将被调用。 ●当需要执行基类中带形参的构造函数来初始化基类数据时,派生类构造函数应在初始化列表中为基类构造函数提供参数。 有内嵌对象时的构造函数: 派生类名: : 派生类名(形参表): 基类名1(参数),基类名2(参数),...基类名n(参数),新增成员对象的初始化 { 本类成员初始化赋值语句; }; 构造函数的执行顺序: 1.调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。 2.对成员对象进行初始化,初始化顺序按照它们在类中声明的顺序。 3.执行派生类的构造函数体中的内容。 9.纯虚函数和抽象类,应用场合特点使用限制(321~323) 纯虚函数(没有函数体)声明格式: virtual函数类型函数名(参数表)=0; 声明为纯虚函数之后,基类中就可以不再给出函数的实现部分。 纯虚函数的函数体由派生类给出。 抽象类: (**例8-4323) (抽象类不能产生对象)抽象类不能实例化。 抽象类: 带有纯虚函数的类。 10.不声明public、private、protected会被默认为私有成员。 11.对象数组初始化 ●数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。 ●通过初始化列表赋值。 例: Pointa[2]={Point(1,2),Point(3,4)}; ●如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用缺省构造函数)。 对象数组元素所属类的构造函数: ●不声明构造函数,则采用缺省构造函数。 ●各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。 ●各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。 ●当数组中每一个对象被删除时,系统都要调用一次析构函数。 12.this指针 This指针是一个隐含于每一个类的非静态成员函数中的特殊指针(包括构造函数和析构函数),它用于指向正在被成员函数操作的对象。 ●隐含于每一个类的成员函数中的特殊指针。 ●明确地指出了成员函数当前所操作的数据所属的对象。 –当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。 13.文件与流的关系? ? ? ? ? ? 14.派生类中包含内嵌对象的构造函数执行顺序: 构造函数的执行顺序: (1)用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。 (2)员对象进行初始化,初始化顺序按照它们在类中声明的顺序。 (3)派生类的构造函数体中的内容。 15.派生类中包含内嵌对象的析构函数执行顺序: (与构造函数完全相反) 16.c++特点: (4个) ∙ C++语言具有以下特点: (1)C++是C语言的超集。 它既保持了C语言的简洁、高效和接近汇编语言等特点,又克服了C语言的缺点,其编译系统能检查更多的语法错误,因此,C++比C语言更安全。 (2)C++保持了与C语言的兼容。 绝大多数C语言程序可以不经修改直接在C++环境中运行,用C语言编写的众多库函数可以用于C++程序中。 (3)支持面向对象程序设计的特征。 C++既支持面向过程的程序设计,又支持面向对象的程序设计。 (4)C++程序在可重用性、可扩充性、可维护性和可靠性等方面都较C语言得到了提高,使其更适合开发大中型的系统软件和应用程序。 17.二异性的概念和特点 二义性问题: ●在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性)——采用虚函数(参见第8章)或同名隐藏规则来解决。 ●当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性——采用虚基类来解决。 如何解决: ●解决方法: 解决方法一: 用类名来限定 c1.A: : f()或c1.B: : f() ●解决方法二: 同名隐藏 在C中声明一个同名成员函数f(),f()再根据需要调用A: : f()或B: : f() 18.多态性的四类 运算符重载、函数重载、虚函数、纯虚函数和抽象类 19.流的设置特点、cout宽度? ? ? ? ? 输出宽度: 为了调整输出,可过在流中放入setw操纵符(manipulator)或调用width成员函数为每个项指定输出宽度。 20.对象指针 对象指针: ●声明形式 类名*对象指针名; ●例 Pointa(5,10); Piont*ptr; ptr=&a; ●通过指针访问对象成员 对象指针名->成员名 ptr->getx()相当于(*ptr).getx(); 21.常引用(166~167) 常引用: 声明时用const修饰的引用。 常引用所引用的对象不能被更新。 22.指向对象的常指针 常类型: 常类型的对象必须进行初始化,而且不能被更新。 ●常对象: 必须进行初始化,不能被更新。 const类名对象名 ●常引用: 被引用的对象不能被更新。 const类型说明符&引用名 ●常数组: 数组元素不能被更新 类型说明符const数组名[大小]... ●常指针: 指向常量的指针 关于指针类型,应注意: (1)指向常量的指针,不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。 inta; constint*p1=&a;//p1是指向常量的指针 intb; p1=&b;//正确。 P1本身的值可以改变 *p1=1;//出错。 不能通过p1改变所指的对象 (2)指针类型的常量,指针本身的值不能被改变。 int*constp2=&a; p2=&b;//错误。 P2是指针常量,值不能改变。 23.const的用法通过指针是哪些值不能修改的 用法: const的使用 const经常用来修饰一个值不能改变的量,安全,并且能消除存储操作 const的几种用法: (1)说明值常量 (2)说明指针 (3)说明函数参数及其返回值 (4)说明类的常量和成员函数 const说明值常量 值常量的说明一般放在头文件或者文件的开始部分,也可以放在类中进行说明 (1)说明符号常量,表明符号代表的是一个常量,语法: <类型>const<常量名>=<表达式>,<常量名>=<表达式>…… 例如: doubleconstPI=3.14;constdoublePI=3.14; (2)说明数组常量,语法格式: <类型>const<数组名>[大小]={初值表}; const类型><数组名>[大小]={初值表}; (3)说明对象常量,语法格式: <类名>const<对象名>; const<类名><对象名>; (4)说明引用常量 (5)const与C语言中的#define的差别 无参宏不是符号常量,没有数据类型,没有值,在内存中不分配地址。 它在预处理时做宏替换,不可能做类型检查。 const定义的常量是符号常量,有数据类型,也有值,且其值不可改变,在内存中有地址,编译时做类型检查。 Const和指针 Const和指针的三种经典组合 (1)指向常量的指针——constint*p; (2)常指针——char*constpc=’a’; (3)指向常量的常指针——constchar*constpc=’a’ 指向常量的指针(指针指向一个不可变量) 指针在指向有一个常量后,不能通过指针修改这个常量,但是可以指向一个新的常量,例如: Constchar*pc=”ABCD”; Pc[3]=’a’;不合法,企图修改原来指向的常量 Pc=“WERT”;合法指向另外一个常量 常指针 要把指针变量中的值(也就是地址)声明为常量,采用以下语法: <类那些>*const<指针名>[=<初值>;] 这样定义的指针变量中存放的指针是个常量,称为常指针。 定义后,该指针指向固定的内存单元,不能再指向其他内存单元,通过它可以修改所指单元里存放的内容。 例如: Char*constpc=”ABCD”; Pc[3]=’a’;合法,指针指向的对象可以修改 Pc=”QWER”;不可以,指针的指向不可以修改 指向常量的常指针 指针变量中存放的指针本身和指针所指向的对象都是不可以改变的。 例如: Constchar*constpc=”ASDF”; Pc[3]=’a’;不合法,不能改变指针所指对象的值 Pc=”QWER”;不合法,不能改变指针的指向 Const说明函数参数和返回值 用const限定函数参数和返回值,是const最重要的用法。 用const修饰函数参数意味着传过来的实参在函数中是不能被修改的。 一般情况下不需要,但是在用指针和引用传值的场合,为避免实参被修改,就用const修饰,更安全。 修饰函数的返回值,意味着该返回值不能被修改。 如果传值并返回地址,const将保证该地址上的内容不会被改变。 这就意味着该函数不能作为左值使用,在这种情况下,const通常也是与引用和指针一起使用的。 类中的const 1.常成员的函数 2.常数据成员 3.常对象 通过指针是哪些值不能修改的? ? ? ? ? ? ? 24.函数模版: 函数模板: ●函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。 ●定义方法: template<模板参数表> 函数定义 ●模板参数表的内容 –类型参数: class(或typename)标识符 –常量参数: 类型说明符标识符 –模板参数: template<参数表>class标识符 25.作用域: (146~149) 作用域: (若全局变量与局部变量同名,则局部变量起作用) 函数原型作用域: 函数原型中的参数,其作用域始于"(",结束于")" 局部作用域: 函数的形参,在块中声明的标识符,其作用域自声明处起,限于块中, 类作用域: ●类作用域作用于特定的成员名。 ●类X的成员m具有类作用域,对m的访问方式如下: –如果在X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以访问成员m。 –通过表达式x.m或者X: : m访问。 –通过表达式ptr->M 26.对象的隐藏···? ? 27.通过指针访问类的成员函数和数据成员··· 派生类的对象访问基类··· **28.兼容性规则: 兼容性规则: ●一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。 具体表现在: –派生类的对象可以隐含转换为基类对象。 –派生类的对象可以初始化基类的引用。 –派生类的指针可以隐含转换为基类的指针。 ●通过基类对象名、指针只能使用从基类继承的成员 29.内联函数: 内联函数的引用和声明: ●声明时使用关键字inline。 ●编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。 ●注意: –内联函数体内不能有循环语句和switch语句。 –内联函数的声明必须出现在内联函数第一次被调用之前。 –对内联函数不能进行异常接口声明 30.析构函数: 析构函数: ●完成对象被删除前的一些清理工作。 ●在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。 ●如果程序中未声明析构函数,编译器将自动产生一个隐含的析构函数。 虚函数: ●虚函数是动态绑定的基础。 ●是非静态的成员函数。 ●在类的声明中,在函数原型之前写virtual。 ●virtual只用来说明类声明中的原型,不能用在函数实现时。 ●具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。 ●本质: 不是重载声明而是覆盖。 ●调用方式: 通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数 ***理解并看程序写结果*** 能够看懂拷贝构造函数的代码并写结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 语言程序设计 期末 总结 材料
![提示](https://static.bdocx.com/images/bang_tan.gif)