主要是记录总结下自己学习过程中一些领悟。我是个小白,但是我却对底层很好奇,所以我提前翻开这本书。
我主要是总结记录下我认为比较重要的知识点,如果想了解更多,还是去看书吧.如果能对您的学习有益,我很高兴。
1.C相关
C中,数据和处理数据的操作是分开的,也就是语言并不支持数据和函数之间的关联性。一个词总结一下:procedural 程序性的。
例子:打印一个Point3D的例子:
c 语言的实现可能方式:
#include<iostream>
using namespace std;
typedef struct{
int x, y, z;
}Point3D;
void Print_Point3D(const Point3D& p){
cout << p.x << " " << p.y << " " << p.z << endl;
}
int main(){
Point3D temp;
temp.x = 1;
temp.y = 2;
temp.z = 3;
Print_Point3D(temp);
system("pause");
return 0;
}
C++ 的可能实现方式:
#include<iostream>
using namespace std;
class Point3D{
private:
int x, y, z;
public:
Point3D(int x_x = 0, int y_y = 0, int z_z = 0) :x(x_x), y(y_y), z(z_z){
cout << "Using the Constructor" << endl;
}
friend ostream& operator<<(ostream& os, Point3D& p){
os << p.x << " " << p.y << " " << p.z << endl;
return os;
}
};
int main(){
Point3D temp(1,2,3);
cout << temp;
system("pause");
return 0;
}
在提供几种实现方式,篇幅时间有限,只提供一下想法。
1)三重继承体系。从一维到二维在到三维。
2)模版实现下。
总之,C++ 可以采用 ADT 和继承体系实现。
--------------------------------------------------------------
2.封装后的布局成本:
根据上面的例子:
1)三个data member 存在于每一个class object 中。
2)member function 虽然在类中声明,却不出现在object 中。
3)non-inline function 只诞生一个函数实例。
4) inline function 在定义后,会在每一个使用者身上产生一个函数实现。
由此可以看错,对象中存在的主要是数据成员,布局成本并未增加。
一个对象所占的内存空间:
1)内存对齐 2)非静态数据成员 3)virtual带来的增加。
-------------------------------------------------------------------------------
3. C++对象模型:
数据成员分类:静态数据成员和非静态
成员函数分类: 静态函数,非静态 和虚函数。内联和非内联包含在非静态里。
class Point
{
public:
Point( float xval );
virtual ~Point();
float x() const;
static int PointCount();
protected:
virtual ostream& print( ostream &os ) const;
float _x;
static int _point_count;
};
(1)简单对象模型:
可能是为了降低C++编译器的设计复杂度开发的。牺牲了空间和效率。直接用图形表示:
pt里面都是指针,并且按声明的顺序排列。
2)表格驱动对象模型:
应该不用解释了。只区分一点:一个是存放的是实际的数据,函数里面放的只是地址。
3)C++对象模型:
可以看见了。对象里面的东西更少了。只有数据成员和一个虚表指针。其余的都是放在对象之外。
------------------------------------------------------------------------------------------------
4.C++支持的三种程序设计模式:
1)程序模型 2)ADT模型 3)面向对象模型
------------------------------------------------------------------------------------------------
5.C++ 支持的多态的方式:
1)经由一组隐式的转化操作: Shape* ps=new Circle();
2) virtual function
3)dynamic and typdeid 运算符。
---------------------------------------------------------------------------------------------------
6.一个类的对象所占内存大小:
class ZooAnimal {
public:
ZooAnimal();
virtual ~ZooAnimal();
virtual void rotate();
protected:
int loc;
String name;
};
-------------------------------------------------------------------------------------------------------
7.指针相关:
指针的大小一样,正常是4个字节,都是存储一个地址。但是如何实现不同的功能。
内存的角度无任何差异。指针类型会告诉编译器涵盖多少的内存空间。比如int* 的指针会涵盖四个字节。
double* 型的指针会涵盖8个字节。
void* 指针:因为我们不知道void* 指针会涵盖多少多少内存空间,只是存储一个地址。所以不要通过void* 型指针操纵对象。
cast 转换指令只是一种编译器行为。大部分情况下不改版指针存储的内容,只是影响其编译器的解释方式。
比如int* 到 double* 型。原先是涵盖四个字节,转换后会涵盖8个字节,鬼知道会发生什么。
-------------------------------------------------------------------------------------------------------------------------
8. ZooAnimal→Bear:
class Bear :public ZooAnimal{
public:
Bear();
~Bear();
//...
void rotate();
virtual void dance();
protected:
enum Dances{ ..};
Dances dances_known;
int cell_block;
};
Bear b("Yogi");
Bear *pb = &b;
Bear &rb = *pb;
内存布局图:
那么一个ZooAnimal 的指针:ZooAnimal* pz=new Bear();
pz 还是存储1000地址,但是涵盖的大小只能是ZooAnimal 大小。
如果pz=&b;会引起切割。你不能用pz去访问ZooAnimal 之外的东西。因为编译器解释你只能涵盖那一部分。
想那么做可以进行类型转换操作。
---------------------------------------------------------------------------------------------------------------------