马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
目次
1.标题形貌及分析
2.结论
差异范例所产生的指针在C++语言中有什么作用?带着这个疑问,对C++的指针举行简介。
1.标题形貌及分析
在如下的一段代码中,分别有4个指针,这四个指针有什么不一样的地方么?
- class ZooAnimal
- {
- public:
- ZooAnimal();
- virtual ~ZooAnimal();
- //...
- virtual void rotate();
- protected:
- int loc;
- string name;
- };
- ZooAnimal za("Zoey");
- ZooAnimal *pza = &za;
- int *pi;
- Array<string> *pta;
- void *ptv;
复制代码 就内存需求的观点而言,没有差异,他们必要有充足的内存存储一个呆板地点,在32位体系中就是32bit。
就所寻址的object是差异,也就是说“指针范例”会辅导编译器怎样表明某个特定地点中的内存巨细和内容。
1)一个指向地点int的整数指针,在32位的呆板上,所涵盖的地点是1000-1003,由于32位呆板上是4Bytes。
2)如果string是传统的8Bytes,那么一个ZooAnimal指针高出地点空间1000-1015,见下图4+8+4。
对于指向1000的void *指针,地点空间巨细和内容我们是不知道的。转换(cast)是一个编译器指令,大部门环境并不改变指针所含有的真正地点。
如今,我们界说一个Bear,他public继续ZooAnimal,我们看看如下的代码的指针作用。
- 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 = *p;
复制代码 b,pb,rb的内存结构是什么样子的?可以看出Bear object必要24Bytes,也就是ZooAnimal的16Bytes加上Bear所带来的8Bytes。
除了表明对象的结构外,尚有对象的member function访问环境也必要进一步的分析。由于对象的指针,存在作用域,它会根据作用域调用member function。
- Bear b;
- ZooAnimal *pz = &b;
- Bear *pb = &b;
- //不合法,cell_block不是ZooAnimal的一个member,
- //虽然我们知道pz目前指向一个Bear object
- pz->cell_block;
- //ok,经过一个显示的downcast操作就没有问题
- (static_cast<Bear *>(pz))->cell_block;
- //下面这样更好,但它是一个run-time operation(成本高)
- if(Bear *pb2 = dynamic_cast<Bear *>(pz))
- pb2->cell_block;
- //ok,因为cell_block是Bear的一个member
- pb->cell_block;
- //将调用Bear的rotate方法
- pz->rotate();
复制代码 2.结论
C++指针的作用紧张有两点:
1)“指针范例”会辅导编译器怎样表明某个特定地点中的内存巨细和内容(包罗member data),天生固定的内存结构。
2)“指针范例”会辅导编译器怎样访问member function。
|