面向对象程序设计牢记知识点

发布 2019-06-26 18:06:57 阅读 4966

常指针类型结构体构造析构类的实现静态成员(看说明、注意)函数重载动态申请内存引用练习编程定义两个类实现两个类的对象的相加减。

说明:1) 在程序中,要求一个函数的原型出现在该函数的调用语句之前。但当一个函数的定义在前,而对它的调用在后时,则不必给出原型。

2) 函数原型的参数表中可不包含参数的名字,而只包含它们的类型。

3) 注意函数定义部分和函数原型的区别:参数,分号。

4) c++的参数说明必须放在函数名后的括号内,不可放在函数说明部分与函数体之间。

5) 主函数main()不必进行原型说明。

6) 原型中没有指出返回值的函数,c++默认该函数的返回类型是int。

7) 注意c和c++的区别:

8) int f();

9) c中:参数信息没有给出。

10) c++中:表示不带任何参数,与int f(void);等价因为有了原型,使c++容易表达函数重载。

11) 在c++中,结构与类的唯一区别是:缺省时,结构的所有成员是公有的,类的所有成员是私有的。

12) 在c++中,联合也是一种类,但联合的所有成员只能为公有成员,关键字private和protected不能用于联合。

13) 构造函数与类同名,且没有返回值类型。

14) 构造函数既可在类外定义,也可作为内联函数在类内定义,也允许重载。

15) 构造函数既可定义成有参函数,也可义成无参函数,要根据问题的需要来定。构造函数也可以有缺省参数,在使用时要防止二义性。

16) 在c++中,给对象的数据成员初始化的方法就是利用构造函数。

17) c++规定,每个类必须有一个构造函数。如果在类中没有显式定义构造函数时,则c++编译系统在编译时为该类提供一个默认的构造函数,该默认构造函数是个无参函数,它仅负责创建对象,而不做任何初始化工作。

18) 析构函数与类同名,但它前面必须加上(~)

19) 没有返回值,没有参数,不能随意调用,也没有重载,只是在类对象生命期结束时,系统自动调用。

20) 在一个类中只能有一个析构函数。

21) 如果程序员在定义类时,没有为类提供析构函数,则系统会自动创建一个默认的析构函数,其形式为: ~类名()

22) 对于一个简单的类来说,大多可以直接使用系统提供的默认析构函数。但是,如果在类的对象中分配有动态内存(如:用new申请分配的内容)时,就必须为该类提供适当的析构函数,完成清理工作。

23) 对象被析构的顺序与对象建立时的顺序正好相反。即最后构造的对象先被析构。

24) 上例中在main函数中的语句employee obj2(obj1);在执行时,系统会自动调用类employee的拷贝构造函数完成对obj2对象的构造。

25) 如果程序员没有为所设计的类提供显式的拷贝构造函数,则系统会自动提供一个默认的拷贝构造函数,其功能是:把作为参数的对象的数据成员逐个拷贝到目标变量中,这称为成员级复制(或浅拷贝)。

26) 当创建一个新对象并用一个已知对象对其初始化时,调用拷贝构造函数。

27) 初始值表必须位于构造函数的参数行后与其实际定义体之间,中间用:连接。

28) 初始值表的格式:数据成员名(数值)

29) 初始值表只能出现在构造函数的定义部分而非原型位置。

30) 当在一个类中使用const修饰数据成员或声明了引用类型的数据成员时,这些数据成员必须在该类的对象建立的同时进行初始化,这种初始化也是通过初始值表进行的。

31) this指针是一个隐含的指针,不能被显示声明,它只是一个形参,一个局部变量,它在任何一个非静态成员函数里都存在,它局部于某一对象。

32) this指针是一个常指针,可以表示为(但不能显示声明): x *const this。因此,this指针不能被修改和赋值。

33) 不管在类外还是类内访问类的成员都需要使用对象。成员或指向对象的指针成员。类内直接访问成员的方式实际上就是this成员的方式。

34) this指针主要用于运算符重载和自引用以及将成员函数的返回值设定为所属类类型等场合。

35) 静态数据成员属于类(准确地说,是属于类中一个对象集合),而不像普通数据成员那样属于某一对象,因此可以使用“类名:’访问静态的数据成员。例如上面例子中的student::

count。

36) 静态数据成员不能在类中进行初始化,因为在类中不给它分配内存空间,必须在类外的其它地方为它提供定义。一般在main()开始之前,类的声明之后的特殊地带为它提供定义和初始化。缺省时,静态成员被初始化为零。

37) 静态数据成员与静态变量一样,是在编译时创建并初始化。它在该类的任何对象被建立之前就存在,它可以在程序内部不依赖于任何对象被访问。

38) c++支持静态数据成员的—个主要原因是可以不必使用全局变量。依赖于全局变量的类几乎都是违反面向对象程序设计的封装原理的。静态数据成员的主要用途是定义类的各个对象所公用的数据,如统计总数、平均数等。

39) 静态成员函数可以定义成内嵌的,也可以在类外定义,在类外定义时,不要用static前缀。

40) 编译系统将静态成员函数限定为内部连接,也就是说,与现行文件相连接的其它文件中的同名函数不会与该函数发生冲突,维护了该函数使用的安全性,这是使用静态成员函数的一个原因。

41) 使用静态成员函数的另一个原因是,可以用它在建立任何对象之前处理静态数据成员,这是普通成员函数不能实现的功能。

