c++深入思考
文章平均质量分 75
书虫
地理信息系统专业研究生
展开
-
printf带来的思考
最近闲来没事,在论坛逛游了几圈,发现很对人对printf按浮点格式输出产生了迷惑,比如: void main ( ){ int d = 100; printf("%f/n", d); printf("%d/n", d);}这段代码为啥第一个输出是0.000000,而另一个输出是正确的100。其实这个问题涉及到了c语言标准库里的变长参数的技术。肯定有人会问啥是变长参数?好,我们慢慢来,馒头要一口一口吃的!1. 什么是变参数?大家可以先看看printf的定义:int __cdecl原创 2011-04-16 15:27:00 · 1338 阅读 · 2 评论 -
MoveWindow和setwindowpos的区别
要区分MoveWindow和setwindowpos的区别,我们先从msdn上入手:1、MoveWindowThis function changes the position and dimensions of the specified window. For a原创 2011-09-07 19:46:55 · 24272 阅读 · 0 评论 -
模板-继承-具现化
<br />今天在学习effective c++中的第49个条款时,遇到一个模板继承的方法,让我打开眼界,感慨万千啊!<br />具体的代码如下:<br />class NewHandlerHolder{public: explicit NewHandlerHolder(new_handler nh) : handler(nh) {} ~NewHandlerHolder() { set_new_handler(handler); }private: new_han原创 2011-05-07 17:35:00 · 2988 阅读 · 3 评论 -
cout的二进制输出
今天,看到一个帖子,是用cout进行二进制输出的问题,示例代码如下: class A{public: A(int v): x(v) {} void outbin() { cout大家可以看出什么问题吗?cout并么有bin成员,所以以上代码是编译不过的!如果要输出二进制应该怎么办呢?其实,cout并不支持输出二进制,只支持八、十、十六进制三种方式,那该怎么办呢?大家是否会想起stl中扩展的容器bitset!对了,就是用bits原创 2011-04-30 10:58:00 · 32648 阅读 · 3 评论 -
纯虚函数也可定义!
<br />今天,我读到《effective c++》的第34条款,里面竟然提到纯虚函数也是可以定义的,大吃一惊,赶快打开vs2005,自己编写了一段代码,编译运行,发现竟然真的可以!<br />俺的代码:<br />class A{public: virtual void pureVirtualFunc() = 0;};void A::pureVirtualFunc(){ cout<<"I'am pureVirtualFunc"<<endl;}class B :原创 2011-04-28 14:45:00 · 8330 阅读 · 3 评论 -
指针类型的幻觉
<br />关于指针,我最初的想法就是,所有类型的指针都是一样的,都是4个字节长度。这句话是对的,但是往往会给我们带来“幻觉”,从而误导我们的判断!就像“幻城”中的幻术师所施展的幻术,真假难辨!<br /> <br />首先,先让我们看看以下情况:<br />问题:<br /><br />C/C++ code<br />int a[]={1,2,3,4,5,6,7,8,9};<br /><br />short *p=(short*)(a+2);<br />short *q=(short*)a;<br /><原创 2011-04-28 10:25:00 · 934 阅读 · 2 评论 -
模板友元函数的声明
刚才在论坛上看到一篇帖子,很有意思,是关于模板友元函数的声明的,在vs2005上可以运行的代码,在vs2008中就会编译错误,同样vc6的也不相同。首先,让我们看看vc6上的代码:#includeusing namespace std;template class AA;template class BB;template int park(const AA & , const BB & );template class AA{public:原创 2011-04-23 13:10:00 · 1269 阅读 · 5 评论 -
探讨struct对齐
<br />毕业前找工作的经历让我发现,很多公司的笔试、面试题中都涉及到了struct的对齐的问题!今天我们就深入探索其中的奥秘!<br />首先,让我们分析下面的代码:<br />struct AT<br />{<br /> char a;<br /> char b;<br /> int c;<br /> char d;<br />};<br />int main(void)<br />{<br /> AT at;<br /> cout<<sizeof(at)<<en原创 2011-04-23 11:21:00 · 3405 阅读 · 2 评论 -
malloc-free和new-delete的思考
<br /> 今天我想讨论下malloc-free和new-delete之间的区别与不同,深入探讨其内部实现的机制。如果你对此不屑一顾,请先不要那么自信,先来回答下面几个问题:<br />1、malloc和new、free和delete之间有什么区别?<br />2、为什么malloc时输入了所申请内存的大小size,但是free时怎么不用输入要释放内存的大小,而只要输入指向该内存的指针就可以了?其内部隐藏了什么处理机制?<br />3、同样new时需要输入要创建对象的个数,为什么delete释放时不原创 2011-04-19 11:42:00 · 2192 阅读 · 1 评论 -
虚函数表获取的函数地址和函数实际地址一样吗?
最近,看帖发现不少人对虚函数表很迷惑,说虚函数表中函数的地址怎么和用函数指针获取的地址不一致?示例代码如下:#include#includeusing namespace std;class Base { public: virtual void f() { cout原创 2011-04-17 23:27:00 · 6063 阅读 · 2 评论 -
无符号整型赋值陷阱
有没有人尝试过将负数赋给一个无符号整型变量?知不知道这样做会发生什么?还没有尝试的就让我们来探索下无符号整型隐藏的秘密。先来看看下面代码:int main(){ unsigned int val = -1; cout retu原创 2011-04-22 23:49:00 · 18812 阅读 · 4 评论