下面github中的内容有空看一下
https://github.com/huihut/interview
复习《C++程序设计》笔记
第八章知识点 类和对象
class 访问属性
- private:私有成员,只有本类内的成员函数可以访问
- public:共有成员,类作用域中的所有函数都可以访问
- protected:受保护的成员,类外不可以访问,派生类可以访问
inline成员函数
函数的调用设计到堆栈的操作,时间开销远远大于顺序执行小规模的程序,如果在class内定义的成员函数中不包含循环等控制结构,C++编译器会把它们当作内置函数(inline)来处理
class成员函数的存储方式
类class定义一个对象object,编译系统会为每一个对象分配存储空间,每一个object的数据成员空间独立的,而所有objcet的成员函数共用存储空间,不同的对象使用的是同一段代码空间,为区分不同对象的数据成员,使用this指针来实现区分
第九章 类和对象进一步
this 指针
每一个成员函数中都包含一个特殊的指针,这个指针叫做this指针,指向本类对象的指针,他的数值是当前被调用的成员函数所在对象的起始地址
this指针是隐式的,它作为参数传递给成员函数的,例如定义类Box的成员函数volume时候
int Box::volume()
{
return (height * width * length);
}
C++ 编译器会把它处理为,在行参列表中增加了一个this指针
int Box::volume(Box *this)
{
return (this->height * this->width * this->length);
}
在调用a.volume()时候,实际是调用的a.volume(&a)
共用数据的保护
P282,const等等挺不好理解的,现在先不看了
常对象:Time const t1(10, 12, 13)对象中所有的数据成员的值不能被修改,参考https://github.com/huihut/interview中const介绍
// 类
class A
{
private:
const int a; // 常对象成员,只能在初始化列表赋值
public:
// 构造函数
A() : a(0) { };
A(int x) : a(x) { }; // 初始化列表
// const可用于对重载函数的区分
int getValue(); // 普通成员函数
int getValue() const; // 常成员函数,不得修改类中的任何数据成员的值
};
void function()
{
// 对象
A b; // 普通对象,可以调用全部成员函数、更新常成员变量
const A a; // 常对象,只能调用常成员函数
const A *p = &a; // 常指针
const A &q = a; // 常引用
// 指针
char greeting[] = "Hello";
char* p1 = greeting; // 指针变量,指向字符数组变量
const char* p2 = greeting; // 指针变量,指向字符数组常量
char* const p3 = greeting; // 常指针,指向字符数组变量
const char* const p4 = greeting; // 常指针,指向字符数组常量
}
// 函数
void function1(const int Var); // 传递过来的参数在函数内不可变
void function2(const char* Var); // 参数指针所指内容为常量
void function3(char* const Var); // 参数指针为常指针
void function4(const int& Var); // 引用参数在函数内为常量
// 函数返回值
const int function5(); // 返回一个常数
const int* function6(); // 返回一个指向常量的指针变量,使用:const int *p = function6();
int* const function7(); // 返回一个指向变量的常指针,使用:int* const p = function7();
第11 章知识点 继承和派生
11.1 继承方式
- public共用继承:基类的公用成员和保护成员在派生类中保持原有的访问属性,私有成员仍然为基类的私有
- private私有继承:基类的公用成员和保护成员在派生类中成了私有成员,私有成员仍然为基类私有
- protected保护继承:基类的公用成员和保护成员在派生类中成了保护成员,私有成员仍然为基类私有
11.2 派生类的构造函数和析构函数
执行顺序:派生类构造函数先会调用基类的构造函数,然后再执行派生类自己的构造函数,析构顺序相反
11.3 多层派生时候的构造函数
Student(int n, string nam)
Student1(int n,string nam, int a):Student(n, nam)
Student2(int n,string nam, int a, int s):Student1(n, nam, a)
每一层派生类的构造函数,只需要写上一层派生类的构造函数即可
11.4 多重继承
多重继承会引起二义性的问题:一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,那么在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。
C++提供了虚基类的方法,使得继承间接共同基类的时候只保留一份成员
11.5 虚函数
用同一种方法去调用同一类族中不同类的所有同名函数,可以把基类中的函数前面加上virtual来声明
虚函数的使用方法:
- 在基类用virtual声明成员函数为虚函数,这样就可以在派生类中重新定义此函数,为它赋予新的功能,方便调用
- 在派生类中重新定义该函数,要求函数名,函数类型,函数参数个数和类型全部和基类要一致(当一个成员函数被声明为虚函数后,其派生类中的所有同名函数都自动称为虚函数)
- 定义一个指向基类对象的指针变量,并使得它指向同一类族中的某一个对象
- 通过该指针变量调用该虚函数,此时调用的就是指针变量指向的对象的同名函数