《C++程序设计》复习资料
1、this指针可指向常量型数据、可指向成员函数,不可以指向静态成员函数。this指针始终指向调用成员函数的对象
2、宏定义语句:#define BUFSIZE 100; == 多态性与虚函数const int BUFSIZE 100;
3、模板类的基类和派生类都可以是模板类或非模板类
4、类A声明为类B的友元后,类A直接访问类B的公有成员
5、对数据进行降幂和检索操作,需要包含头部文件functional。对数据进行升幂等操作,需要包含头部文件algorithm。对数组操作升幂排序的方法:sort(a,a+len)
6、虚函数只能是类中的一个成员函数,但不能是静态成员。使用虚函数不一定产生多态性,也不一定使用动态联编,前提条件:类之间的继承关系满足赋值兼容性规则,改写同名虚函数,根据赋值兼容性规则使用指针。作为虚函数隐含参数的this指针,决定了虚函数调用时执行的代码。
7、C++编译指令:所有编译指令都是以#开始的,每条指令单独占一行,同一行不能有其他编译指令和C++语句(注释除外)
8、内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inline限定符。在类定义中的定义的函数都是内联函数,即使没有使用inline说明符。
9、派生类可以继承多个基类派生类对象中包含基类对象,因此派生类对象在创建时,除了要调用自身的构造函数进行初始化外,还要调用基类的构造函数初始化其包含的基类对象。因此,程序中任何能够生成派生类对象的语句,都要说明其包含的基类对象是如何初始化的。如果对此不做说明,则编译器认为基类对象要用无参构造函数初始化——如果基类没有无参构造函数,则会导致编译错误。在执行一个派生类的构造函数之前,总是先执行基类的构造函数。和封闭类说明成员对象如何初始化类似,派生类说明基类对象如何初始化,也需要在构造函数后面添加初始化列表。在初始化列表中,要指明调用基类构造函数的形式。
保护继承时,类成员的访问级别只能降低为保护模式,因此即使是基类的公有成员也被缩小为保护模式。
派生类对象消亡时,先执行派生类的析构函数,再执行基类的析构函数。在C++中,派生可以是多层次的。例如学生类派生出中学生类,中学生类又派生出初中生类和高中生类。总之,类A派生类B,类B可再派生类C,类C又能派生类D,以此类推。这种情况下,称类A是类B的直接基类,类B是类C直接基类,类A是类C的间接基类。当然,类A也是类D的间接基类。在定义派生类时,只写直接基类,不写间接基类。派生类沿着类的层次自动向上继承它所有的间接基类。派生类的成员包括派生类自己定义的成员、直接基类中定义的成员,以及所有间接基类的全部成员。当派生类的对象生成时,会从最顶层的基类开始逐层往下执行所有基类的构造函数,最后再执行自身的构造函数;当派生类对象消亡时,会先执行自身的析构函数,然后从底向上依次执行各个基类的析构函数。
派生类构造函数进行初始顺序:调用基类构造函数,调用子类对象的构造函数,执行派生类的构造函数。析构函数进行操作顺序:调用成员对象析构函数,对派生类新增的成员对象进行清理,调用基类析构函数,对基类进行清理。
类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。成员函数可以在类体外定义。
成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义。在类定义中定义的成员函数把函数声明为内联的,即便没有使用 inline 标识符。所以可以按照如下方式定义 Volume() 函数:
class Box {
public: double length; // 长度
double breadth; // 宽度
double height; // 高度
double getVolume(void)
{ return length * breadth * height;
}
};
也可以在类的外部使用范围解析运算符 :: 定义该函数,如下所示:
double Box::getVolume(void)
{ return length * breadth * height;
}
在 :: 运算符之前必须使用类名。调用成员函数是在对象上使用点运算符(.),这样它就能操作与该对象相关的数据。(作用域运算符“::”的功能是标识成员是属于哪个类的
10、类的访问权限主要有public,protected和private。
11、在面向对象方法中,所谓多态性就是不同对象收到相同消息,产生不同的行为。在C++程序设计中,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操
作,这样就可以用同一个函数名调用不同内容的函数。在程序设计中经常会使用到多态性。最简单的例子就是运算符,例如我们使用运算符+,就可以实现整型数、浮点数、双精度类型之间的加法运算,这三种类型的加法操作其实是互不相同的,是由不同内容的函数实现的。这个例子就是使用了多态的特征。
在C++中,多态性的实现和联编(也称绑定)这一概念有关。一个源程序经过编译、链接,成为可执行文件的过程是把可执行代码联编(或称装配)在一起的过程。其中在运行之前就完成的联编成为静态联编(前期联编);而在程序运行之时才完成的联编叫动态联编(后期联编)。静态联编支持的多态性称为编译时多态性(静态多态性)。在C++中,编译时多态性是通过函数重载和模板实现的。利用函数重载机制,在调用同名函数时,编译系统会根据实参的具体情况确定索要调用的是哪个函数。动态联编所支持的多态性称为运行时多态(动态多态)。在C++中,运行时多态性是通过虚函数来实现的。
12、每个C++程序中都要有且仅有一个主函数,该函数是程序的入口,而语句、预处理命令和函数及类在程序中都可以有多个。
13、 在C++中,要实现动态联编,必须使用基类指针调用虚函数。动态联编是以虚函数为基
础的;动态联编是在运行时确定所调用的函数代码的;动态联编调用函数操作是指向对象的指针或对象引用。