??xml version="1.0" encoding="utf-8" standalone="yes"?>久久99九九国产免费看小说,久久综合给久久狠狠97色,久久无码AV一区二区三区http://www.shnenglu.com/mumutou/archive/2007/01/16/17682.html木木?/dc:creator>木木?/author>Tue, 16 Jan 2007 05:24:00 GMThttp://www.shnenglu.com/mumutou/archive/2007/01/16/17682.htmlhttp://www.shnenglu.com/mumutou/comments/17682.htmlhttp://www.shnenglu.com/mumutou/archive/2007/01/16/17682.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/17682.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/17682.html C++风格的类型{换的用法

q是More Effecitve C++里的W二条对cd转换讲的很好Q也很基好懂?br />Item M2Q尽量用C++风格的类型{?br />仔细xC卑贱的类型{换功能(castQ,其在E序设计中的Cpgoto语句一样o(h)人鄙视。但是它q不是无法o(h)人忍受,因ؓ(f)当在某些紧要的关_(d)cd转换q是必需的,q时它是一个必需品?br />不过C风格的类型{换ƈ不代表所有的cd转换功能?br />一来它们过于粗鲁,能允怽在Q何类型之间进行{换。不q如果要q行更精的cd转换Q这?x)是一个优炏V在q些cd转换中存在着巨大的不同,例如把一个指?const对象的指针(pointer-to-const-objectQ{换成指向非const对象的指针(pointer-to-non-const -objectQ?即一个仅仅去除const的类型{?Q把一个指向基cȝ指针转换成指向子cȝ指针Q即完全改变对象cdQ。传l的C风格的类型{换不对上qCU{换进行区分。(q一点也不o(h)人惊Ӟ因ؓ(f)C风格的类型{换是为C语言设计的,而不是ؓ(f)C++语言设计的)(j)?br />二来C风格的类型{换在E序语句中难以识别。在语法上,cd转换由圆括号和标识符l成Q而这些可以用在CQ+中的M地方。这使得回答象这样一个最基本的有关类型{换的问题变得很困难:(x)“在q个E序中是否用了(jin)cd转换Q”。这是因Zh工阅d可能忽略?jin)类型{换的语句Q而利用象grep的工L(fng)序也不能从语句构成上区分出它们来?br />C++通过引进四个新的cd转换操作W克服了(jin)C风格cd转换的缺点,q四个操作符? static_cast, const_cast, dynamic_cast, 和reinterpret_cast。在大多数情况下Q对于这些操作符你只需要知道原来你?fn)惯于这样写Q?br />(type) expression
而现在你d该这样写Q?br />static_cast<type>(expression)
例如Q假设你x一个int转换成doubleQ以便让包含intcd变量的表辑ּ产生出QҎ(gu)值的l果。如果用C风格的类型{换,你能q样写:(x)
int firstNumber, secondNumber;
...
double result = ((double)firstNumber)/secondNumberQ?br />如果用上q新的类型{换方法,你应该这样写Q?br />double result = static_cast<double>(firstNumber)/secondNumber;
q样的类型{换不论是对h工还是对E序都很Ҏ(gu)识别?br />static_cast 在功能上基本上与C风格的类型{换一样强大,含义也一栗它也有功能上限制。例如,你不能用static_cast象用C风格的类型{换一h struct转换成intcd或者把doublecd转换成指针类型,另外Qstatic_cast不能从表辑ּ中去除const属性,因ؓ(f)另一个新的类型{换操作符const_cast有这L(fng)功能?br />其它新的C++cd转换操作W被用在需要更多限制的地方。const_cast用于cd转换掉表辑ּ的const或volatileness属性。通过使用const_castQ你向h们和~译器强调你通过cd转换惛_的只是改变一些东西的 constness或者volatileness属性。这个含义被~译器所U束。如果你试图使用const_cast来完成修改constness 或者volatileness属性之外的事情Q你的类型{换将被拒l。下面是一些例子:(x)
class Widget { ... };
class SpecialWidget: public Widget { ... };
void update(SpecialWidget *psw);
SpecialWidget sw; // sw 是一个非const 对象?br />const SpecialWidget& csw = sw; // csw 是sw的一个引?br />// 它是一个const 对象
update(&csw); // 错误!不能传递一个const SpecialWidget* 变量
// l一个处理SpecialWidget*cd变量的函?br />update(const_cast<SpecialWidget*>(&csw));
// 正确Qcsw的const被显C地转换掉(
// csw和sw两个变量值在update
//函数中能被更斎ͼ(j)
update((SpecialWidget*)&csw);
// 同上Q但用了(jin)一个更难识?br />//的C风格的类型{?br />Widget *pw = new SpecialWidget;
update(pw); // 错误Qpw的类型是Widget*Q但?br />// update函数处理的是SpecialWidget*cd
update(const_cast<SpecialWidget*>(pw));
// 错误Qconst_cast仅能被用在媄(jing)?br />// constness or volatileness的地方上?
// 不能用在向承子c进行类型{换?br />到目前ؓ(f)止,const_cast最普通的用途就是{换掉对象的const属性?br />W二U特D的cd转换W是dynamic_castQ它被用于安全地沿着cȝl承关系向下q行cd转换。这是_(d)你能用dynamic_cast把指向基cȝ指针或引用{换成指向其派生类或其兄弟cȝ指针或引用,而且你能知道转换是否成功。失败的转换返回空指针Q当Ҏ(gu)针进行类型{换时Q或者抛出异常(当对引用q行cd转换Ӟ(j)Q?br />Widget *pw;
...
update(dynamic_cast<SpecialWidget*>(pw));
// 正确Q传递给update函数一个指?br />// 是指向变量类型ؓ(f)SpecialWidget的pw的指?br />// 如果pw实指向一个对?
// 否则传递过ȝɽI指针?br />void updateViaRef(SpecialWidget& rsw);
updateViaRef(dynamic_cast<SpecialWidget&>(*pw));
//正确。传递给updateViaRef函数
// SpecialWidget pw 指针Q如果pw
// 实指向?jin)某个对?br />// 否则抛出异?br />dynamic_casts在帮助你览l承层次上是有限制的。它不能被用于缺乏虚函数的类型上Q参见条ƾM24Q,也不能用它来转换掉constnessQ?br />int firstNumber, secondNumber;
...
double result = dynamic_cast<double>(firstNumber)/secondNumber;
// 错误Q没有承关p?br />const SpecialWidget sw;
...
update(dynamic_cast<SpecialWidget*>(&sw));
// 错误! dynamic_cast不能转换
// 掉const?br />如你惛_没有l承关系的类型中q行转换Q你可能惛_static_cast。如果是Z(jin)去除constQ你d用const_cast?br />q四个类型{换符中的最后一个是reinterpret_cast。用这个操作符的类型{换,其的转换l果几乎都是执行期定义(implementation-definedQ。因此,使用reinterpret_casts的代码很隄植?br />reinterpret_casts的最普通的用途就是在函数指针cd之间q行转换。例如,假设你有一个函数指针数l:(x)
typedef void (*FuncPtr)(); // FuncPtr is 一个指向函?br />// 的指针,该函数没有参?br />// q回值类型ؓ(f)void
FuncPtr funcPtrArray[10]; // funcPtrArray 是一个能容纳
// 10个FuncPtrs指针的数l?br />让我们假设你希望Q因为某些莫名其妙的原因Q把一个指向下面函数的指针存入funcPtrArray数组Q?br />int doSomething();
你不能不l过cd转换而直接去做,因ؓ(f)doSomething函数对于funcPtrArray数组来说有一个错误的cd。在FuncPtrArray数组里的函数q回值是voidcdQ而doSomething函数q回值是intcd?br />funcPtrArray[0] = &doSomething; // 错误Q类型不匚w
reinterpret_cast可以让你qɾ~译器以你的Ҏ(gu)ȝ待它们:(x)
funcPtrArray[0] = // this compiles
reinterpret_cast<FuncPtr>(&doSomething);
转换函数指针的代码是不可UL的(C++不保证所有的函数指针都被用一L(fng)Ҏ(gu)表示Q,在一些情况下q样的{换会(x)产生不正的l果Q参见条ƾM31Q,所以你应该避免转换函数指针cdQ除非你处于着背水一战和刀架喉的危急时刅R一把锋利的刀。一把非帔R利的刀?br />如果你用的~译器缺乏对新的cd转换方式的支持,你可以用传统的类型{换方法代替static_cast, const_cast, 以及(qing)reinterpret_cast。也可以用下面的宏替换来模拟新的cd转换语法Q?br />#define static_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define const_cast(TYPE,EXPR) ((TYPE)(EXPR))
#define reinterpret_cast(TYPE,EXPR) ((TYPE)(EXPR))
你可以象q样使用使用Q?br />double result = static_cast(double, firstNumber)/secondNumber;
update(const_cast(SpecialWidget*, &sw));
funcPtrArray[0] = reinterpret_cast(FuncPtr, &doSomething);
q些模拟不会(x)象真实的操作W一样安全,但是当你的编译器可以支持新的的类型{换时Q它们可以简化你把代码升U的q程?br />没有一个容易的Ҏ(gu)来模拟dynamic_cast的操作,但是很多函数库提供了(jin)函数Q安全地在派生类与基cM间进行类型{换。如果你没有q些函数而你有必进行这L(fng)cd转换Q你也可以回到C风格的类型{换方法上Q但是这L(fng)话你不能获知类型{换是否失败。当?dng)你也可以定义一个宏来模?dynamic_cast的功能,p模拟其它的类型{换一P(x)
#define dynamic_cast(TYPE,EXPR) (TYPE)(EXPR)
误住,q个模拟q不能完全实现dynamic_cast的功能,它没有办法知道{换是否失败?br />我知道,是的Q我知道Q新的类型{换操作符不是很美观而且用键盘键入也很麻?ch)。如果你发现它们看上d在o(h)厌,C风格的类型{换还可以l箋使用q且合法。然而,正是因ؓ(f)新的cd转换W缺乏美感才能它I补了(jin)在含义精性和可L认性上的缺炏Vƈ且,使用新类型{换符的程序更Ҏ(gu)被解析(不论是对人工q是对于工具E序Q,它们允许~译器检出原来不能发现的错误。这些都是放弃C风格cd转换Ҏ(gu)的强有力的理由。还有第三个理由Q也许让cd转换W不观和键入麻?ch)是一件好事?



]]>
C++随笔 ?explicit 关键?转蝲)http://www.shnenglu.com/mumutou/archive/2007/01/16/17681.html木木?/dc:creator>木木?/author>Tue, 16 Jan 2007 05:21:00 GMThttp://www.shnenglu.com/mumutou/archive/2007/01/16/17681.htmlhttp://www.shnenglu.com/mumutou/comments/17681.htmlhttp://www.shnenglu.com/mumutou/archive/2007/01/16/17681.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/17681.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/17681.htmlexplicit关键字用于取消构造函数的隐式转换Q对有多个参数的构造函C用explicit是个语法错误?br />


In C++ it is possible to declare constructors for a class, taking a single parameter, and use those constructors for doing type conversion. For example:

				
class  A {
public
:
        A(
int
);
};

void
 f(A) {}
void
 g()
{
         A a1 
=   37
;
         A a2 
=  A( 47
);
         A a3(
57
);
         a1 
=   67
;
         f(
77
);
}

A declaration like:
 A a1 = 37;
says to call the A(int) constructor to create an A object from the integer value. Such a constructor is called a "converting constructor".

However, this type of implicit conversion can be confusing, and there is a way of disabling it, using a new keyword "explicit" in the constructor declaration:

				
class  A {
public
:
       
explicit  A( int
);
};

void
 f(A) {}
void
 g()
{
          A a1 
=   37 ;       //  illegal

          A a2  =  A( 47 );    //  OK
          A a3( 57 );        //  OK
          a1  =   67 ;         //  illegal
          f( 77 );           //  illegal
}


Using the explicit keyword, a constructor is declared to be
"nonconverting", and explicit constructor syntax is required:

				
class  A {
public
:
        
explicit  A( int
);
        };

void
 f(A) {}

void
 g()
{
        A a1 
=  A( 37
);
        A a2 
=  A( 47
);
        A a3(
57
);
        a1 
=  A( 67
);
        f(A(
77
));
}


Note that an expression such as:

				        A(47)

is closely related to function-style casts supported by C++. For example:

				        double d = 12.34;

int i = int(d);


]]>
C++随笔 ?文g操作(转蝲)http://www.shnenglu.com/mumutou/archive/2007/01/16/17680.html木木?/dc:creator>木木?/author>Tue, 16 Jan 2007 05:18:00 GMThttp://www.shnenglu.com/mumutou/archive/2007/01/16/17680.htmlhttp://www.shnenglu.com/mumutou/comments/17680.htmlhttp://www.shnenglu.com/mumutou/archive/2007/01/16/17680.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/17680.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/17680.html C++文g操作  原文地址Qhttp://www.layz.net/blog/user1/xuanxuan/archives/2006/67.html
 在C++中,有一个streamq个c,所有的I/O都以q个“流”类为基的,包括我们要认识的文gI/OQstreamq个cL两个重要的运符Q?

1、插入器(<<)
  向流输出数据。比如说pȝ有一个默认的标准输出?cout)Q一般情况下是指的昄器,所以,cout<<"Write Stdout"<<'\n';pC把字符?Write Stdout"和换行字W?'\n')输出到标准输出流?

2、析取器(>>)
  从流中输入数据。比如说pȝ有一个默认的标准输入?cin)Q一般情况下是指的键盘Q所以,cin>>x;pCZ标准输入中d一个指定类?卛_量x的类?的数据?

  在C++中,Ҏ(gu)件的操作是通过stream的子cfstream(file stream)来实现的Q所以,要用q种方式操作文gQ就必须加入头文件fstream.h。下面就把此cȝ文g操作q程一一道来?

一、打开文g
  在fstreamcMQ有一个成员函数open()Q就是用来打开文g的,其原型是Q?

void open(const char* filename,int mode,int access);

参数Q?

filenameQ  要打开的文件名
modeQ    要打开文g的方?
accessQ   打开文g的属?
打开文g的方式在cios(是所有流式I/Ocȝ基类)中定义,常用的值如下:(x)

ios::appQ   以追加的方式打开文g
ios::ateQ   文g打开后定位到文g,ios:app包含有此属?
ios::binaryQ? 以二q制方式打开文gQ缺省的方式是文本方式。两U方式的区别见前?
ios::inQ    文g以输入方式打开
ios::outQ   文g以输出方式打开
ios::nocreateQ?不徏立文Ӟ所以文件不存在时打开p| 
ios::noreplaceQ不覆盖文gQ所以打开文g时如果文件存在失?
ios::truncQ  如果文g存在Q把文g长度设ؓ(f)0
  可以用“或”把以上属性连接v来,如ios::out|ios::binary

  打开文g的属性取值是Q?

0Q普通文Ӟ打开讉K
1Q只L?
2Q隐含文?
4Q系l文?
  可以用“或”或者?”把以上属性连接v?Q如3?|2是以只d隐含属性打开文g?

  例如Q以二进制输入方式打开文gc:\config.sys

  fstream file1;
  file1.open("c:\\config.sys",ios::binary|ios::in,0);

  如果open函数只有文g名一个参敎ͼ则是以读/写普通文件打开Q即Q?

  file1.open("c:\\config.sys");<=>file1.open("c:\\config.sys",ios::in|ios::out,0);

  另外Qfstreamq有和open()一L(fng)构造函敎ͼ对于上例Q在定义的时侯就可以打开文g?jin)?x)

  fstream file1("c:\\config.sys");

  特别提出的是Qfstream有两个子c:(x)ifstream(input file stream)和ofstream(outpu file stream)Qifstream默认以输入方式打开文gQ而ofstream默认以输出方式打开文g?

  ifstream file2("c:\\pdos.def");//以输入方式打开文g
  ofstream file3("c:\\x.123");//以输出方式打开文g

  所以,在实际应用中Q根据需要的不同Q选择不同的类来定义:(x)如果想以输入方式打开Q就用ifstream来定义;如果想以输出方式打开Q就用ofstream来定义;如果想以输入/输出方式来打开Q就用fstream来定义?

二、关闭文?
  打开的文件用完成后一定要关闭Qfstream提供?jin)成员函数close()来完成此操作Q如Qfile1.close();把file1相连的文件关闭?

三、读写文?
  d文g分ؓ(f)文本文g和二q制文g的读取,对于文本文g的读取比较简单,用插入器和析取器可以了(jin)Q而对于二q制的读取就要复杂些Q下要就详细的介l这两种方式

  1、文本文件的d
  文本文g的读写很单:(x)用插入器(<<)向文件输出;用析取器(>>)从文件输入。假设file1是以输入方式打开Qfile2以输出打开。示例如下:(x)

  file2<<"I Love You";//向文件写入字W串"I Love You"
  int i;
  file1>>i;//从文件输入一个整数倹{?

  q种方式q有一U简单的格式化能力,比如可以指定输出?6q制{等Q具体的格式有以下一?

操纵W?功能 输入/输出
dec 格式化ؓ(f)十进制数值数?输入和输?
endl 输出一个换行符q刷新此?输出
ends 输出一个空字符 输出
hex 格式化ؓ(f)十六q制数值数?输入和输?
oct 格式化ؓ(f)八进制数值数?输入和输?
setpxecision(int p) 讄点数的_ֺ位数 输出

  比如要把123当作十六q制输出Qfile1<<<123;要把3.1415926?位精度输出:(x)FILE1<<<3.1415926?

  2、二q制文g的读?
①put()
  put()函数向流写入一个字W,其原型是ofstream &put(char ch)Q用也比较单,如file1.put('c');是向流写一个字W?c'?

②get()
  get()函数比较灉|Q有3U常用的重蝲形式Q?

  一U就是和put()对应的Ş式:(x)ifstream &get(char &ch);功能是从中d一个字W,l果保存在引用ch中,如果到文件尾Q返回空字符。如file2.get(x);表示从文件中d一个字W,q把d的字W保存在x中?

  另一U重载Ş式的原型是:(x) int get();q种形式是从中q回一个字W,如果到达文g,q回EOFQ如x=file2.get();和上例功能是一L(fng)?

  q有一UŞ式的原型是:(x)ifstream &get(char *buf,int num,char delim='\n')Q这UŞ式把字符d?buf 指向的数l,直到d?num 个字W或遇到?jin)?delim 指定的字W,如果没?delim q个参数Q将使用~省值换行符'\n'。例如:(x)

  file2.get(str1,127,'A');//从文件中d字符到字W串str1Q当遇到字符'A'或读取了(jin)127个字W时l止?

③读写数据块
  要读写二q制数据块,使用成员函数read()和write()成员函数Q它们原型如下:(x)

    read(unsigned char *buf,int num);
    write(const unsigned char *buf,int num);

  read()从文件中d num 个字W到 buf 指向的缓存中Q如果在q未d num 个字W时到?jin)文件尾Q可以用成员函数 int gcount();来取得实际读取的字符敎ͼ?write() 从buf 指向的缓存写 num 个字W到文g中,值得注意的是~存的类型是 unsigned char *Q有时可能需要类型{换?

例:(x)

    unsigned char str1[]="I Love You";
    int n[5];
    ifstream in("xxx.xxx");
    ofstream out("yyy.yyy");
    out.write(str1,strlen(str1));//把字W串str1全部写到yyy.yyy?
    in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数Q注意类型{?
    in.close();out.close();

四、检EOF
  成员函数eof()用来(g)是否到达文件尾Q如果到达文件尾q回?|否则q回0。原型是int eof();

例:(x)  if(in.eof())ShowMessage("已经到达文g!");

五、文件定?
  和C的文件操作方式不同的是,C++ I/Opȝ理两个与一个文件相联系的指针。一个是L针,它说明输入操作在文g中的位置Q另一个是写指针,它下ơ写操作的位|。每ơ执行输入或输出Ӟ相应的指针自动变化。所以,C++的文件定位分位置和写位置的定位,对应的成员函数是 seekg()?seekp()Qseekg()是设|读位置Qseekp是设|写位置。它们最通用的Ş式如下:(x)

    istream &seekg(streamoff offset,seek_dir origin);
    ostream &seekp(streamoff offset,seek_dir origin);

  streamoff定义?iostream.h 中,定义有偏U量 offset 所能取得的最大|seek_dir 表示Ud的基准位|,是一个有以下值的枚DQ?

ios::begQ  文g开?
ios::curQ  文g当前位置
ios::endQ  文gl尾
  q两个函C般用于二q制文gQ因为文本文件会(x)因ؓ(f)pȝ对字W的解释而可能与预想的g同?

例:(x)

     file1.seekg(1234,ios::cur);//把文件的L针从当前位置向后U?234个字?
     file2.seekp(1234,ios::beg);//把文件的写指针从文g开头向后移1234个字?/setpxecision(5)>


]]>
C++随笔 ?函数模板(Function Template)1 (原创)http://www.shnenglu.com/mumutou/archive/2007/01/10/17497.html木木?/dc:creator>木木?/author>Wed, 10 Jan 2007 06:36:00 GMThttp://www.shnenglu.com/mumutou/archive/2007/01/10/17497.htmlhttp://www.shnenglu.com/mumutou/comments/17497.htmlhttp://www.shnenglu.com/mumutou/archive/2007/01/10/17497.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/17497.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/17497.html1.Function Template可以针对不同的Template arguments完成一个系列的函数
例如
template<typename T>
inline T const & max(T const &a,T const &b)
{
   return   a>b?a:b;
}
2.Function template可以从传递过来的arguments的类型来具体?br />int a = ::max(10,20);
那么F(tun)unction template 具体化?br />inline int const& max(int const &a,int const & b)
3.你可以具体指出它的参数类?br />int a = ::max<int>(10,20);
4.Function template可以被重载overloaded
inline T const& max(T const &a,T const &b,T const &c)
{
   return ::max(::max(a,b),c);
}
当然C一点,重蝲的相似点小好

]]>
C++随笔 ?关于C++中的指针问题 http://www.shnenglu.com/mumutou/archive/2007/01/09/17458.html木木?/dc:creator>木木?/author>Tue, 09 Jan 2007 05:48:00 GMThttp://www.shnenglu.com/mumutou/archive/2007/01/09/17458.htmlhttp://www.shnenglu.com/mumutou/comments/17458.htmlhttp://www.shnenglu.com/mumutou/archive/2007/01/09/17458.html#Feedback1http://www.shnenglu.com/mumutou/comments/commentRss/17458.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/17458.html 原文出处
http://community.csdn.net/Expert/topic/5279/5279199.xml?temp=.2457392
在文章中大家在讨Z个问?
如果没有存储上没有区别的?L(fng)下例Q?br />float a=3.45;
int * p1=&a;
float * p2=&a;
cout<<"p1"<<"=>"<<*p1<<endl;
cout<<"p2"<<"=>"<<*p2<<endl;

l果是:(x)
p1=>1107951616
p2=>3.45

书上的解释是Qp1管与p2的地址相同Q但它是整型指针Q它L讉K该地址中的整型数?br />首先?2位CPU上面,指针都是4位的,例如0xXX XX XX XX
那么既然指针是一L(fng),那么Z么指针类型不同的?d来的数据变?jin)样?
q是~译器的问题,例如我有个例?br />
char *p = 'c';
int *p1 = 10;
?2位机器上?br />q里面p1是指?字节的int变量,而p是指?字节的char 变量
q样~译器在用p1变量的时??x)?x XX XX XX XX后面?个字?br />而p变量,只会(x)?x XX XX XX XX后面?个字?br />
因ؓ(f)本h现在在网吧里面[不知道大家有没有在网吧里面碰到装有c++~译器的计算机]
晚上我给大家一个例?可以从其内存上面看的很清?/font>



]]>
C++随笔 ?泛型~程与设计新思维(转蝲)http://www.shnenglu.com/mumutou/archive/2007/01/04/17238.html木木?/dc:creator>木木?/author>Thu, 04 Jan 2007 07:07:00 GMThttp://www.shnenglu.com/mumutou/archive/2007/01/04/17238.htmlhttp://www.shnenglu.com/mumutou/comments/17238.htmlhttp://www.shnenglu.com/mumutou/archive/2007/01/04/17238.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/17238.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/17238.html  作者:(x)徐景?br />
   永远CQ编写代码的宗旨在于单明?jin),不要使用语言中的冷僻Ҏ(gu),耍小聪明Q重要的是编写你理解的代码,理解你编写的代码Q这样你可能?x)做的更好?
--- Herb Sutter

    1998q_(d)国际C++标准正式通过Q标准化对C++最重要的A(ch)献是Q对"强大的抽象概?l于更有力的支持Q以降低软g的复杂度QC++提供?jin)二U功能强大的抽象Ҏ(gu)Q面向对象编E与泛型~程。面向对象编E大家一定很熟?zhn)了(jin),q里׃再哆嗦了(jin)。提到泛型编E?Generic Programming)Q有的h可能q不太熟(zhn),但是提到STLQ你׃定会(x)有所耳闻?jin)。STL(Standard Template LibraryQ标准模板库) 其实是泛型~程的实现品QSTL是由Alexander Stepanov(STL之父)、David R Musser和Meng Lee三位大师共同发展Q于1994q被U_C++标准E序库。STL虽然加入C++标准库的旉相对较晚Q但它却是C++标准E序库中最具革命性的部分Q同时也是C++标准E序库中最重要的组成部分。由于新的C++标准库中几乎每一样东襉K是由模板(Template)构成的,当然QSTL也不?x)例外。所以,在这里有必要先概要说明一下模板的有关概念?

模板概念
    通过使用模板可以使程序具有更好的代码重用性。记住,模板是对源代码进行重用,而不是通过l承和组合重用对象代码,当用户用模板时Q参数由~译器来替换。模板由cL板和函数模板二部分组成,以所处理的数据类型的说明作ؓ(f)参数的类叫cL板,而以所处理的数据类型的说明作ؓ(f)参数的函数叫做函数模ѝ模板参数可以由cd参数或非cd参数l成Q类型参数可用class和typename关键字来指明Q二者的意义相同Q都表示后面的参数名代表一个潜在的内置或用户定义的cdQ非cd参数׃个普通参数声明构成。下面是cL板和函数模板的简单用法:(x) template<class T1, int Size> class Queue // cL板,其中T1为类型参敎ͼSize为非cd参数 { public: explicit Queue():size_(Size){}; // 昑ּ构造,避免隐式转换 …?template<class T2> void assign(T2 first,T2 last); // 内嵌函数模板 private: T* temp_; int size_; } // cL板中内嵌函数模板Compare的外围实?如在Queuecd实现) template<class T1,int Size> template<class T2> void Queue<T1,Size>::assign (T2 first,T2 last) {}; // 模板的用方?int ia[4] = {0,1,2,3}; Queue<int, sizeof(ia)/sizeof(int)> qi; qi.assign(ai,ai+4); 泛型~程
    泛型~程和面向对象编E不同,它ƈ不要求你通过额外的间接层来调用函敎ͼ它让你编写完全一般化q可重复使用的算法,其效率与针对某特定数据类型而设计的法相同。泛型编E的代表作品STL是一U高效、泛型、可交互操作的Y件组件。所谓泛?Genericity)Q是指具有在多种数据cd上皆可操作的含意Q与模板有些怼。STL巨大Q而且可以扩充Q它包含很多计算机基本算法和数据l构Q而且算法与数据l构完全分离Q其中算法是泛型的,不与M特定数据l构或对象类型系在一赗STL以P代器(Iterators)和容?Containers)为基Q是一U泛型算?Generic Algorithms)库,容器的存在ɘq些法有东西可以操作。STL包含各种泛型法(algorithms)、泛型指?iterators)、泛型容?containers)以及(qing)函数对象(function objects)。STLq只是一些有用组件的集合Q它是描qY件组件抽象需求条件的一个正规而有条理的架构?
    q代?Iterators)是STL的核?j),它们是泛型指针,是一U指向其他对?objects)的对象,q代器能够遍历由对象所形成的区?range)。P代器让我们得以将容器(containers)与作用其上的法(algorithms)分离Q大多数的算法自wƈ不直接操作于容器上,而是操作于P代器所形成的区间中。P代器一般分ZU:(x)Input Iterator、Output Iterator、Forward Iterator、Bidirections Iterator和Random Access Iterator。Input Iteratorp只从输入区间中读取数据一Ph只读性,属于单向UdQ如STL中的istream_iterator。Output Iterator刚好相反Q只写出数据到输出区间中Q具有只写性,属于单向UdQ如STL中的ostream_iterator。Forward Iterator也属于单向移动,但不同之处是它同时具有数据读、写性。Bidirections Iterator如名U暗C,支持双向UdQ不但可以篏?++)取得下一个元素,而且可以递减(--)取前一个元素,支持诅R写性。Random Access Iterator功能最强,除了(jin)以上各P代器的功能外Q还支持随机元素讉K(p+=n)Q下?p[n])、相?p1-p2)?qing)前后次序关p?p1<p2){。Input Iterator和Output Iterator属于同等最q二种q代器,Forward Iterator是前二者功能的强化(refinement)QBidirections Iterator又是Forward Iteratorq代器的强化Q最后Random Access Iterator又是Bidirections Iteratorq代器的强化。如下简单示例展CInput Iterator、Forward Iterator、Bidirections Iterator和Radom Access Iteratorq代器的功能Q其中input_iterator_tag{带tag字符串ؓ(f)各不同P代器的专属标识)(j)Q?
1、InputIterator template<class InputIterator, class Distance> void advance(InputIterator& i, Distance n, input_iterator_tag) { for(; n>0; --n,++i){} // InputIteratorh++?} 2、ForwardIterator template<class ForwardIterator, class Distance> void advance(ForwardIterator& i, Distance n,forward_iterator_tag) { advance(i, n, input_iterator_tag()); } 3、BidirectionalIterator template<class BidirectionalIterator, class Distance> void advance(BidirectionalIterator& i, Distance n, bidirectional_iterator_tag) { if(n>=0) // h++?-?for(; n>0; --n,++i){} else for(; n>0; ++n,--i){} } 4、RandomAccessIterator template<class RandomAccessIterator, class Distance> void advance(RandomAccessIterator& i, Distance n, random_access_iterator_tag) { i += n; // h++?-?={?}     函数对象(Function object)也称仿函?Functor)Q是一U能以一般函数调用语法来调用的对象,函数指针(Function pointer)是一U函数对象,所有具有operator()操作W重载的成员函数也是函数对象。函数对象一般分为无参函?Generator)Q单参函?Unary Function)和双参函?Binary Function)三种形式Q它们分别能以f()、f(x)和f(x,y)的Ş式被调用QSTL定义的其他所有函数对象都是这三种概念的强化。如下简单示例展C几UŞ式的实现Q?br />
1、无?Generator)形式 struct counter { typedef int result_type; counter(result_type init=0):n(init){} result_type operator() { return n++;} result_type n; } 2、单?Unary Function)形式 template<class Number> struct even // 函数对象evenQ找出第一个偶?{ bool operator()(Number x) const {return (x&1) == 0;} } // 使用法find_if在区间A到A+N中找到满_数对象even的元?int A[] = {1,0,3,4}; const int N=sizeof(A)/sizeof(int); find_if(A,A+N, even<int>()); 3、双?Binary Function)形式 struct ltstr { bool operator()(const char* s1, const char* s2) const { return strcmp(s1<s2) < 0;} }; // 使用函数对象ltstrQ输出set容器中A和B的ƈ?const int N=3 const char* a[N] = {"xjz","xzh","gh"}; const char* b[N]= {"jzx","zhx","abc"}; set<const char*,ltstr> A(a,a+N); set<const char*,ltstr> B(b,b+N); set_union(A.begin(),A.end(),B.begin(),B.end(), ostream_iterator<const char*>(cout," "), ltstr());     容器(container)是一U对?object)Q可以包含ƈ理其它的对象,q提供P代器(iterators)用以定址其所包含之元素。根据P代器U类的不同,容器也分为几中,以Input IteratorP代器的一般containerQ以Forward IteratorP代器的Forward ContainerQ以Bidirectional Iterator P代器的Reversible ContainerQ以Random Access IteratorP代器的Random Access Container。STL定义二种大小可变的容器:(x)序列式容?Sequence Container)和关联式容器(Associative Container)序列式容器包括vector、list和dequeQ关联式容器包括set、map、multiset和multimap。以下示例简单说明部分容器的使用Q?1、vector使用 // A中以元素5为分割点Q分别排序,使排序后5后面的元素都大于5之前的元?后区间不排序)Q?// 然后输出 int main() { int A[] = {7,2,6,4,5,8,9,3,1}; const int N=sizeof(A)/sizeof(int); vector<int> V(A,A+N); partial_sort(V,V+5,V+N); copy(V,V+N,ostream_iterator<int>(cout," ")); cout << endl; } 输出可能是:(x)1 2 3 4 5 8 9 7 6 2、list使用 // 产生一IlistQ插入元素后排序Q然后输?int main() { list<int> L1; L1.push_back(0); L1.push_front(1); L1.insert(++L1.begin,3); L1.sort(); copy(L1.begin(),L1.end(),ostream_iterator<int>(cout," ")); } 输出Q? 1 3 3、deque使用 int main() { deque<int> Q; Q.push_back(3); Q.push_front(1); Q.insert(Q.begin()+1,2); Copy(Q.begin(),Q.end(),ostream_iterator<int>(cout," ")); } 输出Q? 2 3 4、map使用 int main() { map<string,int> M; M.insert(make_pair("A",11); pair<map<string,int>::iterator, bool> p = M.insert(make_pair("C",5)); if(p.second) cout << p.first->second<<endl; } 输出Q? 5、multiset使用 int main() { const int N = 5; int a[N] = {4,1,1,3,5}; multiset<int> A(a,a+N); copy(A.begin(),A.end(),ostream_iterator<int>(cout," ")); } 输出Q? 1 3 4 5 设计新思维
    设计模?design patterns)、泛型编E?generic programming)和面向对象编E?object-oriented programming)有机的结合v来,便Ş成了(jin)设计新思维。其中,设计模式是经q提炼的?gu)设计?gu)Q对于很多情况下到的问题,它都是合理而可复用的解x案;泛型~程是一U典?paradigm)Q专注于类型抽象化QŞ成功能需求方面的一个精l集合,q利用这些需求来实现法Q相同的法可以q用于广泛的cd集中Q所谓泛型,是h在多U数据类型上皆可操作的含意;最后同面象对象~程中的多?polymorphism)和模?templates){技术相l合Q便获得极高层次上的h可复用性的泛型lg。泛型组仉先实C(jin)设计模块Q可以让用户指定cd和行为,从而Ş成合理的设计Q主要特Ҏ(gu)灉|、通用和易用?
    policies和policyc,是一U重要的c设计技术,所谓policyQ是用来定义一个类或类模板的接口,该接口由下列之一或全部组成:(x)内部cd定义、成员函数和成员变量。基于policy的类p多小型类(UCؓ(f)policies)l成Q每一个这L(fng)型cd负责单纯如行为或l构的某一斚w。Policies机制由模板和多重l承l成Q它们可以互相؜合搭配,从而Ş成设计戎的多h,通过plicyc,不但可以定制行ؓ(f)Q也可以定制l构?

下面单D例说明泛化思维和面向对象思维在部分设计模式中的运用?

    Singletons设计模式泛化实现 Singleton模式是一U保证一个对?class)只有一个实体,qؓ(f)它提供一个全局讉K炏VSingleton是一U经q改q的全局变量Q既在程序中只能有唯一实体的类型,它的重点主要集中在生和理一个独立对象上Q而且不允生另一个这L(fng)对象?
先让我们看看一般的C++实现的基本手法,下面是实现源码:(x) // Singleton.h文g?class Singleton { public: static Singleton& Instance() { if(!pInstance_){ if(destroyed_){ // 引用是否已经失效 OnDeadReference(); } else { Create(); // W一ơ时创徏实例 } } return *pInstance_; } private: Singleton(); // 止默认构?Singleton(const Singleton&); // 止拯构?Singleton& operator= (const Singleton&);  // 止赋值操?static void Create() // 传加创徏的实例引?{ static Singleton theInstance; pInstance_ = &theInstance; } static void OnDeadReference() { throw std::runtime_error(" 实例被不正当消毁"); } virtual ~Singleton() { pInstance- = 0; destroyed_ = true; } static Singleton *pInstance_; static bool destroyed_; } // Singleton.cpp中静(rn)态成员变量初始化 Singleton* Singleton::pInstance_ = 0; Bool Singleton::destroyed_ = false;     如上所C,Singleton模式实现中只有一个public成员I(y)nstance()用来W一ơ用时创徏单一实例Q当W二ơ用时?rn)态变量将已经被设定好Q不?x)再ơ创建实例。还默认构造函数、拷贝构造函数和赋值操作符攑֜private中,目地是不让用户用它们。另外,为避免实例意外消毁后再实例化情况Q加入静(rn)态布?yu)(dng)变量destroy_来进行判断是否出错,从而达到稳定性?br />    从上面一般实现可以看出Singleton模式实现主要在于创徏(Creation)斚w和生存期(Lifetime)斚wQ既可以通过各种Ҏ(gu)来创建Singleton。Creation必然能创建和摧毁对象Q必然要开放这两个相应函数Q将创徏作ؓ(f)独立{略分离开来是必需的,q样你就可以创徏多态对象了(jin)Q所以泛化Singletonq不拥有Creator对象Q它被放在CreationPolicy<T>cL板之中。生命期是指要遵循C++规则Q后创徏都先摧毁Q负责程序生命期某一时刻摧毁Singleton对象?