42) 在一般的成员函数中都隐含有一个this指针,用来指向对象自身,而在静态成员函数中是没有this指针的,因为它不与特定的对象相联系,调用时使用如下格式较好:类名:静态成员函数名() 当然,也可通过对象去调用:

对象名。静态成员函数名()

43) 一般而言,静态成员函数不访问类中的非静态成员。若确实需要,静态成员函数只能通过对象名(或指向对象的指针)访问该对象的非静态成员。

44) 友元函数虽然可以访问类对象的私有成员,但它毕竟不是成员函数。因此,在类的外部定义友元函数时,不必像成员函数那样,在函数名前加上“类名::”

45) 友元函数一般带有一个该类的入口参数。因为友元函数不是类的成员,所以它不能直接引用对象成员的名字,也不能通过this指针引用对象的成员,它必须通过作为入口参数传递进来的对象名或对象指针来引用该对象的成员。

46) 当一个函数需要访问多个类时,友元函数非常有用,普通的成员函数只能访问其所属的类,但是多个类的友元函数能够访问相应的所有类的数据。

47) 友元函数通过直接访问对象的私有成员,提高了程序运行的效率。在某些情况下,如运算符被重载时,需要用到友元。但是友元函数破坏了数据的隐蔽性,降低了程序的可维护性,这与面向对象的程序设计思想是背道而驰的,因此使用友元函数应谨慎。

48) 一个类的成员函数作为另一个类的友元函数时,必须先定义这个类。并且在声明友元函数时,要加上成员函数所在类的类名,如:friend void boy::disp(girl&);

49) 注意向前引用

50) 友元关系是单向的,不具有交换性。若类x是类y的友元(即在类y定义中声明x为friend类),类y是否是x的友元,要看在类中是否有相应的声明。

51) 友元关系也不具有传递性,若类x是类y的友元,类y是类z的友元,不一定类x是类z的友元。

52) 派生类从基类继承下来的成员可以当作是自己的成员一样使用。但不能访问基类的私有成员 。

53) 派生类中继承来自基类的任何成员,其类范围仍属于原基类。

54) 在派生类中允许定义与基类中相同名称的数据成员或成员函数,此时基类中同名的成员被隐藏(或覆盖),使得编译器在派生类范围内看不见,但它们仍然被继承下来且是派生类的成员的一部分,如果要在派生类中使用基类的同名成员,必须指明类范围。

55) 访问声明仅仅调整名字的访问,不可为它说明任何类型。int a::c; /error

56) 访问声明仅用于派生类中调整名字的访问权限,不允许在派生类中降低或提升基类成员的可访问性。基类的私有成员不能用于访问声明。

57) 对重载函数名的访问声明将调整基类中具有该名的所有函数的访问域;具有不同访问域的重载函数名不能用于访问声明;如果基类的一个成员在派生类中也把同一名字定义为一个成员,则不可调整它的访问。

58) 若基类的构造函数不带参数,派生类不一定需要构造函数,然而,当基类的构造函数哪怕只带有一个参数,派生类都必须有构造函数。

59) 当派生类构造函数调用的是基类的default constructor,则初始值表可以省略。

60) a. 转换函数必须是类的成员函数(不能是友元函数)

61) b. 转换函数不可以指定其返回值类型。

62) c. 转换函数参数行不可以有任何参数。

63) d. 编译器也会自动调用转换函数以完成类型转换工作。

64) 在c++中几乎所有的运算符(除“.”65外)都可以被重载。

66) 运算符的重载既不会改变原运算符的优先级和结合性,也不会改变使用运算符的语法和操作数个数。

67) 当重载为类的成员函数时,运算符重载函数的形参个数要比运算符操作数个数少一个;若重载为友元函数,则参数个数与操作数个数相同。

68) 当重载为友元函数时》”等运算符不能重载。

69) 成员函数与友元函数的选用:

70) 若一运算符的操作需要修改类对象的状态,则它应该是成员函数。需要左值操作数的运算符(如=,*的重载最好用成员函数;相反,如果运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则该运算符重载必须用友元,而不是成员函数。

71) 该重载函数的返回类型是ostream类的对象的引用。返回类型使用引用的目的在于,当几个运算符《连在一起时,该重载函数能工作。

72) 运算符函数必须被重载为友元。因为引起该重载函数的调用的运算对象是第二个参数而不是第一个参数。

73) 虚函数可以在一个或多个派生类中被重新定义,但要求在派生类中重新定义时,必须与基类中的函数原型完全相同(包括函数名、返回类型、参数个数和参数类型的顺序)。这时无论在派生类的相应成员函数前是否加上关键字virtual,都将视其为虚函数,如果函数原型不同,只是函数名相同,c++将视其为一般的函数重载,而不是虚函数。

74) 只有类的成员函数才能说明为虚函数。因为虚函数仅适用于有继承关系的类对象,所以普通函数不能说明为虚函数。虚函数也不能是一个静态成员。

75) 内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的。即使虚函数在类的内部定义,编译时,仍将其看作非内联的。

76) 构造函数不能是虚函数,因为构造时,对象还是一片未定型的空间。只有在构造函数完成后,对象才能成为一个类的名副其实的实例。

77) 析构函数可以是虚函数,而且通常声明为虚函数。

78) 当一个函数在基类被声明为虚函数后,不管经历多少层派生,都将保持其虚拟性。因此,在派生类中重新定义该函数时,不再需要关键字virtual。