2012年9月7日

Effective C++条款37:绝不重新定义继承而来的缺省参数值

摘要: 要点:绝对不要重新定义一个继承而来的缺省参数,因为缺省参数都是静态绑定,而virtual函数――你唯一应该覆写的东西――却是动态绑定。virtual函数是动态绑定的,而缺省参数却是静态绑定,对象的所谓静态类型,是它在程序中被声明时所采用的类型。class Shape { public: enum ShapeColor {Red, Green, Blue}; virtual void draw(ShapeColor color = Red) const = 0; }; class Rectangle : public Shape { public: //赋予不同的缺省参数... 阅读全文

posted @ 2012-09-07 15:26 as_ 阅读(829) 评论(0) 推荐(0)

C/C++ struct/class/union内存对齐

摘要: struct/class/union内存对齐原则有四个:1).数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节, 则要从4的整数倍地址开始存储),基本类型不包括struct/class/uinon。2).结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部"最宽基本类型成员"的整数倍地址开始存储.(struct a里存有struct b,b 阅读全文

posted @ 2012-09-07 14:15 as_ 阅读(3477) 评论(0) 推荐(1)

C++之对象切割

摘要: 问题描述程序如下:#include <iostream>#include <cstdlib>using namespace std;class Base{ public: virtual void fun() { cout << "Base fun() is Called" << endl; }};class Derived:public Base{ public: void fun() { ... 阅读全文

posted @ 2012-09-07 13:07 as_ 阅读(2431) 评论(0) 推荐(0)

C语言的数组的地址

摘要: 问题描述:有如下程序:#include<stdio.h>int main(void){ int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a + 1); printf("%d %d\n", *(a + 1), *(ptr-1)); return 0;}输出结果:2 5原因解释:*(a+1) 因为a的地址为数组a第一个元素的地址,所以a+1就是a的第二个元素的地址 输出为2&a的类型是int[5],则&a+1的偏移量为整个数组a的大小 换句话说它也表示了该数组最后一个元素的下一个地址,上面的ptr则是一 阅读全文

posted @ 2012-09-07 12:19 as_ 阅读(599) 评论(0) 推荐(1)

导航