下面是一个简单的泛化Singleton模式的实?不考虑U程因素) template < class T, template<class> calss CreationPolicy = CreateUsingNew, template<class> class LifetimePolicy=DefaultLifetime, > classs SingletonHolder { public: static T& Instance() { if(!pInstance_) { if(destroyed_) { LifetimePolicy<T>::OnDeadReference(); destroyed_ = false; } pInstance_ = CreationPolicy<T>::Create(); LifetimePolicy<T>::SchedultCall(&DestorySingleton); } return *pInstance_; } private: static void DestroySinleton() { assert(!destroyed_); CreationPlicy<T>::Destroy(pInstance_); pInstance_ = 0; destroyed_ = true; } SingletonHolder(); SingletonHolder (const SingletonHolder &); SingletonHolder & operator= (const SingletonHolder &);  Static T* pInstance_; Static bool destroyed_; };     Instance()是SingletonHolder开攄唯一一个public函数Q它在CreationPolicy、LifetimePolicy中打造了(jin)一层外壟뀂其中模板参数类型TQ接收类名,既需要进行Singleton的类。模板参数内的类模板~省参数CreateUsingNew是指通过new操作W和默认构造函数来产生对象QDefaultLifetime是通过C++规则来管理生命期。LifetimePolicy<T>中有二个成员函数QScheduleDestrution()函数接受一个函数指针,指向析构操作的实际执行函敎ͼ如上面DestorySingleton析构函数QOnDeadReference()函数同上面一般C++中同名函数相同,是负责发现失效实例来抛出异常的。CreationPlicy<T>中的Create()和Destroy()两函数是用来创徏q摧毁具体对象的?

下面是上q泛化Singleton模式实现的用:(x)

1、应用一 class A{}; typedef SingletonHolder<A, CreateUsingNew> SingleA; 2、应用二 class A{}; class Derived : public A {}; template<class T> struct MyCreator : public CreateUsingNew<T> { static T* Create() { return new Derived; } static void Destroy(T* pInstance) { delete pInstance; } } typedef SingletonHolder<A,MyCreator> SingleA;     通过上面CZ可以看出Q?SingletonHolder采用Zplicy设计实现Q它?yu)Singleton对象分解为数个policiesQ模板参数类中CreationPolicy和LifetimePolicy相当于二个policies装体。利用它们可以协助制作出使用者自定义的Singleton对象Q同时还预留?jin)调整和扩展的空间。由此而得Q泛型组?generic components)Q是一U可复用的设计模板,l合?jin)模板和模式Q是C++中创造可扩充设计的新Ҏ(gu)Q提供了(jin)从设计到代码的简易过渡,帮助我们~写清晰、灵zR高度可复用的代码?

参考文?
  • C++ Primer(W三? --- 潘爱民等?
  • Effective C++(W二? --- 侯捷?
  • More Effective C++ --- 侯捷?
  • Exceptional C++ --- 卓小涛译
  • More Exceptional C++ --- 於春景译
  • 深度探烦(ch)C++对象模型 --- 侯捷?
  • 泛型~程与STL --- 侯捷?
  • C++ STLE序员开发指?--- 彭木根等?
  • 设计模式Q可复用面向对象软g的元?--- 李英军等?
  • C++设计新思维 --- 侯捷{译


木木?/a> 2007-01-04 15:07 发表评论
]]>C++随笔 ?STL[vector]的存储技?原创)http://www.shnenglu.com/mumutou/archive/2007/01/04/17231.html木木?/dc:creator>木木?/author>Thu, 04 Jan 2007 06:26:00 GMThttp://www.shnenglu.com/mumutou/archive/2007/01/04/17231.htmlhttp://www.shnenglu.com/mumutou/comments/17231.htmlhttp://www.shnenglu.com/mumutou/archive/2007/01/04/17231.html#Feedback1http://www.shnenglu.com/mumutou/comments/commentRss/17231.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/17231.html首先我们先来看Example Code:
#include <vector>
#include <iostream>
#include <memory>
using namespace std;
void main()
{
 vector<int> v;
// cout<<v.allocator;
 v.push_back(0);
 v.push_back(1);
 v.push_back(2);
 v.push_back(3);
 v.push_back(4);
 v.push_back(5);
 cout<<v.max_size();
}
利用VC6.0的内存调?br /> v.push_back(0);之后
//_Firstq代?0481B40
//_Lastq代?0481B44
//_Endq代?04B1B44
 v.push_back(1);之后
//_Firstq代?0481B00
//_Lastq代?0481B08
//_Endq代?04B1B08
Z么在执行一ơpush_back之后,q代器全部会(x)变呢?
下面我们看看P.J. Plauger的代?br /> void insert(iterator _P, size_type _M, const _Ty& _X)
  {if (_End - _Last < _M)
   {size_type _N = size() + (_M < size() ? size() : _M);
   iterator _S = allocator.allocate(_N, (void *)0);
   iterator _Q = _Ucopy(_First, _P, _S);
   _Ufill(_Q, _M, _X);
   _Ucopy(_P, _Last, _Q + _M);
   _Destroy(_First, _Last);
   allocator.deallocate(_First, _End - _First);
   _End = _S + _N;
   _Last = _S + size() + _M;
   _First = _S; }
  else if (_Last - _P < _M)
   {_Ucopy(_P, _Last, _P + _M);
   _Ufill(_Last, _M - (_Last - _P), _X);
   fill(_P, _Last, _X);
   _Last += _M; }
  else if (0 < _M)
   {_Ucopy(_Last - _M, _Last, _Last);
   copy_backward(_P, _Last - _M, _Last);
   fill(_P, _P + _M, _X);
   _Last += _M; }}

其中M = 1;
当_End - _Last < _M?p重新分配内存?哦原来时q样?
[个h认ؓ(f),在方便调试的时?可以把C:\MSDEV\VC98\Include\下面的vector文g中的protectedҎ(gu)public:]
下面我给出在5ơ插入之后其内存分配
push_back(2)
//00481AC0
//00481ACC
//00481AD0
push_back(3);
//00481AC0
//00481AD0
//00481AD0
push_back(4);
//00481B20
//00481B34
//00481B40
push_back(5);
//00481B20
//00481B38
//00481B40
注意没有,_Last - _First之后的明显是size() * 4
[?在VC6.0的STL版本是采用的PJSTL版本,是一U公认最垃圾的STL版本
在C++ Builder中的STL版本是采用的RW版本,Rouge Wave公司
在unix下面GCC采用的是SGI Silicon Graphics Computer System Inc公司STL版本,我认为在可读?可移植性方面最好的一个版本]


]]>
C++随笔 ?C++标准?(原创)Q-STLhttp://www.shnenglu.com/mumutou/archive/2007/01/04/17207.html木木?/dc:creator>木木?/author>Thu, 04 Jan 2007 02:48:00 GMThttp://www.shnenglu.com/mumutou/archive/2007/01/04/17207.htmlhttp://www.shnenglu.com/mumutou/comments/17207.htmlhttp://www.shnenglu.com/mumutou/archive/2007/01/04/17207.html#Feedback2http://www.shnenglu.com/mumutou/comments/commentRss/17207.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/17207.html阅读全文

]]>
C++随笔 ?C++标准?(原创)Q-模版Ҏ(gu)http://www.shnenglu.com/mumutou/archive/2006/12/29/16984.html木木?/dc:creator>木木?/author>Fri, 29 Dec 2006 07:12:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/29/16984.htmlhttp://www.shnenglu.com/mumutou/comments/16984.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/29/16984.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/16984.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16984.html 模版Ҏ(gu)
?中我已经说过?jin),C++标准库是Z模版技术构建的Qcomplex是模版,string是模版,vector是模版,pI/O也是模版?br />在C++标准库中模版共分?中,一U是cL板,q有一U是函数模版
模版的一般定义方?br />template <cd型参?gt; q回cd cd <cd名表>::成员函数1(型参?
{
   成员函数1定义?br />}
模版函数的一般定义方?br />template <cd型参?gt;q回cd 函数?型参?
{
   函数定义?br />}
有一句话说的比较好,一个类模版描述的是一个无限的cȝ集合Q而程序员所看到的是q些cM的最普遍的地斏V那么,C++也支持无限集合函数的概念?jin)?br />下面是一个模版函数的定义实例Q?br />Example Code:
template <class T>
T max(T a1,T a2,T a3)
{
   T temp;
   if((a1 > a2) && (a1 >a3)) {temp = a1;}
   else if((a2 > a1) && (a2 > a3)){temp = a2;}
   else   {temp = a3};
   return a3;
}
可以用max(100,200,300);
cL版的一般定义方?br />template <class T>
class A:
{
   T* x;
   int size;
public:
   T& operator[](int);
};
可以用A<int> a;定义?br />

]]>
C++ 随笔 ?C++标准?(原创)Q-C++标准库简?/title><link>http://www.shnenglu.com/mumutou/archive/2006/12/29/16980.html</link><dc:creator>木木?/dc:creator><author>木木?/author><pubDate>Fri, 29 Dec 2006 06:54:00 GMT</pubDate><guid>http://www.shnenglu.com/mumutou/archive/2006/12/29/16980.html</guid><wfw:comment>http://www.shnenglu.com/mumutou/comments/16980.html</wfw:comment><comments>http://www.shnenglu.com/mumutou/archive/2006/12/29/16980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mumutou/comments/commentRss/16980.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mumutou/services/trackbacks/16980.html</trackback:ping><description><![CDATA[ <font size="6"> <strong>C++标准库简?/strong> </font> <br /> <font face="Courier New" size="2">首先Z(jin)考虑通用性,如果用一U新的标准导致原有的代码不能用,那将是一件得不偿q事情?br />所以ؓ(f)?jin)减L们的负担Q是E序员的开发变得简单,标准委员?x)决定?f)包装?jin)std的那部分标准库构建新的文件名Q生成新的头文g名的Ҏ(gu)是<br />对于C++头文件名,L头文件名后的.h<br /><iostream.h>---<iostream><br /><complex.h> ----<complex><br />对于C头文件名Q在每个名字前面加上c<br /><string.h>-----<cstring><br /><stdlib.h> ------<cstdlib><br />原有C++头文件的未来:<br />1.C++头文件名?lt;iostream.h>会(x)l箋被用,管它们不在提倡范围之内,但是q些头文件的内容不命名空间std中?br />2.新的C++头文件如<iostream>所包含的基本功能和对应的就C++头文件相同,但是它们的内容却在命名空间std中?br />3.qC头文件如<string.h>l箋使用Q但是这些头文g的内容不在std中?br />4.hC头文件功能的新C++头文?lt;cstring>实现和原有C头文件相同的功能Q但是内容在std中?br />整个融合后新C++标准库有以下lgQ?br />1.标准C?..<cstring>,<cstdlib>{等<br />2.I/O技术,和传l的I/O技术相比,它已l模版化?br />3.string对象。这里我要着重讲一?br />在原有的C头文?lt;string.h>Q是Zchar*的字W串处理函数Q?br />而在std命名I间中,或者说新的C++标准库中Q或者说<string>中,</font> <font size="2"> <font face="Courier New"> <font color="#ff1493"> <strong>或者说<cstring>[说法错误Qؓ(f)什么错误?呵呵Q想惛_明白?它是C头文件的std] <br /></strong> </font>它是一个类Q一个stringc,一个基于basic_string<char>的类<br />typedef base_string <char> string<br />4.容器Q标准库提供?jin)vector,list,deque,queue,stack,map,set,multimap{等<br />5.法Q算法将容器的内容当作序列?br />6.所有的库中一切几乎都是模版,I/O是模板,string是模版,vector是模板,complex是模版?br /></font> </font> <img src ="http://www.shnenglu.com/mumutou/aggbug/16980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mumutou/" target="_blank">木木?/a> 2006-12-29 14:54 <a href="http://www.shnenglu.com/mumutou/archive/2006/12/29/16980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 ?C++标准?(原创)Q-C++~译器支?/title><link>http://www.shnenglu.com/mumutou/archive/2006/12/29/16977.html</link><dc:creator>木木?/dc:creator><author>木木?/author><pubDate>Fri, 29 Dec 2006 06:24:00 GMT</pubDate><guid>http://www.shnenglu.com/mumutou/archive/2006/12/29/16977.html</guid><wfw:comment>http://www.shnenglu.com/mumutou/comments/16977.html</wfw:comment><comments>http://www.shnenglu.com/mumutou/archive/2006/12/29/16977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mumutou/comments/commentRss/16977.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mumutou/services/trackbacks/16977.html</trackback:ping><description><![CDATA[ <font color="#000000" size="6"> <strong>C++~译器支?/strong> </font> <br /> <font face="Courier New" size="2">以下我所说的C++标准库是指新的C++标准?br />支持C++标准库的~译器:(x)<br />Borland C++,version 5.5(DOS/Windows)?qing)其以上版?br />SGI C++,version 7.3.1m?qing)其以上版?br />GNU C++,version 2.95.2?qing)其以上版?br />Microsoft Visual C++ Compiler,Version6.0?qing)其以上版本?br />׃目前Microsoft Visual C++ Compiler不能完全支持C++标准库,所以本得不提倡采用Visual C++ 6.0 IDEq行C++标准库编E?br /></font> <img src ="http://www.shnenglu.com/mumutou/aggbug/16977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mumutou/" target="_blank">木木?/a> 2006-12-29 14:24 <a href="http://www.shnenglu.com/mumutou/archive/2006/12/29/16977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 ? C++标准?(原创)Q-标准库的历史http://www.shnenglu.com/mumutou/archive/2006/12/29/16976.html木木?/dc:creator>木木?/author>Fri, 29 Dec 2006 06:20:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/29/16976.htmlhttp://www.shnenglu.com/mumutou/comments/16976.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/29/16976.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/16976.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16976.html C++标准库的分类
首先QC++标准库有两种Q一U是老的Q一U是新的
老的C++标准大概?0q代末,90q代初定型的?br />对于我们现在所写的一些程序依旧在使用老的C++ 标准库,
例如
#include <iostream.h>
#include <string.h>q是老的C++标准?br />
#include <cstring>q是新的C++标准?br />大概?998q的时候成立的q个一个标准,后来是大概在2001q加入STL 模版标准Q在C++标准的草案中接纳STL为C++标准的一部分。也是说STL只是C++标准库中的一部分?br />现在我们一般的~译器都支持STL模版标准Q[因ؓ(f)q个本n也是C++标准一部分]
然后VC6.0中的MFC是一个另c,q是microsoft公司Z(jin)打造它的IDEQ不惜用了(jin)一些和C++标准库想q背的东西,但是没有没有办法Q谁让h家是老大那?
Visual C++~译器只是部分支持老的C++标准库和新的 C++标准库?br />



]]>
C/C++ 随笔 ?常用工具(转蝲)http://www.shnenglu.com/mumutou/archive/2006/12/28/16939.html木木?/dc:creator>木木?/author>Thu, 28 Dec 2006 06:02:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/28/16939.htmlhttp://www.shnenglu.com/mumutou/comments/16939.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/28/16939.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/16939.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16939.html
lc++E序员的一份礼物——常用工具集 
原文出处Qhttp://morningspace.51.net/

  所?工欲善其事,必先利其?Q从E序员的角度来讲Q好工具的用M(x)lh带来事半功倍的效果。面对众多工?软gQ我们应该如何取舍呢。前不久Q笔者在csdn的c++论坛发了(jin)一?/font> 贴文 Q以期能征求大家的广泛意见,得到?jin)不错的反响。本文在对该贴进行整理的基础上,又做?jin)一些补充。在q里要特别感谢网友:(x)DanielWYO(׃白)Qredleaves(无心(j)U叶)?


