您的位置:首页 > 编程语言 > C语言/C++

c++ primer 学习笔记

2015-09-08 09:45 232 查看
C++ primer学习笔记

面向对象编程

1、面向对象:数据抽象、继承、动态绑定。

2、在C++中,通过基类的指针或引用调用虚函数时,发生动态绑定,引用或指针既可以指向基类对象又可以指向派生类对象,这一事实是动态绑定的关键,用指针或引用调用的虚函数在运行时确认,被调用的函数是引用所指对象的实际类型所确定的。动态绑定是通过虚函数表实现,在程序编译链接的时候,虚函数并未与某个特定的对象进行绑定,也没有也没有向其赋予某个地址,而是生成一个虚函数表和虚函数指针。

3、虚析构函数:继承层次的根类一般都要定义虚析构函数。

4、Protected成员:不能被类的用户访问,可以被该类的派生类访问。派生类只能通过访问派生类对象访问其基类的protected的成员,派生类对其基类类型对象的protected成员没有特殊访问权限。

5、基类类型引用和指针的关键在于静态类型(在编译时可知的引用类型和指针类型,无论指向基类类型或派生类类型,编译器都当做基类类型对象)和动态类型(指针或引用所绑定的对象的类型,仅在运行时可知)可能不同。指针和引用的静态类型和动态类型可以不同,这是c++支持多态的基石。

6、覆盖虚函数机制:在某些情况下可能需要覆盖虚函数机制并强调调用虚函数的特定版本,可以使用作用域操作符实现。只有成员函数中的代码才应该使用作用域操作符覆盖虚函数机制。一般覆盖虚函数机制的使用是为了派生类虚函数调用基类中的版本。

7、虚函数与默认实参:如果一个调用省略了具有默认值的实参,则所用的值由调用该函数的类型决定,与对象的静态类型有关,和动态类型无关。

8、尊重基类接口:构造函数只能初始化其直接基类的原因是每个类都定义了自己的接口。派生类构造函数不能初始化基类的成员且不应该对基类成员赋值,如果成员为protected和public,派生类构造函数可以在构造函数体内为基类成员赋值,但是这样会违反基类的接口,派生类应该通过使用基类的构造函数尊重基类的初始化意图,而不是在派生类构造函数的函数体中为这些成员赋值。

9、派生类复制构造函数,应该显示调用基类的复制构造函数,否则隐式调用基类的构造函数,造成混乱。

10、即使析构函数啥也不做,继承层次的根类也应该定义一个虚析构函数。构造函数和赋值运算符不是虚函数。

11、构造函数和析构函数中的虚函数:无论由构造函数(析构函数)直接调用虚函数还是从构造函数(析构函数)所调用的函数间接调用虚函数,所运行的都应该是为构造函数或析构函数自身类型定义的版本。假设基类的构造函数中调用虚函数的派生类版本,虚函数的派生类版本可能会访问派生类的成员,但是派生类的成员不会在基类的构造函数运行期间初始化,实际上,允许这样的访问,程序可能会崩溃。

12、继承情况下的类作用域:名字查找在编译时发生,静态类型决定可以访问什么成员。

13、重载必须在相同作用域,局部作用域不会重载全局作用域中的函数,同样,派生类中定义的函数也不重载基类中的定义的成员。通过派生类对象调用函数时,实参必须和派生类中定义的版本相同,只有在派生类根本没有定义该函数时,才考虑基类函数。

14、名字查找和继承:理解c++中继承层次的关键在于理解如何确定函数调用,确定函数调用遵循以下四个步骤。

(1)首先确定进行函数调用的对象、指针、引用的静态类型。

(2)在该类中查找函数,如果找不到,就在其直接积累中查找,如此循着继承链向上查找,直到找到该函数或查完最后一个类,如果找不到,则调用错误。

(3)一旦找到该名字,就进行常规类型检查,查找如果给定找到的定义,该函数调用是否合法。

(4)假设函数调用合法,编译器就生成代码。如果函数是虚函数且通过指针或引用调用,则编译器生成代码以确定根据对象的动态类型运行哪些版本,否则,编译器生成代码直接调用函数。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

泛型编程

1.面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性和参数式多态性。

2、typename和class的区别:在函数模板形参表中,关键字typename和class具有相同的定义,可以互相交换使用,两个关键字都可以在同一模板形参表中使用。Typename可以用来指定一个名字是一个类型,如果拿不准是否需要以typename指明一个名字是一个类型,那么指定它是个好主意,在类型之前指定typename没有害处,即使typename没有必要。

3、模板只是一个蓝图,其本身不是类或函数。编译器用模板产生指定的类或函数的特定类型版本。产生模板的特定类型实例的过程称为实例化。

4、模板特化:类模板特化应该与它特化的模板定义相同的接口,否则当用户试图使用未定义的成员时会感到奇怪。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: