一.类的大小:A a; 求sizeof(a)
1.空类的大小是1
2.sizeof(a) = 非静态数据成员的大小 + v_ptr(指向虚函数表的指针) + 虚继承时一个指向基类的指针
3.其他成员函数也在内存中,保存在代码段
参考:http://tudian2007.blog.163.com/blog/static/3156641320132178319185/
二.类的const成员
2.1 const数据成员 :必须在类的构造函数的初始化列表中初始化
必须在类的初始化列表中初始化的变量(4种): const (常数)/&(引用)/没有默认构造函数的类类型/派生类初始化基类
2.2 const函数成员 :不可修改类的数据成员(mutable标识可以被const函数修改)
不能用const 修饰构造函数
三.友元函数
只是普通函数,不属于类。可以访问类的proteted/private/public成员
友元关系不具有继承性,传递性
四.static成员
static成员不属于类,static函数没有this指针
stratic成员类体外定义
五.继承与虚函数
1.oop: 数据抽象 (类实现)
继承 (类派生实现)
动态绑定 (虚函数,基类指针调用虚函数)
继承中的内存分配:
基类保存自己的数据结构,
派生类保存基类+自己的数据结构。
虚函数一直保存在基类中。
例如:
class A{
public :
int a;
virtual print(){};
}
class B:public A{
public:
int b;
print(){};
}
内存中:class A保存这 B::print() +a
class B保存 B::a+B::b
2.继承关系中关键字的作用域
public: 类本身+派生类+类的对象 均可以访问
protected: 类本身+派生类 可以直接访问
private: 类本身 可以访问
public 继承: 基类中的关键字不变
protected继承: 基类中的public变成派生类的protected成员
private继承: 基类中public/protected成员变成派生类的privated成员
3.成员函数的覆盖
派生类重载基类的函数后,不能直接用派生类的指针调用基类的函数
例如:
class A{
public:
int add(){ }
}
class B: public A{
public:
int add(int a, int b) {return a+b;}
}
B *b= new B;
b->add(1,2); //OK
b->add(); //ERROR
b->A::add(); //OK
4.自动转换
基类指针 不能直接转成派生类
派生类指针可以转成基类
5.虚函数
除构造函数外,任意非static成员函数都可以是virtual
通过虚函数表,记录虚函数的地址
参考: http://coolshell.cn/articles/12165.html
6.纯虚函数
int add() =0; =0标识为纯虚函数
不能为纯虚函数的类创建对象