有以下几炚w要声明:(x)

  1. 本文主要是针对c++E序员的Q但一些综合类的通用型工?软gQ作为c++E序员而言也是不可或缺的,因此也被列入其中。同Pq些工具/软gQ对其他语言的程序员Q也是适用的?    
  2. Ҏ(gu)列各cd?软g的评P其依据是多数|友的观Ҏ(gu)总,q结合了(jin)W者自q个h观点Q供参考,如有不实之处Q欢q指正?    
  3. Ҏ(gu)列各cd?软g的排名不分先后,其中既有Open source软gQ也有商业品。对于前者,我将提供下蝲地址Q对于后者,我将量提供相关信息的参考网址?    
  4. q䆾清单qstatic的,所列工?软g也远非保|万象,如果你有好的和想法,也可以提供。如有必要,我会(x)对该清单作定期更新^_^

开发环?/font>

Turbo c DOS时代c语言开发的l典工具Q目前适合两类Z用:(x)c语言beginnerQ尤其是学生一族)(j)Q具有怀旧情节的专业人士Q)(j)
Visual C++ 6.0/7.0 E_而强大的IDE开发环境,h丰富的调试功能,定制宏的功能也是其一大特艌ӀMicrosoft的经怹作,功能强大自不必言说。附带的一些工具也很不错,比如QSpy++。但~译器较之同c,支持c++标准的程度不够好Q尤?.0?qing)以前的版本?/font>
BCB Borland的C++ Builder是可以与VCҎ(gu)的另一个功能强大的IDEQ速度和稳定性稍逊,但对c++标准支持的程度较好?/font>
Cygwin Windowsq_下的C++~译器,ZgccQ又完全兼容WindowҎ(gu)的东西,比如对winsock的支持。从http://www.cygwin.com可以扑ֈ有关Cygwin的详l信息?/font>
Dev-c++ Windowsq_下,一个类似VC、BCB的c++ IDE开发环境,属于׃n软g。界面亲切优雅,size也不大,?.9.x版有中文语言支持Q无需汉化。编译器ZgccQ完全支持STL。但是对于规模较大的软g目Q恐怕难以胜仅R可以从:http://www.bloodshed.net/dev/devcpp.html扑ֈ有关Dev-c++的有关信息?/font>
Source Insight 有着和Dev c++一h亮的界面Q提供代码的~辑和察看功能,h丰富的语法加亮功能,可以像VC一栯动弹出成员函数的提示Qƈh快速方便的函数跌{功能Q但是蟩转速度g有点慢)(j)。只是默认设|不适合Ӟ需要仔l的调整和修攏V无法查扄typedef之后的名字?/font>

辅助

Visual Assist VC IDE环境下的辅助~程工具Q能识别各种关键字、函数、成员变量,自动l出tipQƈ自动更正大小写错误,标示拼写错误{。是VC开发的良好伴G?
Understand for C++ 一ƾc/c++IDE~程的辅助工P支持反向工程Q代码导向和一些统计功能,从http://www.scitools.com可以扑ֈ有关Understand for C++的详l信息?

E序~辑?/font>

EditPlus 一Ƒ־不错的文本编辑YӞ功能强大却又十分dy。支持不同语a的语法加亮,q有Projectl织功能Q具有丰富的自定义功能。通过讄User ToolQ可以和其他语言~译器结合,形成一个简单的IDE?/font>
Ultra Edit 功能和EditPlus相当Q通过脚本文g提供的配|功能可以定制编辑环境,但自6.0版以后一直没多大变化Q就~程而言Q自定义讄没有EditPlus方便?
EMACS 公认的世界上功能最多,最复杂的文本编辑器Q其实也可以当作E序员用的编辑器?
Visual Slick Edit 一个功能强大的E序员用~辑器。最值得一提的是其定制功能Q很好用Q可以和EMACS相比。自带了(jin)一套PCODE解释器,用c的语法,q可以挂接动态库。配合mingw一起用很方便。从http://www.slickedit.com可以扑ֈ有关SlickEdit的详l信息?/font>
IQEdit 全功能的E序员用~辑器,界面很漂亮,从http://pwksoftware.com可以扑ֈ有关IQEdit的详l信息?/font>

UML/建模

Rational Rose 强大的徏模工P早已"家喻h"Q功q自然不必多加评说了(jin)。从http://www.rationalsoftware.com.cn可以扑ֈ有关Rational Rose的详l信息?/font>
Visual Modeler MS Visual Studio 6.0所附的工兗属于Rational和MicroSoft合作的战略品,是Rose的简化版?/font>
Visio Microsoft的徏模工P感觉更h性化一些,但功能没有Rose多、强、专Q支持正向的代码生成Q以?qing)对代码的反向工E?/font>
Together 另一Ƒ֊能强大的建模工具Q用java~写而成Q口不错,不过速度E稍慢了(jin)一些。从http://www.togethersoft.com可以扑ֈ有关Togather的详l信息,另外Q以下网址提供?jin)一个有关Together的教E:(x)
http://www.cc.puv.fi/~tka/kurssit/Tietojarjestelmien_suunnittelu/together/TCCGuide6
Visual UML 支持多种语言cdQ比如:(x)VC、VB、DELPHI、CORBA IDL{,可以直接从UML设计囄成代码,单易用,完全适合Personal useQ界面也很清爽。从http://www.visualObject.com可以扑ֈ有关Visual UML的详l信息?/font>
SmartDraw 通用图表制作软gQ可以用来制作组l机构图、流E图、统计图表等。随带有囑ֺQ基本满_作各cd表的需要。从http://www.smartdraw.com可以扑ֈ有关SmartDraw的详l信息?/font>
PlayCase 国面向对象的徏模YӞ兼容UML和IDEFQ轻量软gQ只是界面看h有点_(d)乃是高展先生用Delphi完成的?/font>

版本控制

ClearCase Rational的版本控制管理YӞ功能强大Q可以控制多U类型的文档Q甚臛_括Word、Excel、PowerPoint文档。但使用复杂Q不易上手,且不是免费Y件?/font>
CVS 为基于Web的分布式协同开发提供了(jin)版本控制理手段Q且是免费YӞ可以通过脚本定制功能。但在权限控制方面功能相对较弱?/font>
VSS 微Y的版本控制管理工P功能相对单,适合于小型团队开发,其整合到微软的其他开发工具中Q用v来十分方ѝ?/font>
SourceOffSite 微Y为开发h员提供的q程讉KVSS数据库的工具Q数据库得以远E更斎ͼ以支持远E办公?/font>

其他的版本管理工兯包括QPVCS、VCS、RCS{?

XML

expat 用于d和处理XML文档的c函数库,最初是James Clark的个Z品,单轻巧,且速度快。但支持的编码方式有限,最遗憾的是不支持中文。从http://expat.sourceforge.net可以扑ֈ有关expat的详l信息?/font>
xml4c IBM的XML ParserQ用c++语言写就Q功能超U强大。号U支持多?00U字W编码,能够支持中文Q适合于大规模的xml应用。若只是很小范围的应用,则非最佳选择Q毕竟,你需?背负"U?2M左右的dll的沉重负担。从http://www.alphaworks.ibm.com/tech/xml4c可以扑ֈ有关xml4c的详l信息?
Xerces c++ Apache的XML目Q同hc++实现Q来源于IBM的xml4cQ因此编E接口也是和xml4c一致的。但是目前只支持数的字W编码,如ASCIIQUTF-8QUTF-16{,不能处理包含中文字符的XML文档。从http://xml.apache.org/xerces-c可以扑ֈ有关Xerces c++的详l信息?/font>

CppUnit 一个c++的单元测试框Ӟ可以通过z试cȝ方式Q定制具体的试Ҏ(gu)。xUnit家族的一员,从JUnitUL而来QJUnit是Java语言的单元测试框架。从http://cppuint.sourceforge.net可以扑ֈ有关CppUint的详l信息?/font>
Rational ROBOT Rational的自动化试工具Q通过~写脚本的方式提供自动化试Ҏ(gu)。其GUI方式的脚本录制功能,有助于对GUI软gq行功能试Q其VU方式的脚本录制功能,有助于测试某些Y件的数据通讯功能?/font>
Rational Purify 同样是Rational的自动化试工具Q不需要被程序的源代码,可以用来(g)查内存访问错误、Windows API调用错误{,以完成Y件的可靠性测试,属于白盒试?/font>

其他的Rational试工具q包括:(x)TestFactory、PureCoverage、TestManager{?

日志

log4cpp 一个用于日志记录的c++函数库,可以内容以定制的方式记录到不同的目的地Q比如:(x)文g、控制台、syslog{,同时q可以通过控制记录U别来屏蔽掉某些无关记录。从http://log4cpp.sourceforge.net可以扑ֈ有关log4cpp的详l信息?/font>

注释

Doc++ 注释文档生成工具Q根据源E序中的文档注释Q可以输出TeX和HTML格式的文档。除?jin)支持c/c++语言外,q支持IDL和java。仅提供命o(h)行用方式。从http://docpp.sourceforge.net可以扑ֈ有关Doc++的详l信息?/font>
Doxygen 注释文档生成工具Q较之Doc++功能更ؓ(f)齐全Q可以生成包括HTML、PDF、RTF在内的多U格式的文档Qƈ有GUI界面Q除?jin)支持c/c++语言外,q支持IDL、java、PHP、c#{。从 http://www.stack.nl/~dimitri/doxygen 可以扑ֈ有关Doxygen的详l信息?/font>



]]>
C/C++随笔 ?头文件一?(转蝲)http://www.shnenglu.com/mumutou/archive/2006/12/28/16937.html木木?/dc:creator>木木?/author>Thu, 28 Dec 2006 05:50:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/28/16937.htmlhttp://www.shnenglu.com/mumutou/comments/16937.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/28/16937.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/16937.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16937.html C 、传l?span lang="EN-US"> C++

#include <assert.h>// 讑֮插入?/span>

#include <ctype.h> // 字符处理

#include <errno.h> // 定义错误?/span>

#include <float.h> // 点数处?/span>

#include <fstream.h>   //文g输入Q输?/span>

#include <iomanip.h>   //参数化输入/输出

#include <iostream.h>  //数据输入/输出

#include <limits.h>// 定义各种数据cd最值常?/span>

#include <locale.h>// 定义本地化函?/span>

#include <math.h>  //定义数学函数

#include <stdio.h> // 定义输入Q输出函?/span>

#include <stdlib.h>// 定义杂项函数?qing)内存分配函?/span>

#include <string.h>// 字符串处?/span>

#include <strstrea.h>  //Z数组的输入/输出

#include <time.h>  //定义关于旉的函?/span>

#include <wchar.h> // 宽字W处理及(qing)输入Q输?/span>

#include <wctype.h>// 宽字W分c?/span>

//////////////////////////////////////////////////////////////////////////

标准 C++ Q同上的不再注释Q?/span>

#include <algorithm>   //STL 通用法

#include <bitset>  //STL 位集容器

#include <cctype>

#include <cerrno>

#include <clocale>

#include <cmath>

#include <complex> // 复数c?/span>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <ctime>

#include <deque>   //STL 双端队列容器

#include <exception>   //异常处理c?/span>

#include <fstream>

#include <functional>  //STL 定义q算函数Q代替运符Q?/span>

#include <limits>

#include <list>//STL U性列表容?/span>

#include <map> //STL 映射容器

#include <iomanip>

#include <ios> // 基本输入Q输出支?/span>

#include <iosfwd>  //输入Q输出系l用的前置声明

#include <iostream>

#include <istream> // 基本输入?/span>

#include <ostream> // 基本输出?/span>

#include <queue>   //STL 队列容器

#include <set> //STL 集合容器

#include <sstream> // Z字符串的?/span>

#include <stack>   //STL 堆栈容器

#include <stdexcept>   //标准异常c?/span>

#include <streambuf>   //底层输入Q输出支?/span>

#include <string>  //字符串类

#include <utility> //STL 通用模板c?/span>

#include <vector>  //STL 动态数l容?/span>

#include <cwchar>

#include <cwctype>

using namespace std;

//////////////////////////////////////////////////////////////////////////

C99 增加

#include <complex.h> // 复数处理

#include <fenv.h>// 点环境

#include <inttypes.h>// 整数格式转换

#include <stdbool.h> // 布尔环境

#include <stdint.h>  //整型环境

#include <tgmath.h>  //通用cd数学?/span>



]]>
C/C++随笔 之malloc/free 和new/delete区别http://www.shnenglu.com/mumutou/archive/2006/12/28/16927.html木木?/dc:creator>木木?/author>Thu, 28 Dec 2006 02:36:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/28/16927.htmlhttp://www.shnenglu.com/mumutou/comments/16927.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/28/16927.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/16927.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16927.htmlmalloc/free ,new/delete
怿大家对上面两个命令都不默?br />大家q两个命令其实是又区别的
首先
1.malloc 与free 是C++/C 语言的标准库函数Qnew/delete 是C++的运符
2.不能够把执行构造函数和析构函数的Q务强加于malloc/free
3.两者都可以使用异常出错函数,不过个h觉得malloc/free对于异常出错处理更加方便
malloc/freeq个命o(h)只是对内存操?U内存操作函?br />而new/delete命o(h)?x)执行构造函数和析构函数
所以我的意见是:
对于非系l内部数据的?量使用new/delete
当然如果是自己新建类的话,也用new/delete,不然怎么调用构造函数和析构函数?
对于pȝ内部函数的话,使用malloc/free
int *p = (int*)malloc(sizeof(int)*num);
class A
{
   A();
   ~A();
};

