第一章 关于对象笔记

主要是记录总结下自己学习过程中一些领悟。我是个小白,但是我却对底层很好奇,所以我提前翻开这本书。

我主要是总结记录下我认为比较重要的知识点,如果想了解更多,还是去看书吧.如果能对您的学习有益,我很高兴。

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 之外的东西。因为编译器解释你只能涵盖那一部分。

想那么做可以进行类型转换操作。

---------------------------------------------------------------------------------------------------------------------

9.最后几句话:

多态所造成的一个力量不适用于直接操作object

举个简单的例子。

Bear b; b.rotate(); 调用的就是b中rotate函数,绝不会是父类中的。所以会说多态一般通过虚函数和指针实现。

感觉笔记好难写,可能是想兼顾的太多了吧。下次也许只会写一些自己没见过的东西。
坐在床上写东西好难受!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值