总结 类与继承知识点
一、类和对象
1.类
① 类定义的关键字是 class ;
② 类的访问限定符包括 public、 private 和 protected ;
③ 类成员默认的访问方式是private;
④ 访问限定符在类中无先后次序,各限定符允许多次出现;
⑤ 类的数据成员通常指定为私有成员;函数成员通常指定为公有成员;
⑥ 指定为公有的类成员可以在类对象所在域中的任何位置以“对象名.成员变量”形式访问;
⑦ 类的私有和保护成员只能被该类的成员函数或友元函数访问。
2.函数原型三要素:函数返回类型;函数名;形参列表(至少要有形参类型) eg;int f(int,int,int);
3.拷贝构造函数(复制构造函数)的三种调用情况:
当类的一个对象去初始化该类的另一个对象时;
‚如果函数的形参是类的对象,调用函数进行形参和实参结合时,形参建立;
ƒ如果函数的返回类型是类类型,函数调用完成返回时,return 语句返回的对象值会初始化访问该函数的匿名对象;
4.析构函数的调用情况
当类对象过期时,程序将自动调用析构函数,不用再代码中显示调用
5.对象不能调用构造函数,因为构造函数是用来创建对象的,之前不存在对象
6.默认构造函数的两种形式:参数都有默认值;无参数
7.当默认构造函数无参数时,私有成员将会是随机值;
8.构造函数的参数名不能与类成员相同,参数表示的不是类成员,而是赋给类成员的值
9.构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。
10.当一个对象定义时,C++编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C++编译系统自动调用析构函数注销该对象并进行善后工作;
11.如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的;拷贝构造函数只有一个参数,并且是该类对象的引用;拷贝构造函数的名字与类同名,并且不被指定返回类型;拷贝构造函数是一种成员函数。
12.构造函数的任务是建立对象,类中可以有多个构造函数,它们由参数区分。如果类说明中没有给出构造函数,则C++编译器会提供构造函数,该函数不完成对象初始化工作。
13.复制构造函数的参数是对象的复制,当程序没有给出复制构造函数时,编译系统会提供 默认复制构造函数 ,完成类对象的复制。复制构造函数被调用情况有3种。
14.析构函数在对象释放时被自动调用。类中没有定义析构函数时,编译系统会提供一个默认的析构函数。该函数不完成具体对象的清理工作。
15.对象初始化发生的三个地方:
定义对象时;
‚函数调用时的值传送,即形参被建立,存在初始化
ƒ函数的返回类型为类类型时,return语句返回的对象值将被用于初始化调用该函数的匿名对象
16.对象成员一定要通过初始化表来初始化;初始化的顺序是按在类中声明的顺序进行,与初始化表中出现的顺序无关
17.析构函数的调用顺序与构造函数的调用顺序相反
18.静态成员:static int i;static int f(int i)
静态数据成员为所在类的所有对象共享,可以修改;
‚ 静态数据成员一定是在类中声明,类外初始化;
ƒ 静态成员函数只能访问该类的静态数据成员或静态成员函数;
④ 静态成员函数没有this指针;
⑤ 以类名+作用域运算符的形式访问静态成员函数;
19.常量成员:const int& m;(常引用)
const int j;(常变量)
const CPoint p;(常对象)
void buy()const;(常量成员函数)
常量数据成员的初始化必须在初始化表中完成,不可修改
‚ 常量成员函数中,不能有修改类中数据成员的语句(可以访问),也不能访问类中的非常量成员函数
20.友元三种形式:
外部函数可以访问A类数据成员
‚ A类中的一个成员函数可以访问B类数据成员
ƒ A类中所有的成员函数都可以访问B类数据成员
21.友元函数是非成员函数,在类体内说明了,在类体外定义,定义和调用等同于一般的普通函数;有和成员函数相同的访问权限;由于它可以直接访问类的私有成员,因此破坏了类的封装性和隐藏性,尽量少用;
22.this指针是一个隐含在成员函数中的特殊指针,用于指向正在被成员函数操作的对象
非静态成员函数指针在主程序中的定义形式:
double(CPoint::*pFun)()=CPoint::getx;
修改函数指针的指向:
pFun=CPoint::gety;
调用函数指针的形式:
cout<<(p1.*pFun)()<<endl; 或
cout<<(p1->*pFun)()<<endl;
‚ 静态成员函数指针在主程序中的定义形式:
int(*pFun)()=CPoint::ObjectNum;
调用函数指针的形式:
cout<<(*pFun)()<<endl; 或
cout<<pFun()<<endl;
23.函数的重载,函数名相同,参数类型不相同或者参数个数不相同;
24.深拷贝使得不同的对象拥有不同的资源;
二、继承
1.派生类中继承的基类成员的访问权限到派生类受继承方式影响;
2.继承的三种方式:公有继承,私有继承,保护继承;默认继承方式为private;
①共同点:基类的private成员成为派生类的隐藏的私有成员,称为不能直接访问成员 ;
②区别:私有继承,基类的public、protected成员在派生类中作为private成员;公有继承,基类的public、protected成员在派生类中访问属性不变;保护继承,基类的public、protected成员在派生类中作为protected成员;
3.派生类可以只从一个基类中派生,也可以从多个基类中派生;
单继承:从一个基类中派生的继承方式;
多继承: 从多个基类中派生的继承方式;
4.一个派生类可以作为另一个派生类的基类。无论是单继承还是多继承,派生类至少有一个基类;
5.派生类的成员除了它自己的成员外,还包含了它的基类成员;
6.基类的构造函数、析构函数和友元函数是不能被派生类继承的;
7.派生类的构造函数的2项工作:
①完成基类数据成员的初始化;
②完成基类中新增数据成员化;
8.派生类构造函数的执行顺序:
(1)执行所有基类的构造函数(顺序按定义派生类时指定的各基类顺序);
(2)执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序);
(3)最后执行派生类构造函数体中的内容;
9.派生类对象初始化规则:
(1)从基类继承下来的数据成员的初始化由基类的构造函数完成
(2)对象成员的初始化由其所属类的构造函数完成
(3)派生类新添加的数据成员的初始化由派生类的构造函数完成
(4)派生类的构造函数必须使用初始化表
10.派生类对象的数据成员的初始化顺序:
(1)初始化从基类继承的对象成员
(2)初始化从基类继承的其他数据成员
(3)初始化派生类的对象成员
(4)初始化派生类的其他数据成员
11.水平访问:主函数中类实例访问基类或派生类的公有成员;
垂直访问:派生类中成员函数对基类成员的访问;
12.成员函数的同名覆盖:当派生类成员函数原型和基类的某个成员函数相同时,若使用派生类对象调用函数,派生类成员函数将覆盖基类的同名函数;
13.赋值兼容规则: 指在需要基类对象的任何地方都可以使用公有派生类的对象来替代;(前提:采用公有继承)
替代包括以下情况:
(1)派生类对象可以赋值给基类对象
(2)派生类对象可以初始化基类的引用
(3)派生类对象的地址可以赋给指向基类的指针
14.虚基类:
①概念:在多重继承(多继承)中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝;这种派生类对基类只产生一个拷贝的继承方式叫做共享继承;
②作用:引进虚基类的目的是为了解决二义性问题,使得公共基类在它的派生类对象中只产生一个基类子对象;
15.多继承派生类构造函数构造对象时,构造函数的调顺序是:
①虚基类的构造函数;
②派生类中子对象类的构造函数,;
③派生类自己的构造函数;
16.派生类的析构函数的执行次序与构造函数正好相反;
17.出现二义性有两种情况:
①调用不同基类的相同成员时可能出现二义性;
②访问共同基类的成员时可能出现二义性;
派生类和它的基类中出现同名函数时,不可能出现二义性。
18.消除二义性的两种方法
①在派生类中采用作用域运算符;
②在派生类中采用虚基类;