A *a = new A;
new也有一个好?可以处理不同的构造函?br />Example Code:
class A
{
   A();
   ~A();
}
A *a = new A;
在类声明U加?br />A(int x,int y);
可以?br />A *a = new A(1,2);



]]>
C++随笔 ?指针分析http://www.shnenglu.com/mumutou/archive/2006/12/28/16926.html木木?/dc:creator>木木?/author>Thu, 28 Dec 2006 02:22:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/28/16926.htmlhttp://www.shnenglu.com/mumutou/comments/16926.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/28/16926.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/16926.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16926.html 在C++里面,指针是一U比较麻?ch)的操?但是我们又不得不?因ؓ(f)他给我们~程以很大的灉|?br />下面我讲以下指针作ؓ(f)函数参数时的问题
在函数参C,~译器L要ؓ(f)函数的每个参数制作(f)时副本,指针
参数p 的副本是 _pQ编译器?_p = p 。如果函C内的E序修改?jin)_p 的内容,导?br />参数p 的内容作相应的修攏V这是指针可以用作输出参数的原因。在本例中,_p 甌
?jin)新的内存,只是把_p 所指的内存地址改变?jin),但是p 丝毫未变?br />以上是林锐博士在高质量C++~程中的描述
下面我们l合描述l出调试CODE
 Example Code:
void GetMemory(char *p,int num)
{
 p = (char*)malloc(sizeof(char)*num);
// return
}

void main()
{
 char *str = NULL;
 GetMemory(str,100);
 strcpy(str,"Hello World");//出错
}
首先我们先看看asm
004010B8   mov         dword ptr [ebp-4],0
004010BF   push        64h
004010C1   mov         eax,dword ptr [ebp-4]
004010C4   push        eax
004010C5   call        @ILT+50(GetMemory) (00401037)
str 地址:12FF7C
其副本地址:12FF28
在存入参数的时?同时都指?0 00 00 00
在执行p = (char*)malloc(sizeof(char)*num);之后
12FF28指向的内容变成了(jin)20 1C 43 00?
林锐博士在这边的意思是只用指向指针的指?q种Ҏ(gu)我们在第二种Ҏ(gu)U介l?
下面l出我的一U看?大家觉得好不?br />我的Ҏ(gu):
char *GetMemory(char *p,int num)
{
 p = (char*)malloc(sizeof(char)*num);
 return p;
}

void main()
{
 char *str = NULL;
 str = GetMemory(str,100);
 strcpy(str,"Hello World");
 cout<<str<<endl;
}
可以化ؓ(f):
char *GetMemory(int num)
{
 char *p = (char*)malloc(sizeof(char)*num);
 return p;
}

void main()
{
 char *str = NULL;
 str = GetMemory(100);
 strcpy(str,"Hello World");
 cout<<str<<endl;
}

林锐博士的看?
void GetMemory(char **p,int num)
{
   *p = (char*)malloc(sizeof(char)*num);
}
void main()
{
   char *str = NULL;
   GetMemory(&str,100);
   strcpy(str,"Hello,World");
   cout <<str<<endl;
}





]]>
C++ 随笔 ??-?收藏) http://www.shnenglu.com/mumutou/archive/2006/12/25/16843.html木木?/dc:creator>木木?/author>Mon, 25 Dec 2006 08:06:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/25/16843.htmlhttp://www.shnenglu.com/mumutou/comments/16843.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/25/16843.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/16843.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16843.html 在C++中,库的C是非帔R的。C++之父 Bjarne Stroustrup先生多次表示?jin)设计库来扩充功能要好?/font>

设计更多的语法的a论。现实中QC++的库门类J多Q解决的问题也是极其q泛Q库从轻量到重量

的都有。不都是让人眼界大开Q亦或是望而生叹的思维C。由于库的数量非常庞大,而且限于W?/font>

水^Q其中很多ƈ不了(jin)解。所以文中所提的一些库都是比较著名的大型库?/font>

标准?/font>

标准库中提供?jin)C++E序的基本设施。虽然C++标准库随着C++标准折腾?jin)许多年Q直到标准的出台才正

式定型,但是在标准库的实C却很令hƣ慰得看到多U实玎ͼq且已被实践证明为有工业U别强度?/font>

佳作?/font>

1、 ?Dinkumware C++ Library

         参考站点:(x) http://www.dinkumware.com

P.J. Plauger~写的高品质的标准库。P.J. Plauger博士是Dr. Dobb'sE序设计杰出奖的获得者。其~?/font>

写的库长期被Microsoft采用Qƈ且最qB(ti)orland也取得了(jin)其OEM的licenseQ在其C/C++的品中采用

Dinkumware的库?/font>

2、 ?RogueWave Standard C++ Library

         参考站点:(x) http://www.roguewave.com/

q个库在Borland C++ Builder的早期版本中曄被采用,后来被其他的库给替换?jin)。笔者不推荐 ?/font>

3、SGI STL

         参考站点:(x) http://www.roguewave.com/

SGI公司的C++标准模版库?/font>

4、STLport

         参考站点:(x) http://www.stlport.org

SGI STL库的跨^台可UL版本?/font>

准标准库——Boost

Boost库是一个经q千锤百点{可UL、提供源代码的C++库,作ؓ(f)标准库的后备Q是C++标准化进E的

发动Z一?Boost库由C++标准委员?x)库工作l成员发P在C++C֌中媄(jing)响甚大,其成员已q?000?/font>

?Boost库ؓ(f)我们带来?jin)最新、最酗最实用的技术,是不折不扣的“准”标准库?/font>

Boost中比较有名气的有q么几个库:(x)

Regex
正则表达式库

Spirit
LL parser frameworkQ用C++代码直接表达EBNF

Graph
囄件和法

Lambda
在调用的地方定义短小匿名的函数对象,很实用的functional功能

concept check
(g)查泛型编E中的concept

Mpl
用模板实现的元编E框?/font>

Thread
可移植的C++多线E库

Python
把C++cd函数映射到Python之中

Pool
内存池管?/font>

smart_ptr
5个智能指针,学习(fn)指针必读Q一份不错的参考是来自CUJ的文章:(x)

Smart Pointers in Boost,哦,q篇文章可以查到QCUJ是提供在U浏览的。中文版见笔者在《Dr.

Dobb's Journal软g研发杂志》第7辑上的译文?/font>


BoostM来说是实用h(hun)值很高,质量很高的库。ƈ且由于其对跨q_的强调,Ҏ(gu)准C++的强调,是编

写^台无养ICC++的开发者必备的工具。但是Boost中也有很多是实验性质的东西,在实际的开发中

实用需要}慎。ƈ且很多Boost中的库功能堪U对语言功能的扩展,其构造用精巧的手法Q不要N?/font>

的花Ҏ(gu)间研诅RBoost另外一面,比如Graphq样的库则是h工业强度Q结构良好,非常值得研读?/font>

_֓代码Qƈ且也可以攑ֿ(j)的在产品代码中多多利用?/font>

         参考站点:(x) http://www.boost.org 
         Q国内镜像:(x) http://www.c-view.org/tech/lib/boost/index.htm Q?/font>

GUI

在众多C++的库中,GUI部分的库是比较J荣Q也比较引h注目的。在实际开发中QGUI库的选择也是

非常重要的一件事情,下面我们lD一下可选择的GUI库,各自的特点以?qing)相兛_L(fng)支持?/font>

1、 ?MFC

大名鼎鼎的微软基cdQMicrosoft Foundation ClassQ。大凡学qVC++的h都应该知道这个库。虽

然从技术角度讲QMFC是不大漂亮的Q但是它构徏于Windows API 之上Q能够ɽE序员的工作更容?~?/font>

E效率高Q减了(jin)大量在徏?Windows E序时必ȝ写的代码Q同时它q提供了(jin)所有一?C++ ~程?/font>

优点Q例如承和装。MFC ~写的程序在各个版本的Windows操作pȝ上是可移植的Q例如,?

Windows 3.1下编写的代码可以很容易地UL?Windows NT ?Windows 95 上。但是在最q发展以?/font>

官方支持上日渐势微?/font>

2、 ?QT    
         参考网站:(x)http://www.trolltech.com/

Qt是Trolltech公司的一个多q_的C++囑Ş用户界面应用E序框架。它提供l应用程序开发者徏立艺?/font>

