
C++愤恨者札记
键盘上的疯兔
乐于钻研问题背后的规律,并乐于编程证实。
展开
-
C++愤恨者札记1——类对象作为函数参数的数据传递过程
C++愤恨者札记1——类对象作为函数参数的数据传递过程 C++繁杂的机制,加上枯燥的教科书,再加上无法回避地要使用它,注定要造就一批C++愤恨者。本文作为C++愤恨者札记系列第一篇,从汇编角度,观察类对象作为函数参数时的数据传递过程。 若没有特殊说明,编译器使用的是VC++,反汇编使用的是Windbg.下面是它们的版本号: Microsoft (R) 32-bit原创 2012-07-20 08:07:56 · 11295 阅读 · 5 评论 -
C++愤恨者札记9——vector.erase与set.erase
//使用erase分别清理vector与set中的内容#include #include #include using namespace std;void FnVec(){ vector vec; vec.push_back( L"AAA" ); vec.push_back( L"BBB" ); vec.push_back( L"CCC" ); vec.push_bac原创 2013-02-20 11:20:40 · 4143 阅读 · 0 评论 -
C++愤恨者札记8—— 常引用参数也不可靠的情况
#include #include using namespace std;//parameter 's' can only make sure reference value can't be modify according it, //but can't make sure other parameter, here is 'vec', change its reference v原创 2013-01-15 08:31:22 · 1293 阅读 · 0 评论 -
C++愤恨者札记7——函数适配器
C++愤恨者札记7——函数适配器考虑编写一个通用的计数函数TestCount,再用它来统计字符串空格的个数:#include #include using namespace std;bool TestIsspace( wchar_t ch ){ if ( ch == ' ' ) return true; else retu原创 2012-11-03 20:55:48 · 1302 阅读 · 0 评论 -
C++愤恨者札记6——函数指针与函数对象
class ClxInc{public: int operator () ( int a) { return ++a; }};template int TempFn( int a, T Fn ){ return Fn( a );}int FnInc( int a ){ a++; return a;}void main(){ int (*p)(int);原创 2012-11-01 23:55:51 · 1017 阅读 · 0 评论 -
C++愤恨者札记5——临时变量的内存分配
临时变量的内存分配这里考虑对象做为函数参数与返回值时,使用无名临时变量的情况。临时变量内存分配class Node{ public: int data1; int data2; int data3; Node() {__asm nop}};void Fn1( Node n ){ n.data1++;}Node Fn2原创 2012-10-14 18:15:07 · 2798 阅读 · 0 评论 -
C++愤恨者札记3——函数调用约定
C++愤恨者札记3——函数调用约定 函数调用约定指的是,参数压栈顺序及弹栈位置的约定。这个约定在函数声明时指定,如: void __stdcall Fn(int arg1, int arg2); 其中__stdcall就是调用约定,表示参数从右至左入栈,而函数自己负责参数弹栈工作。 还有一种常用约定为__cdecl,表示参数从右至左入栈,而函数调用者负责参数原创 2012-07-22 00:20:07 · 1559 阅读 · 1 评论 -
C++愤恨者札记4——拷贝构造函数被调用的四种情形
class A{public: A(){} A( A& n){}};void Fn1(A a){}A Fn2(){ A a; return a;}void main(){ A a; A b(a); //情形1: 用对象初始化另一个对象时 A c = a; //情形2: 通过赋值运算,用对象初始化另一个对象,此时触发的是拷贝构造函数,而不是opera原创 2012-07-23 11:10:09 · 865 阅读 · 0 评论 -
C++愤恨者札记2——函数返回值为类对象
C++愤恨者札记2——函数返回值为类对象 为避免冗余代码,程序使用Release配置编译,但要把/Od选项打上,否则编译器优化,会使用代码很难懂。 当函数返回值是基本的数据类型(如,int,char)时,会把返回结果放在eax上,这样函数调用者就可以通过eax获得函数返回结果了。但如果返回值是一个类对象呢?eax根本不够用了。实验源码:class Node{原创 2012-07-20 23:56:45 · 2917 阅读 · 0 评论 -
C++愤恨者札记10——bind2nd示例
#include #include #include using namespace std;//can't use reference arg //bool Filter( const wstring& s, const wstring& pattern )bool Filter( const wstring s, const wstring pattern ){ return原创 2013-02-20 11:32:55 · 1962 阅读 · 0 评论