《C++程序设计教程》章节试读

当前位置:首页 > 教材 > 征订教材 > C++程序设计教程章节试读

出版社:清华大学出版社
出版日期:2005-9
ISBN:9787302114642
作者:钱能
页数:551页

《C++程序设计教程》的笔记-第139页

第五章,指针参数。
直接包括进传值参数就行了,独立一节显得略显拖沓,也不利于理解。钱能这本书很多地方都有点玩弄概念的意味。

《C++程序设计教程》的笔记-第474页 - 模板

类模板是一种模板,它通过在类定义上铺设类型参数的形式,表示具有相似操作的系列类。
模板类是指从类模板产生的类。通常通过传递给类模板以类型实参而得到模板类。
函数模板属于模板,是一种函数族。
模板函数是普通函数的一种,通常通过传递给函数模板类型实参得到模板函数。

《C++程序设计教程》的笔记-第417页 - 第十二章:多态

类型转换:
1.动态转换,//只适合有虚函数的基类。不含想要的指针则返回0
dynamic_cast<Children*>(Base);
dynamic_cast操作时专门针对有虚函数的继承结构来的。它将基类指针转换成想要的子类指针。
2.静态转换
static_cast<Class1*>(Class2);
用来转换相关类型的类。static_cast转换并不是专门针对指针的,只要是相关类型的转换,都可以操作。
3.常量转换
char*p=const_cast<char*)(const char * f);
从type类型转换到const type类型是允许的,但是从const type类型转换到type类型是不行的。为了将const type类型转换为type类型。可以引入const_type来将const_type类型转换为type类型。
注意:类型转换常常会引入很多其他错误,所以要慎用。

《C++程序设计教程》的笔记-第475页 - 模板

模板参数可以被默认。模板参数默认的规则与函数参数默认的规则相同,从参数列表右边开始默认起。我们熟悉的向量容器其实有两个模板参数,只不过,第二个模板参数是默认参数,在通常的编程中用的是默认值。向量的声明形式为:
template<typename T,typename Allocator=allocator<T>>
class vector;
向量模板的第二个参数是内存分配器,它负责分配和释放需要操作的空间。向量容器的默认内存分配器是STL提供的,除非我们自己定义向量容器的内存分配器,一般都是默认采用内部的动态内存分配器。
假如我们自定义了一个内存分配器Alloc。则在建立向量时,可以:
class Alloc;
vector<double> a(1000);
vector<double,Alloc> b(1000);

《C++程序设计教程》的笔记-第440页 - 抽象类--演绎概念设计

抽象类做界面的设计方案,既可以达到彻底分离程序模块的目的,又克服了繁琐的成员函数转换,既干净又利落。在彻底分离编程内容和职责的前提下,就可以建立完全独立的模块——动态链接库了
在上节中,动态链接库可由IDATA类的派生类即DATA类构成,只要IDATA界面不动,动态链接库还可以在背后悄悄更换,甚至连DATA类定义都可以改,而应用程序无须做任何改动面向对象的模块就是完整的类模块,它通过抽象界面与用户联系,而所有的实现却隐在连源代码都可以隐藏的类似动态链接库中

《C++程序设计教程》的笔记-第476页 - 模板

模板实例化:
类模板的实例化即生成模板类不是一次性将类中的成员函数全部实例化的,没有被使用的函数将不会被实例化。即:类模板成员函数的实例化是被单独激活的。函数模板实例化仅发生在第一次调用该模板函数时。
可以显示实例化一个类模板让其生成对应的模板类
template List<double>;
template List<int>;
显示实例化会马上将所有的类模板的成员函数都实例化成对应的模板成员函数

《C++程序设计教程》的笔记-第424页 - 第十三章:抽象类

一般地,一个容器,其元素师基类对象的指针或引用,才有多态可言,若没有指向基类的操作,子类就不能行使多态。

理解:要使用多态,就必须要一个共同的基类,而要调用多态函数则需要通过基类的指针和引用来动态调用多态函数,这就出现了一个问题:必选要有基类对象指针或引用,但是常常我们并不需要这么一个多余的基类对象。解决方法是引入抽象类来解决,因为抽象类不能实例化对象。
抽象类:含有纯虚函数是抽象类的唯一标识。抽象类不能创建对象。纯虚函数在抽象类中不要实现。

《C++程序设计教程》的笔记-第480页 - 模板

局部定做:
类模板的模板参数多于一个是很正常的。
template<typename T1,typename T2>
class A{....};模板定做不一定要全部定做,即不一定非得要将类模板定做成普通类。如果一个类模板的类型参数多于一个,而定做其中一部分类型参数为确定的类型,则称为局部定做
模板一旦局部定做,则产生的模板铸件就仍然是类模板。
template <typename T>
class A<T,T>{...};
Class Cat;
template<typename T>
class A<T,Cat>{...};

《C++程序设计教程》的笔记-第464页 - 模板

template <typename T>
template <class T>
void swap(T&a,T&b)
{
T temp =a;
a=b;
b=temp;
}根据数据实参的类型----》匹配数据形参的类型---》确认模板实参---》推得模板形参的过程称为数据实参的演绎
以函数模板名为函数名的函数调用,以数据实参推演出模板实参,进而生成模板函数定义的过程称为函数模板的实体化或实例化
利用函数模板隐式生成模板函数:swap(A,B)
利用函数模板显式生成模板函数:swap(int)(A,B)
函数模板具有苛刻的类型匹配:
隐式调用的参数必须和模板函数的参数严格匹配。
可用显式生成模板函数的方法来解决
也可以调用类型转换的方式来改变实参类型

《C++程序设计教程》的笔记-第526页 - 异常(Exception)

异常机制通过规定异常发生的可能区域(try),以及异常扑捉(catch),来处理发生异常的善后问题。对于抛出来的异常,往往是跨越数个函数调用而被捕捉处理。捕捉是根据抛出来的对象类型与捕捉对象类型的匹配来完成的。这个匹配是完全匹配不能进行任何类型转换
异常可以申述,可以在函数中规定抛出异常的种类,以便让预料异常和未料到异常处于不同的捕捉区,让程序能够分门别类地处理突发事件
抛出得异常被捕捉后,还可以重新抛出,因而可以形成一张捕捉网。在一个相对完整的程序中,异常一般构成一个用户的类层次体系,辅之以标准异常的类层次体系,就可以基本上满足地处理好程序中的各处异常了。
构造函数是必须借助异常处理的典型示例,引用的动态转换和动态类型信息的获取也要靠异常帮忙,因为它们的一个共同点是,不能等到一个操作完整地执行后,再来判断其成功与否,操作失败的结果相当于不可思议地创建整形变量(int a)失败,对程序来说,在异常没有推出之前,这种意外只有粗暴停机。
异常给我们带来了另外一个好处就是非错误处理。尤其是递归函数中,嵌套搜索树结构中的结点时,在找到相应树结点后迅速撤离现场到原始发出搜索调用的函数处,异常处理表现得异常独特。

《C++程序设计教程》的笔记-第486页 - 模板

模板的多态:
多态:相同的表达式在不同的场合表示不同的实体时,其捆绑的操作因实体不同而表现出不同的行为,称为多态。
动多态:通过继承基类的虚函数来动态绑定不同的子类,当子类调用该虚函数的时候,通过滞后捆绑的方式实现动态多态。
用模板实现静多态:用函数模板将函数形参设置为待确定类型。不同对象调用函数模板时根据参数生成不同模板函数从而到达多态;
动静多态的差异:
动多态适合于类层次结构,而且基类必须为多态类,即含有虚成员函数。
静多态则适合所有的类,不需要虚函数。
表现动多态的函数总是通过指针或者引用传递参数,实参一般是该指针的类型以下(含)的实体地址;
静多态则可以是传递对象,也可以传指针或引用
表现动多态的函数只处理特定的类层次结构中的系列对象,一个类系列,配一个表现动多态的专用函数。
静多态则随着传递实参的类型变化,进行函数模板的特例化(生成模板函数)

《C++程序设计教程》的笔记-第457页 - 抽象类-手柄类:智能指针和引用计数