U的囑Ş用户界面所需的所用功能。Qt是完全面向对象的很容易扩展,q且允许真正地组件编E。自?/font>

1996q早些时候,Qtq入商业领域Q它已经成ؓ(f)全世界范围内数千U成功的应用E序的基。Qt也是?/font>

行的Linux桌面环境KDE 的基Q同时它q支持Windows、Macintosh、Unix/X11{多U^台?/font>

3、WxWindows    
         参考网站:(x)http://www.wxwindows.org/

跨^台的GUI库。因为其cdơ极像MFCQ所以有文章介绍从MFC到WxWindows的代码移植以实现跨^台的

功能。通过多年的开发也是一个日完善的GUI库,支持同样不弱于前面两个库。ƈ且是完全开放源?/font>

码的。新q的C++ Builder X的GUI设计器就是基于这个库的?/font>

4、Fox     
         参考网站:(x)http://www.fox-toolkit.org/

开放源代码的GUI库。作者从自己亲n的开发经验中得出?jin)一个理想的GUI库应该是什么样子的感受出发

Q从而开始了(jin)对这个库的开发。有兴趣的可以尝试一下?/font>

5、WTL

ZATL的一个库。因Z用了(jin)大量ATL的轻量手法Q模板等技术,在代码尺寸,以及(qing)速度优化斚w?/font>

得非常到位。主要面向的使用体是开发COM轻量U供|络下蝲的可视化控g的开发者?/font>

6、GTK    
         参考网站:(x)http://gtkmm.sourceforge.net/

GTK是一个大名鼎鼎的C的开源GUI库。在Linux世界中有Gnomeq样的杀手应用。而GTK是q个库的C++

装版本?/font>


|络通信

ACE       
         参考网站:(x)http://www.cs.wustl.edu/~schmidt/ACE.html

C++库的代表Q超重量U的|络通信开发框架。ACE自适配通信环境QAdaptive Communication

EnvironmentQ是可以自由使用、开放源代码的面向对象框Ӟ在其中实C(jin)许多用于q发通信软g?/font>

核心(j)模式。ACE提供?jin)一l丰富的可复用C++包装外观QWrapper FacadeQ和框架lgQ可跨越多种q_

完成通用的通信软gdQ其中包括:(x)事g多\分离和事件处理器分派、信号处理、服务初始化、进E?/font>

间通信、共享内存管理、消息\由、分布式服务动态(重)(j)配置、ƈ发执行和同步Q等{?/font>

StreamModule    
            参考网站:(x)http://www.omnifarious.org/StrMod/

设计用于化编写分布式E序的库。尝试着使得~写处理异步行ؓ(f)的程序更Ҏ(gu)Q而不是用同步的外?/font>

包v异步的本质?/font>

SimpleSocket       
            参考网站:(x)http://home.hetnet.nl/~lcbokkers/simsock.htm

q个cd让编写基于socket的客?服务器程序更加容易?/font>

A Stream Socket API for C++

            参考网站:(x)    http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html

又一个对Socket的封装库?/font>

XML

Xerces   
                     参考网站:(x)http://xml.apache.org/xerces-c/

Xerces-C++ 是一个非常健壮的XML解析器,它提供了(jin)验证Q以?qing)SAX和DOM API。XML验证在文档类型定

?Document Type DefinitionQDTD)斚w有很好的支持Qƈ且在2001q?2月增加了(jin)支持W3C XML

Schema 的基本完整的开放标准?/font>

XMLBooster      
                     参考网站:(x)http://www.xmlbooster.com/

q个库通过产生特制的parser的办法极大的提高?jin)XML解析的速度Qƈ且能够生相应的GUIE序来修?/font>

q个parser。在DOM和SAX两大LXML解析办法之外提供?jin)另外一个可行的解决Ҏ(gu)?/font>

Pull Parser

          参考网站:(x) http://www.extreme.indiana.edu/xgws/xsoap/

 q个库采用pullҎ(gu)的parser。在每个SAX的parser底层都有一个pull的parserQ这个xpp?/font>

q层暴露出来直接l大家用。在要充分考虑速度的时候值得试?/font>

Xalan

         参考网站:(x) http://xml.apache.org/xalan-c/

         Xalan是一个用于把XML文档转换为HTMLQ纯文本或者其他XMLcd文档的XSLT处理器?/font>

CMarkup

         参考网站:(x) http://www.firstobject.com/xml.htm

         q是一U用EDOM的XML解析器。在很多思\上面非常灉|实用。值得大家在DOM和SAX之外?/font>

求一点灵感?/font>

libxml++

                  参考网站 ?http://libxmlplusplus.sourceforge.net/

libxml++是对著名的libxml XML解析器的C++装版本

 

U学计算

Blitz++

         参考网站:(x) http://www.oonumerics.org/blitz/

Blitz++ 是一个高效率的数D函数库Q它的设计目的是希望建立一套既具像C++ 一h便,同时?/font>

比Fortran速度更快的数D环境。通常Q用C++所写出的数值程序,?Fortran?0%左右Q因?/font>

Blitz++正是要改掉这个缺炏V方法是利用C++的template技术,E序执行甚至可以比Fortran更快?/font>

Blitz++目前仍在发展中,对于常见的SVDQFFTsQQMRES{常见的U性代数方法ƈ不提供,不过使用?/font>

可以很容易地利用Blitz++所提供的函数来构徏?/font>

POOMA

         参考网站:(x) http://www.codesourcery.com/pooma/pooma

POOMA是一个免费的高性能的C++库,用于处理q行式科学计。POOMA的面向对象设计方便了(jin)快速的E?/font>

序开发,对ƈ行机器进行了(jin)优化以达到最高的效率Q方便在工业和研I环境中使用?/font>

MTL      
                   参考网站:(x)http://www.osl.iu.edu/research/mtl/

Matrix Template Library(MTL)是一个高性能的泛型组件库Q提供了(jin)各种格式矩阵的大量线性代数方?/font>

的功能。在某些应用使用高性能~译器的情况下,比如Intel的编译器Q从产生的汇~代码可以看出其

与手写几乎没有两L(fng)效能?/font>

CGAL       
         参考网站:(x)www.cgal.org

Computational Geometry Algorithms Library的目的是把在计算几何斚w的大部分重要的解x案和

Ҏ(gu)以C++库的形式提供l工业和学术界的用户?/font>

 

游戏开?/strong>

Audio/Video 3D C++ Programming Library

         参考网站:(x) http://www.galacticasoftware.com/products/av/

AV3D是一个跨q_Q高性能的C++库。主要的Ҏ(gu)是提供3D囑ŞQ声效支持(SB,以及(qing)S3MQ,控制接口

Q键盘,鼠标和遥感)(j)QXMS?/font>

KlayGE

         参考网站:(x) http://home.g365.net/enginedev/

国内游戏开发高手自qC++开发的游戏引擎。KlayGE是一个开放源代码、跨q_的游戏引擎,q?/font>

Python作脚本语a。KlayGE在LGPL协议下发行。感谢龚敏敏先生Z国游戏开发事业所做出的A(ch)献?/font>

OGRE

         参考网站:(x) http://www.ogre3d.org

OGREQ面向对象的囑Ş渲染引擎Q是用C++开发的Q用灵zȝ面向对象3D引擎。它的目的是让开发?/font>

能更方便和直接地开发基?Dg讑֤的应用程序或游戏。引擎中的类库对更底层的pȝ库(如:(x)

Direct3D和OpenGLQ的全部使用l节q行?jin)抽象,q提供了(jin)Z现实世界对象的接口和其它cR?/font>

 

U程

C++ Threads

         参考网站:(x) http://threads.sourceforge.net/

q个库的目标是给E序员提供易于用的c,q些c被l承以提供在Linux环境中很隄到的大量的线

E方面的功能?/font>

ZThreads

         参考网站:(x) http://zthread.sourceforge.net/

一个先q的面向对象Q跨q_的C++U程和同步库?/font>

序列?/strong>

s11n

         参考网站:(x) http://s11n.net/

一个基于STL的C++库,用于序列化PODQSTL容器以及(qing)用户定义的类型?/font>

Simple XML Persistence Library

         参考网站:(x) http://sxp.sourceforge.net/

q是一个把对象序列化ؓ(f)XML的轻量的C++库?/font>

 

字符?/strong>

C++ Str Library

         参考网站:(x) http://www.utilitycode.com/str/

操作字符串和字符的库Q支持Windows和支持gcc的多U^台。提供高度优化的代码Qƈ且支持多U程?/font>

境和UnicodeQ同时还有正则表辑ּ的支持?/font>

Common Text Transformation Library

         参考网站:(x) http://cttl.sourceforge.net/

q是一个解析和修改STL字符串的库。CTTL substringcd以用来比较,插入Q替换以?qing)用EBNF的语?/font>

q行解析?/font>

GRETA

         参考网站:(x) http://research.microsoft.com/projects/greta/

q是由微软研I的研Ih员开发的处理正则表达式的库。在型匚w的情况下有非怼U的表现?/font>

l合

P::Classes

         参考网站:(x) http://pclasses.com/

一个高度可UL的C++应用E序框架。当前关注类型和U程安全的signal/slot机制Qi/opȝ包括Z

插g的网l协议透明的i/o架构Q基于插件的应用E序消息日志框架Q访问sql数据库的cȝ{?/font>

ACDK - Artefaktur Component Development Kit



]]>
C++随笔 ?C++多态性分?/title><link>http://www.shnenglu.com/mumutou/archive/2006/12/25/16842.html</link><dc:creator>木木?/dc:creator><author>木木?/author><pubDate>Mon, 25 Dec 2006 07:42:00 GMT</pubDate><guid>http://www.shnenglu.com/mumutou/archive/2006/12/25/16842.html</guid><wfw:comment>http://www.shnenglu.com/mumutou/comments/16842.html</wfw:comment><comments>http://www.shnenglu.com/mumutou/archive/2006/12/25/16842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mumutou/comments/commentRss/16842.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mumutou/services/trackbacks/16842.html</trackback:ping><description><![CDATA[ <font face="Courier New" size="2">原文出处</font> <a > <br /> <font face="Courier New" size="2">http://community.csdn.net/Expert/topic/5240/5240218.xml?temp=.6121942</font> </a> <br /> <br /> <font face="Courier New" size="2">C++多态性是Z抽象cL实现?什么叫抽象c?<br />抽象cd是不能被实例化的c?主要是因为类中包含一个纯虚函?br />例如:<br />virtual   void   draw() = 0;<br />抽象cM能实例化,但是其派生类可以<br />zc重写draw()函数之后可以实例化对象?那么n个派生类可以有nU不同的draw()函数<br />举一个例?<br />例如:                           人[  男h        女h]<br />人可以[力_]?那么我们把[力_]q个函数定义为纯虚函?<br />那么在定义[男h]的时?我们可以重写[力_]函数,让他q行耕地操作<br />在定义[女h]的时?我们可以重写[力_]函数,让她q行l布操作<br />那么在h力_的时?具体到男?那就是耕地,具体到女?那就是织?br /><br />以上是一个最单的解释<br />那么我们如果出现q个问题,分ؓ(f)老年?中年?孩?br />那么我们在承hq个cȝ时?把老年?中年?孩?不能重写它的力_函数,也就是劳动函数还是一个纯虚函?下面我给Z个图<br /><img src="file:///C:/Documents%20and%20Settings/Administrator/桌面/class.bmp" /><br />[比喻不是很确?抱歉]<br />下面我给例子:<br />Code Example<br />class Person<br />{<br />   virtual void Do() = 0;<br />};<br />class OldPerson:public Persion<br />{<br />};<br />class OldMan:public OldPerson<br />{<br />   void Do()<br />   {<br />      抽烟,聊天();<br />   }<br />};<br />class OldWoman:public OldPerson<br />{<br />   void Do()<br />   {<br />      z衣?);<br />   }<br />}<br />class MidPerson:public Person<br />{<br />};<br />class MidMan:public MidPerson<br />{<br />   void Do()<br />   {<br />      耕地();<br />   }<br />};<br />class MidWoman:public MidPerson<br />{<br />   void   Do()<br />   {<br />      l布();<br />   }<br />};<br />......下面孩子的我就不写?怿聪明的你一下子q道怎么写了(jin)<br />void   力_(const Person &person)<br />{<br />   person.Do();<br />}<br />void main()<br />{<br />      MidWoman midwomen;<br />      MidMan  midman;<br />      力_(midwoman);<br />      力_(midman);<br />      <br />}<br /></font> <img src ="http://www.shnenglu.com/mumutou/aggbug/16842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mumutou/" target="_blank">木木?/a> 2006-12-25 15:42 <a href="http://www.shnenglu.com/mumutou/archive/2006/12/25/16842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++随笔 ?C++Ҏ(gu):(x)单承和多承的含义http://www.shnenglu.com/mumutou/archive/2006/12/25/16838.html木木?/dc:creator>木木?/author>Mon, 25 Dec 2006 05:59:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/25/16838.htmlhttp://www.shnenglu.com/mumutou/comments/16838.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/25/16838.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/16838.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16838.html原文出处Q?br /> http://community.csdn.net/Expert/topic/5252/5252647.xml?temp=.1502344
在C++中承分为2U:(x)1.单?Q?多?br />[单承解?]
zcL很多,但是基类只有一?q个q当与一?父亲"和很多个孩子,cM于一部小?lt;<生游击?gt;>,什么上?哈尔?乌鲁木齐?/font>
[多承解?]
zcd以承来?个以上的基类,A和B生出来的"孩子"?父亲"的特性也?母亲"?Ҏ(gu)?q有点类g基因遗传.
下面l出例子:
Code Example:
class A
{
public:
   A(int x,int y)
{
   data1 = x;
   data2 = y;
cout <<"A:"<<data1<<data2;
}
private:
   int data1;
   int data2;
};
class B
{
public:
   B(int x,int y)
{
   data1 = x;
   data2 =y;
   cout << "B:"<<data1<<data2;
}
private:
   int data1;
   int data2;
};
class C:public A,public B
{
   public:
   C(int x,int y,int x1,int y1):A(x,y),B(x1,y1)
   {
   }
};
void main()
{
   C c(1,2,3,4);
}


]]>C++随笔 ?C++试题目http://www.shnenglu.com/mumutou/archive/2006/12/25/16836.html木木?/dc:creator>木木?/author>Mon, 25 Dec 2006 05:42:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/25/16836.htmlhttp://www.shnenglu.com/mumutou/comments/16836.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/25/16836.html#Feedback4http://www.shnenglu.com/mumutou/comments/commentRss/16836.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16836.html下面q段代码的输出是多少(?2位机?.
    char *p;
    char *q[20];
    char *m[20][20];
    int (*n)[10];
    struct MyStruct
    {
      char dda;
      double dda1;
      int type ;
    }Q?
    MyStruct k;
    printf("%d %d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));


]]>C++随笔 ?关于C++友元函数问题http://www.shnenglu.com/mumutou/archive/2006/12/25/16834.html木木?/dc:creator>木木?/author>Mon, 25 Dec 2006 05:36:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/25/16834.htmlhttp://www.shnenglu.com/mumutou/comments/16834.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/25/16834.html#Feedback1http://www.shnenglu.com/mumutou/comments/commentRss/16834.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16834.html 原文出处Q?/font>
http://community.csdn.net/Expert/topic/5253/5253345.xml?temp=.6615412

