C++初级之基本知识
2010-11-02 08:59:37 来源:WEB开发网11. 派生类中重定义的函数和基类函数具有相同的函数名称和参数列表。但是如果派生类的函数仅仅和基类的函数名称相同,而参数列表不同,这就不是重定义,而是派生类的函数重载。
12. 派生类的构造函数必须能够触发基类的析构函数,除非想使用基类的默认构造函数(无参数列表)。C++派生类构造函数的函数头中指定调用基类的析构函数。
13. 在面向对象程序设计中,对象是基本的实体;在结构化程序设计中,函数是基本实体。在面向对象程序设计中,调试对象;在结构化程序设计中,调试函数。在面向对象程序设计中,程序是相互关联的对象集合;在结构化程序设计中,程序是相互关联的函数集合。在C++中,对象仅仅是类的示例,因此C++程序设计的本质就是类的设计。
14. 面向对象程序设计的三个基本特征:
封装:把数据和数据上的操作组合在一个独立单元中的能力;
继承:在现有的对象基础上创建新的对象的能力;
多态:使用相同个的表达式指定不同操作的能力。在C++中函数名称和运算符重载支持多态;模板支持参数多态机制;继承中使用虚函数支持多态机制。
15. 浅拷贝:两个或是多个相同类型的指针指向同一个内存地址,即它们指向同一个数据;深拷贝:两个或是多个相同类型的指针指向各自内存地址。在含有指针数据成员的类中,要防止浅拷贝(类对象的值拷贝),即没有给不同的对象的指针变量分配不同的地址空间。显然这样的情况,类的对象不能被很好的区分,同时容易出现错误。常见的赋值运算符、拷贝构造函数等(涉及类中的指针数据成员操作),都需要给新的对象的指针分配新的地址空间,并对这些地址空间赋值。
16. 自动执行拷贝构造函数的情况:1)使用其他现存的对象的值声明和初始化新对象时。2)对象作为值参数传递给函数时。(少见,一般类不使用值传递)。
17. 一般形参和实参应该一致。但是,对于类,C++允许用户将派生类的对象传递给基类类型的形参(值参数)。这是因为:派生类必然含有基类的所有成员,也就是基类的所有操作派生类都含有。反之,若形参是派生类类型,那么基类是不能传递给它的。因为基类仅仅是派生类的子集。这样的传递存在一些问题,见下一条。
18. 编译时绑定,即静态绑定:在编译时,调用指定的函数所必须的代码是由编译器指定的,也就是编译器根据形参的类型来编译相应的函数,比如函数重载、函数模板、类模板,对于类参数,则编译器根据类的类型编译相应的类成员函数。根据类指针类型编译相应的类成员函数。
19. 运行时绑定,即动态绑定:在编译时,编译器并不产生调用函数的代码,而只是提供必要的信息,使得运行时系统能产生实际的代码来调用相应的函数。C++中通过虚函数机制来实现动态编译。即程序根据实际运行过程中,函数的参数类型来产生相对应的函数代码。这种机制在将派生类的对象传递给基类类型的形参的函数调用中特别有用。同时需要注意,要使虚函数有效,形参必须是基类的引用或是指针,如果是值参数,那么由于传递过程是值拷贝,也就是自动调用基类的拷贝构造函数把派生类的中包含的基类成员变量拷贝给基类对象而已,因此函数内部的操作也仅仅是对派生类的基类的操作而已。
20. 基类的虚析构函数:当类含有指针数据成员时(特别是派生类),基类的析构函数一点要是虚析构函数。当基类指针指向派生类对象时,显然当派生类退出其作用域时,由于虚函数的机制,程序可以动态的根据指针内容的类型来自动的调用相应的析构函数,即先执行派生类的析构函数,再执行基类的析构函数。这样可以防止内存泄漏。(或许有人会说,只要总是保持一致:函数参数类型一致、指针指向的对象类型和指针类型一致,就不会出现上述问题。事实上确实如此,因此在自己编程上要保持这种一致性。然而,必须承认对于类的使用者谁能够保证总是一致呢?因此这种机制是必须的。这也是多态所要求的)
更多精彩
赞助商链接