C++程序设计语言笔记(4)

来源:互联网 发布:python实现cnn算法 编辑:程序博客网 时间:2024/06/05 06:57

54)函数重载和类属机制所实现的叫做编译时多态;运行时多态指的是基类中定义虚函数,在派生类中对该虚函数进行重定义,要通过基类指针(或基类引用)来调用虚函数;

55)除了构造函数之外,任意非static成员函数都可以根据需要设计为虚函数。

56)当指针调用类的虚函数时,指针是动态绑定所指向的类的对象(基类或者派生类)。

57)通过基类引用调用虚函数同样也采用动态绑定。例如:void printIdentity( Base& obj);

58)指针和引用的静态类型与动态类型可以不同,这是C++用以支持多态性的基石。

59)虚析构函数:如果指针的静态类型是指向基类的,在派生类中调用非虚析构函数就会调用基类的析构函数而不是派生类的析构函数,有可能导致不正确的对象撤销操作。例如:

Base *ptr; 

ptr = new DClass; 

...// 

delete ptr;

60)纯虚函数就是在一般虚函数的声明上加 = 0。包含纯虚函数的称为抽象类。

61)抽象类有如下特性:

只能用作其他类的基类;

不能用于直接创建对象实例;

不能用作函数的形参类型和返回值类型;

不能用于强制类型转换;

可声明抽象类的指针和引用;

62)如果派生类没有对换象类中的全部纯虚函数进行重定义,则该派生类也是一个抽象类。 


63)try{}....catch{....}// throw

64)auto_ptr类用于为动态分配的对象提供针对异常的安全性,使得即使在发生异常的情况下,也能避免内存泄露。auto_ptr是模版类,有以下三种方式创建对象:

auto_ptr<T> ap;

auto_ptr<T> ap (ptr);

auto_ptr<T> ap2 (ap1);

auto_ptr类只能用来管理由new操作返回的单个对象,不能管理动态分配的数组。

例如new了一个新的类的实例,用auto_ptr管理该对象,在函数异常终止时,auto_ptr可以撤销该动态分配的类对象,调用相应的析构函数。


65)C++中的模板包括类模板和函数模板。

66)templeate <typename T>

返回值类型 函数名 (形式参数列表)

{

函数体语句

}

67)函数模板实例化的过程中不进行常规隐式类型转换。

68)自定义名字空间:

namespace 名字空间名{

名字空间的成员

}

69)函数模板也可以重载,在编绎时根据给定实形参匹配(完全)的重载函数,即静态绑定;否则使用模板判断是否匹配;再者与隐式转换的重载函数去匹配。

70)类模板的主要用途是定义容器数据结构。。

71)由于实例化类模板成员函数时使用对象的模板实参来确定函数的模板形参,所以调用类模板成员函数时允许对函数实参进行隐式转换。

72)模板编译有两种模式:包含编译模式和分离编译模式;

73)包含编译模式:在头文件中定义模板,在另一个.cpp文件去实现模板,但是需要在头文件中用预处理指令#include 包含实现文件。

74)分离编译模式中头文件(.h)和与实现文件(.cpp)之间的包含关系是常规的实现文件包含头文件,而不是像包含编译模式那样,由头文件包含实现文件;但是,需要在实现文件中添加一个类模板声明来指出该模板为导出的,例如:

export template <typename T> class Stack;

#include "genericStack.h"

75)非类型模板形参:也是由类型标标符和形参名构成,在对模板进行实例化时,非类型形参由相应模板实参的值代替。

例:

template <typename T, std:size-t N>

void printValues( T (&arr) [N] )

{

for ( std::size_t i = 0; i != N; ++i )

std::cout << arr[i] << std::endl;

}

int intArr[6] = {......};

printValues(intArr);

例2:

类模板……Stack<int, 10> stack;

0 0
原创粉丝点击