友元函数可以定义在类的内部,也可以定义在cȝ外部Q但是即使它定义在类内,它也是“全局函数”?br />通常在类函数名前面声明friend
那么可以对cd部的private变量q行操作?br />vc6.0对友元函数的支持本h认ؓ(f)q可以,q不是他们所说的那么差.
下面l出例子Q?br />Code Example:

#include <iostream>
#include <string>
using namespace std;
class A
{
private:
    string name;
public:
    friend void outdata(A &s) ;
    A(){};
    virtual ~A){};
    Astring &s);
};
A:student(string &s)
{
 name=s;
}

void outdata(A &s)
{
 cout<<"out data:"<<s.name<<endl;
}

void main()
{
 string t="tim";
 A s1(t);
 outdata(s1);
}



]]>
C/C++随笔 ?C++ Sizeof()函数http://www.shnenglu.com/mumutou/archive/2006/12/25/16830.html木木?/dc:creator>木木?/author>Mon, 25 Dec 2006 05:13:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/25/16830.htmlhttp://www.shnenglu.com/mumutou/comments/16830.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/25/16830.html#Feedback0http://www.shnenglu.com/mumutou/comments/commentRss/16830.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16830.html原文出处:
http://community.csdn.net/Expert/topic/5253/5253878.xml?temp=.5134088
A ====char *p[10];int *a[10];
针对q个问题
首先我给出另一个例?br />B ====char (*p)[10];int (*a)[10];
A和B是不一L(fng)
A解释Qchar *p[10]定义?0?2位的指向char的指针p[0],p[1],p[2]......p[9],
      int *a[10]定义?0?2位的指向int的指针a[0],a[1],a[2]......a[9],
Get:10 * 32 /8 = 40,OK
B解释Qchar (*p)[10]定义?jin)一个指?0个char?2位指针p
      int (*a)[10]定义?jin)一个指?0个int?2位指针a
Get:32/ 8 = 4, OK
               
Code Example:
void main()
{
 char *p[10];
 int  *a[10];
 char (*p1)[10];
 int  (*a1)[10];
 int x1 = sizeof(p);
 int x2 = sizeof(a);
 int x3 = sizeof(p1);
 int x4 = sizeof(a1);
 cout <<x1<<"\n"<<x2<<"\n"<<x3<<"\n"<<x4<<"\n";
}


]]>C/C++随笔 ?l承cȝ构?析构函数?x)隐式调用基cȝ构?析构函数http://www.shnenglu.com/mumutou/archive/2006/12/25/16824.html木木?/dc:creator>木木?/author>Mon, 25 Dec 2006 04:58:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/25/16824.htmlhttp://www.shnenglu.com/mumutou/comments/16824.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/25/16824.html#Feedback1http://www.shnenglu.com/mumutou/comments/commentRss/16824.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16824.html首先声明:成员函数不会(x),即是虚函数也不?
下面是我l出的example:
#include <iostream.h>
int num = 0;
int num1 = 0;
class A
{
public:
 A()
 {
  cout << num++;
 }
 ~A()
 {
  cout << num --;
 }
};
class B:public A
{
public:
 B()
 {
  cout << num ++;
 }
 ~B()
 {
  cout << num--;
 }
};
void main()
{
 A a;
 B b;
}


]]>C/C++随笔 ?一个有的C循环问题http://www.shnenglu.com/mumutou/archive/2006/12/25/16822.html木木?/dc:creator>木木?/author>Mon, 25 Dec 2006 04:41:00 GMThttp://www.shnenglu.com/mumutou/archive/2006/12/25/16822.htmlhttp://www.shnenglu.com/mumutou/comments/16822.htmlhttp://www.shnenglu.com/mumutou/archive/2006/12/25/16822.html#Feedback2http://www.shnenglu.com/mumutou/comments/commentRss/16822.htmlhttp://www.shnenglu.com/mumutou/services/trackbacks/16822.htmlvoid main()
{
 int i;
 int a[10];
 for(i = 0;i <=10;i ++)
  a[i] = 0;
}
大家?很简单的一个问?但是Z么会(x)一直执行呢?
明显,聪明的你看出问题出现for(i = 0;i <= 10;i ++)   a[i] = 0;
d定义?0个int,明显循环出?jin)范?
下面我们来看看其汇~如何运?大家都明白?
00401031   mov         eax,dword ptr [ebp-4]
00401034   add         eax,1
00401037   mov         dword ptr [ebp-4],eax
0040103A   cmp         dword ptr [ebp-4],0Ah
0040103E   jg          main+3Dh (0040104d)
00401040   mov         ecx,dword ptr [ebp-4]
00401043   mov         dword ptr [ebp+ecx*4-2Ch],0
0040104B   jmp         main+21h (00401031)
E序一直在00401031-0040104B之间q行,问题出在00401043上面,
i变量在dwort ptr[ebp-4]
那么当执行到i =10
dword ptr[ebp + ecx*4-2cH]= dword ptr[ebp+dword ptr[ebp-4]*4-2ch]
=dword ptr[ebp + 10*4-44] = dword ptr[ebp-4]
哈哈,i变成?


]]>
C/C++随笔 之C++拯构造函C?/title><link>http://www.shnenglu.com/mumutou/archive/2006/12/25/16819.html</link><dc:creator>木木?/dc:creator><author>木木?/author><pubDate>Mon, 25 Dec 2006 03:34:00 GMT</pubDate><guid>http://www.shnenglu.com/mumutou/archive/2006/12/25/16819.html</guid><wfw:comment>http://www.shnenglu.com/mumutou/comments/16819.html</wfw:comment><comments>http://www.shnenglu.com/mumutou/archive/2006/12/25/16819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/mumutou/comments/commentRss/16819.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/mumutou/services/trackbacks/16819.html</trackback:ping><description><![CDATA[ <a href="/mumutou/articles/16816.html"> <font face="Courier New">http://www.shnenglu.com/mumutou/articles/16816.html</font> </a> <img src ="http://www.shnenglu.com/mumutou/aggbug/16819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/mumutou/" target="_blank">木木?/a> 2006-12-25 11:34 <a href="http://www.shnenglu.com/mumutou/archive/2006/12/25/16819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.dgyjte580.cn" target="_blank">޹˾þۺһ77 </a>| <a href="http://www.spxian.cn" target="_blank">޹Ʒ18þþþþ</a>| <a href="http://www.91zuoai.cn" target="_blank">þоƷ</a>| <a href="http://www.yzlxdr.cn" target="_blank">Ʒþþþ</a>| <a href="http://www.niguoyi.cn" target="_blank">ɫۺϾþۺۺ</a>| <a href="http://www.mail-lists.cn" target="_blank">þ˽˹ƷvA</a>| <a href="http://www.ccka.cn" target="_blank">Ʒ99Ʒþ</a>| <a href="http://www.hejz.cn" target="_blank">þùƷþþ</a>| <a href="http://www.yiqitong518.cn" target="_blank">ƷŮþþþAV </a>| <a href="http://www.ppmm163.cn" target="_blank">þ99Ʒþþþþ</a>| <a href="http://www.mxylzc.cn" target="_blank">þԭƷ</a>| <a href="http://www.szltw.cn" target="_blank">þݺҹҹ</a>| <a href="http://www.bgbgb.cn" target="_blank">þþƷ</a>| <a href="http://www.gvsx.cn" target="_blank">Ʒþþþһ</a>| <a href="http://www.x-site.cn" target="_blank">˾þô߽ۺ5g</a>| <a href="http://www.flycard.com.cn" target="_blank">avԾþþþa鶹</a>| <a href="http://www.youk6.cn" target="_blank">þerƵᆱƷ</a>| <a href="http://www.whpcjs.cn" target="_blank">ҹƷþþþþӰ777</a>| <a href="http://www.hm661.cn" target="_blank">ŷ츾þþþþò </a>| <a href="http://www.odcb.cn" target="_blank">ɫþþ99Ʒ</a>| <a href="http://www.tomp3.cn" target="_blank">ƷѾþþþӰԺ</a>| <a href="http://www.pikajing.cn" target="_blank">99þ㽶߿</a>| <a href="http://www.17kav.cn" target="_blank">97rþþƷ99</a>| <a href="http://www.65it.cn" target="_blank">þþþþžžƷӰԺ</a>| <a href="http://www.gegqmpvka.cn" target="_blank">ŷպľþ</a>| <a href="http://www.qq-info.cn" target="_blank">ɫۺϾþĻ</a>| <a href="http://www.17wgame.cn" target="_blank">˾Ʒþþþ7777</a>| <a href="http://www.0791gogo.cn" target="_blank">ۺþþ</a>| <a href="http://www.52037872.cn" target="_blank">˾ҹվھƷþþþþþþ</a>| <a href="http://www.fiyhigh.com.cn" target="_blank">þwww˳ɿƬ</a>| <a href="http://www.sh-jixiang.cn" target="_blank">һĻþ</a>| <a href="http://www.site5d.cn" target="_blank">þùAVJUST鶹</a>| <a href="http://www.telaviv.com.cn" target="_blank">ŷһþ</a>| <a href="http://www.zzxinwen.com.cn" target="_blank">þۺɫɫ</a>| <a href="http://www.zg-ly.cn" target="_blank">߳߳þþ91 </a>| <a href="http://www.lubricantbrand.cn" target="_blank">þþþþþž99Ʒ</a>| <a href="http://www.jzzhenan.cn" target="_blank">þþƷ7777</a>| <a href="http://www.52lovc.cn" target="_blank">ҹѸþӰԺ </a>| <a href="http://www.gu88.org.cn" target="_blank">պӰþþñ</a>| <a href="http://www.coldcha.cn" target="_blank">aëƬþ</a>| <a href="http://www.ksjhyt.cn" target="_blank">þҹ³˿Ƭϼ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>