手柄类是专门拿来处理有多态表现的指针的,这些指针所指向的对象有一个共同点,都是通过某个创建函数来产生对象的,而且该对象的实体一般不复制,传递都是通过指针或引用。
手柄类的性质:
1.对象通过指针参数的形式创建,不另外申请内存空间创建指针所指向的对象,但是要重新开辟基数。
2.对象通过别的对象创建时挂接相同对象,对象计数加1
3对象复制时,原对象需要析构,然后挂接相同对象,对象计数加1
4析构时,计数值减1.只有在计数值减至0时,才释放指针指向的对象
class SonyHandle
{
Sony *sp; //抽象基类
int *count;
public:
SonyHandle(Sony *pp):sp(pp),count(new int (1){}
SonyHandle(const SonyHandle& sh):sp(sh.sp),count(sh.count)
{
(*count)++;
}
Sony* operator->()
{
return sp;
}
SonyHandle& operator=(const SonyHandle& sh)
{
if(sh.sp==sp)
return *this;
(*this).~SonyHandle();
sp=sh.sp;
count=sh.count;
(*count)++;
return *this;
}
~SonyHandle ()
{
if(--(*count)==0)
{
delete sp;
delete count;
}
}
};手柄类实际上已经包含了高级编程中的智能指针和引用计数,这两项技术是使面向对象编程走向真正实用的基本技术。这种技术还真能推动面向对象的如意编程。

《C++程序设计教程》的笔记-第402页 - 第十二章:多态

基类与子类的虚函数不能只是名字上的重载,而是其声明要一模一样。不然即使用virtual申明了,也不会被滞后处理的。
重载函数如果仅仅是返回值不同的话,编译器会报错,因为编译器是根据函数参数来识别不同的重载函数的。
覆盖有一种特殊的情况下可以允许返回值不同。即返回类的指针或引用,此时类系中该虚函数都是返回本类的指针或引用的。

《C++程序设计教程》的笔记-第475页 - 模板

模板参数主要是类型参数,但也有值参数,或称非类型模板参数。模板参数可以是既包含类型参数,又包含值参数的一个参数列表
如:位集合模板类bitset<11000> Bit
一般来说,模板值参数大多数使用描述空间大小或对象实体数量的整型值,在描述整型值的时候,要求其值为常量或字面值

《C++程序设计教程》的笔记-第455页 - 抽象类

手柄类的引入:
对象指针问题:在纷繁的程序模块中,指针传递来复制去,一不小心就会重复释放,导致运行错误。同样,一不小心就会遗漏释放,导致内存泄露。
对象指针的外套:<原文开始><指针真是烫手!解决的办法是将抽象基类Sony的外面套一个手柄。做一个SonyHandle的手柄类,它里面的数据成员就只有一个Sony类的指针,成员函数有一个转换间访操作和一个构造函数。这样设计的目的:一是装了套子就可以再套子上再装饰,从外部提高类体系的战斗力和防御力;二是让多态行为平凡化,打破非得传递指针和引用才能表现多态的偏见。/原文结束>
class SonyHandle{
Sony *sp;
public:
Sony* operator->()
{
return sp;
}
SonyHandle (Sony* pp):sp(pp) {};
};

《C++程序设计教程》的笔记-第403页 - 第十二章:多态

虚函数的若干限制:
1.只用类的成员函数才能声明为虚函数
2.静态成员函数不能是虚函数
3.内联函数不能是虚函数
4.构造函数不能是虚函数
5.析构函数可以是虚函数且通常声明为虚函数

《C++程序设计教程》的笔记-第477页 - 模板

可以用模板实参来定做模板类
类模板的模板实参通过实例化,则构成了模板的实例,它是定义好了的模板类。如果不想用预定义的类模板来生成模板类,而是以该模板类名自己专门重写一个模板类,则得到模板铸件。得到模板铸件的过程,称为模板定做。模板定做时,必须以template<>开始,然后再class后跟类模板名,即定义需要定做的类。定做时,成员可以在原先类模板的基础上随心所欲地增删,因此,定做的实现可以与类模板的实现完全不同。定做的成员函数不再是模板函数而是普通函数了,类模板中的成员中的类型参数T将被定做的类型取代。模板定做机制使得所产生的模板类可以偏离基本类模板的框架,带来了产生模板实例的灵活性

《C++程序设计教程》的笔记-第435页 - 第十三章:抽象类

用抽象类做界面
因为面向对象编程,总是要涉及类层次结构下的多态,所以处理的对象,往往是通过指针或引用方式传递的,因此对应用编程来说,关键是在类层次结构下的各种对象能够表现出多态。所以我们把目标转向抽象类,一是因为抽象类是类层次结构的基类,基类的指针操作可以表现多态行为;二是因为抽象类可以只提供纯虚函数,不牵扯成员函数定义的细节,不提供任何私有数据,干净利落。
用抽象类来做应用程序的界面,不仅可以避免用户知道类中的细节,又避免了因为类中成员的改变需要来改变应用程序。
例如:假如我们的应用程序要使用某个类DATA 。我们可以将DATA类的公有成员函数提取出来做成纯虚函数。构成一个抽象类IDATA。 再将DATA类继承与IDATA。对于应用程序,就用这个抽象基类与之打周到;对于DATA类,从该抽象基类派生,并实现创建对象的函数CreateData
其中DATA可做成动态链接库

《C++程序设计教程》的笔记-第461页 - 模板

C++程序是一些类型和函数,编程就是设计类型和函数,然后将它们按C++的程序结构组织起来。由于事物的相似性,设计的类型和函数有时也表现出相似甚至相同性。将这些相似的类型和函数归纳起来构成一个类族或函数族,用一种统一的方式来编程就是模板编程。由模板可以得到一系列的相似类型或相似函数,这些相似类型和相似函数涉及的数据其类型可能不同,但处理数据却具有相同的表现形态。
这些相似类型或相似函数就是将涉及的数据之类型为参数来生成的模板,其相似类型称为模板类,相似函数称为模板函数。


 C++程序设计教程下载 更多精彩书评


 

农业基础科学,时尚,美术/书法,绘画,软件工程/开发项目管理,研究生/本专科,爱情/情感,动漫学堂PDF下载,。 PDF下载网 

PDF下载网 @ 2024