??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产99国产精品澳门,久久久久人妻一区精品,久久精品国产亚洲7777 http://www.shnenglu.com/love4c/archive/2008/08/06/58185.htmllovetiffany lovetiffany Wed, 06 Aug 2008 14:18:00 GMT http://www.shnenglu.com/love4c/archive/2008/08/06/58185.html http://www.shnenglu.com/love4c/comments/58185.html http://www.shnenglu.com/love4c/archive/2008/08/06/58185.html#Feedback 2 http://www.shnenglu.com/love4c/comments/commentRss/58185.html http://www.shnenglu.com/love4c/services/trackbacks/58185.html
我个惛_?fn)C++Q最好直接学?fn)它Q不要先学习(fn)C语言Q然后在学习(fn)C++Q虽然C++是从C语言上发展过来的Q但如果你对C语言了解的越
多,在你写C(j)++E序的时候,你很难摆脱C的风|既你是一位很有经验的E序员,如果你对C很了解,在学?fn)C++的时候,量使用C++的风|我这?
q不是说C不好Q关键我们现在要了解的是C++而不是C?
现在让我们深入学?fn)C++吧!C++的难学,不仅在它那广博的语法、语法背后的语义、语义背后的深层思维、深层思维背后的对像模型;C++的难
学,q在与它提供了四U不同的~程思维模型。当我们找来一本C++教材Ӟ当我们翻开W一|Q这时我们已q入了C++的世界,我们现在开始探索,开始在
q求新技术的旅程中!
惛_好C++Q熟l掌握它的语法是不可的Q当你掌握了C++的语法时Q那么我要恭喜你Q你已正正进入了C++的世界,要想学好C++Q你只有?
力的学习(fn)Q经常的思考多多的实践Q这时你?x)问了,我应该还要学习(fn)什么呢Q?
C++的语法我都已掌握了啊Q我是不是可以学?fn)Windows~程了呢Q不要急,你是已掌握了C++的语法,但你能用它写出高效率的程序吗Q你已对C++
所有运行机刉了解吗?是的Q单单了解C++语法是不够的Q接下来你的d很多Q要学习(fn)如何高效C用C++语言。现在我教你怎样的学好它Q怎样的高?
使用它?
我们q是先从C++的语法开始说起吧Q这里我只做一个简单的概述Q当我们学习(fn)C++的时候,你先要了解它的编E模式,其中包括面向对像~程、通用
~程和传l的q程化编E。当你在学习(fn)一个C++语法Ӟ如果你一时感到很隄解,不妨你先跌q一D,l箋向后学习(fn)Q当你看完你所学习(fn)C++的那本教?
Ӟ你在回过头来学习(fn)C++Q你?x)发现其实它(yu)是那么回事Q有很多人在学习(fn)C++Ӟ刚学?fn)到了一半,H然感到好像以前学习(fn)的语法忘了许多,他们?x)把书?
d去,扑֛那忘掉的语法Q如果你在学?fn)C++时也有这L(fng)情况Q你大可不必那么担心Q你现在的Q务是l箋你的学习(fn)Q不要去那一时不记得的语法,如果?
现在去重新学?fn)那一时忘掉的C++Q恩Q不错,q看h你好像对那语法已深深的牢记在心,当你的C++在学?fn)到q里Ӟ你能保证前面的语法不在遗忘吗Q这
时的你在学习(fn)新的C++语法Ӟ但心?x)忘掉前面刚刚找回的C++Q你说这时你能学好新的C++语法吗?你会(x)一边学?fn)新的,一辚w复旧的,q样一来,那就p?
了,q时的你?x)很?gu)搞ؕ新旧C++语法Q新的记不住Q旧的又被新的语法搞׃Q这时的你不得不从头再来Q毕竟你是初学者)?
对于初学者来_(d)C++的广博语法是件头疼的事,学会(x)了这个却忘了那个Q就像我上面提到的那Pq时的你应该l箋的学?fn)C++新知识,{看完你?
中的那本C++教材Ӟ你在来学?fn)忘掉的语法Q这时你?x)感觉好像C++很简单,没有我们开始说的那么难学啊Q你?x)觉得我开始说C++隑֭是用来吓唬h的?
我说C++隑֭当然不是用来吓唬人的Q这时的你对C++语法已非常熟(zhn)了Q这时你千万不要认ؓ(f)对C++已很_N,像我开头所说的那样Q虽然现在你已摆?
了初学着的称|但你也不能算是位_Nh士啊Q你只掌握了C++的大概,接下来的你就要深入学?fn)拉Q?img src ="http://www.shnenglu.com/love4c/aggbug/58185.html" width = "1" height = "1" /> ]]> C/C++ E序设计员应聘常见面试试题深入剖?/title> http://www.shnenglu.com/love4c/archive/2008/03/14/44423.htmllovetiffany lovetiffany Fri, 14 Mar 2008 02:03:00 GMT http://www.shnenglu.com/love4c/archive/2008/03/14/44423.html http://www.shnenglu.com/love4c/comments/44423.html http://www.shnenglu.com/love4c/archive/2008/03/14/44423.html#Feedback 16 http://www.shnenglu.com/love4c/comments/commentRss/44423.html http://www.shnenglu.com/love4c/services/trackbacks/44423.html
许多面试题看似简单,却需要深厚的基本功才能给出完的解答。企业要求面试者写一个最单的strcpy函数都可看出面试者在技术上I竟辑ֈ了怎样的程
度,我们能真正写好一个strcpy函数吗?我们都觉得自pQ可是我们写出的strcpy很可能只能拿?0分中?分。读者可从本文看到strcpy
函数?分到10分解{的例子Q看看自己属于什么样的层ơ。此外,q有一些面试题考查面试者敏L(fng)思维能力? 分析q些面试题,本n包含很强的趣x;而作Z名研发h员,通过对这些面试题的深入剖析则可进一步增w的内功?br> 2.N?br> 试题1Q?br> void test1() { char string[10]; char* str1 = "0123456789"; strcpy( string, str1 ); } 试题2Q?br> void test2() { char string[10], str1[10]; int i; for(i=0; i<10; i++) { str1 = 'a'; } strcpy( string, str1 ); } 试题3Q?br> void test3(char* str1) { char string[10]; if( strlen( str1 ) <= 10 ) { strcpy( string, str1 ); } } 解答Q?br> 试题1字符串str1需?1个字节才能存放下Q包括末’\0’Q,而string只有10个字节的I间Qstrcpy?x)导致数l越界;
对试?Q如果面试者指出字W数lstr1不能在数l内l束可以l?分;如果面试者指出strcpy(string,
str1)调用使得从str1内存起复制到string内存h复制的字节数h不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10
分; 对试?Qif(strlen(str1) <= 10)应改为if(strlen(str1) < 10)Q因为strlen的结果未l计’\0’所占用?个字节?br> 剖析Q?br> 考查对基本功的掌握:(x) (1)字符串以’\0’l尾Q?br> (2)Ҏ(gu)l越界把握的敏感度; (3)库函数strcpy的工作方式,如果~写一个标准strcpy函数的dgؓ(f)10Q下面给出几个不同得分的{案Q?br> 2?br> void strcpy( char *strDest, char *strSrc ) { while( (*strDest++ = * strSrc++) != ‘\0’ ); } 4?br> void strcpy( char *strDest, const char *strSrc ) //源字符串加constQ表明其入参敎ͼ??br>{ while( (*strDest++ = * strSrc++) != ‘\0’ ); } 7?br> void strcpy(char *strDest, const char *strSrc) { //Ҏ(gu)地址和目的地址加非0断言Q加3?br> assert( (strDest != NULL) && (strSrc != NULL) ); while( (*strDest++ = * strSrc++) != ‘\0’ ); } 10?br> //Z实现铑ּ操作Q将目的地址q回Q加3分! char * strcpy( char *strDest, const char *strSrc ) { assert( (strDest != NULL) && (strSrc != NULL) ); char *address = strDest; while( (*strDest++ = * strSrc++) != ‘\0’ ); return address; } ?分到10分的几个{案我们可以清楚的看刎ͼ小的strcpy竟然暗藏着q么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完的strcpy啊! (4)对strlen的掌握,它没有包括字W串末尾?\0'?br> 读者看了不同分值的strcpy版本Q应该也可以写出一?0分的strlen函数了,完美的版本ؓ(f)Q?int strlen( const char *str ) //输入参数const { assert( strt != NULL ); //断言字符串地址? int len; while( (*str++) != '\0' ) { len++; } return len; } 试题4Q?br> void GetMemory( char *p ) { p = (char *) malloc( 100 ); } void Test( void ) { char *str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( str ); } 试题5Q?br> char *GetMemory( void ) { char p[] = "hello world"; return p; } void Test( void ) { char *str = NULL; str = GetMemory(); printf( str ); } 试题6Q?br> void GetMemory( char **p, int num ) { *p = (char *) malloc( num ); } void Test( void ) { char *str = NULL; GetMemory( &str, 100 ); strcpy( str, "hello" ); printf( str ); } 试题7Q?br> void Test( void ) { char *str = (char *) malloc( 100 ); strcpy( str, "hello" ); free( str ); ... //省略的其它语?br>} 解答Q?br> 试题4传入中GetMemory( char *p )函数的Ş参ؓ(f)字符串指针,在函数内部修改Ş参ƈ不能真正的改变传入Ş参的|执行?br> char *str = NULL; GetMemory( str ); 后的str仍然为NULLQ?br> 试题5?br> char p[] = "hello world"; return p; 的p[]数组为函数内的局部自动变量,在函数返回后Q内存已l被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期?br> 试题6的GetMemory避免了试?的问题,传入GetMemory的参Cؓ(f)字符串指针的指针Q但是在GetMemory中执行申请内存及(qing)赋D? tiffany
bracelets *p = (char *) malloc( num ); 后未判断内存是否甌成功Q应加上Q?br> if ( *p == NULL ) { ...//q行甌内存p|处理 } 试题7存在与试?同样的问题,在执?br> char *str = (char *) malloc(100); 后未q行内存是否甌成功的判断;另外Q在free(str)后未|str为空Q导致可能变成一?#8220;?#8221;指针Q应加上Q?br> str = NULL; 试题6的Test函数中也未对malloc的内存进行释放?br> 剖析Q?br> 试题4?考查面试者对内存操作的理解程度,基本功扎实的面试者一般都能正的回答其中50~60的错误。但是要完全解答正确Q却也绝非易事?br> 对内存操作的考查主要集中在:(x) Q?Q指针的理解Q?br> Q?Q变量的生存期及(qing)作用范围Q?br> Q?Q良好的动态内存申请和释放?fn)惯?br> 再看看下面的一D늨序有什么错误:(x) swap( int* p1,int* p2 ) { int *p; *p = *p1; *p1 = *p2; *p2 = *p; } 在swap函数中,p是一?#8220;?#8221;指针Q有可能指向pȝ区,DE序q行的崩溃。在VC++中DEBUGq行时提C错?#8220;Access Violation”。该E序应该改ؓ(f)Q?br> swap( int* p1,int* p2 ) { int p; p = *p1; *p1 = *p2; *p2 = p; } ]]> C++ 心得 http://www.shnenglu.com/love4c/archive/2008/01/11/40964.htmllovetiffany lovetiffany Fri, 11 Jan 2008 08:05:00 GMT http://www.shnenglu.com/love4c/archive/2008/01/11/40964.html http://www.shnenglu.com/love4c/comments/40964.html http://www.shnenglu.com/love4c/archive/2008/01/11/40964.html#Feedback 8 http://www.shnenglu.com/love4c/comments/commentRss/40964.html http://www.shnenglu.com/love4c/services/trackbacks/40964.html 我们现在~写一个程序越来越Ҏ(gu)了。利用一些Y件开发工P往往只要通过鼠标的拖拖点点,计算机就?x)自动帮你生成许多代码。但在很多时候,计算机的q种能力被滥用了Q我们往往只考虑把这个程序搭hQ而不去考虑E序的性能如何Q程序是否够的健壮。而此节课的目的主要是介绍一些编码的l验Q让大家~写的程序更加健壮和高性能?
在C++~程中应该尽量用const和inline来代?defineQ尽量做到能不用#define׃用?define常见的用途有“定义帔R”以及(qing)“定义?#8221;Q但其中存在诸多的弊病? W一Q查错不直观Q不利于调试。Define的定义是由预处理E序处理的,作的是完全的文本替换Q不做Q何的cd(g)查。在~译器处理阶D,define定义的东西已l被完全替换了,q样在debug的时候就看不CQ何的相关信息Q即跟踪时不能step into宏。例如,把ASPECT_RATIO用define定义?.653Q编译器q不到ASPECT_RATIOq个名字了。如果编译器?.653错,那么无从知道此1.653来自于何处。在真正~码的时候应该用如下的语句来定义:(x)
static const double ASPECT_RATIO = 1.653;
W二Q没有Q何类型信息,不是type safe。因为它是文本别的替换Q这样不利于E序的维护?br> W三Qdefine的用很Ҏ(gu)造成污染。比如,如果有两个头文g都定义了ASPECT_RATIO, 而一个CPP文g又同时包含了q两个头文gQ那么就?x)造成冲突。更难查的是另外一U错误,比如有如下的代码Q?br>
// in header file def.h #define Apple 1 #define Orange 2 #define Pineapple 3 … // in some cpp file that includes the def.h enum Colors {White, Black, Purple, Orange};
?h文g中Orange被定义成水果的一U,而在.cpp文g中Orange又成Z一U颜Ԍ那么~译器就?x)把此处的Orange替换?Q编译可能仍然可以通过Q程序也能够q行Q但是这成了一个bugQ表现出古怪的错误Q且很难查错。再比如定义了一个求a与b哪个数大的宏Q?define max(a,b) ((a) > (b) ? (a) : (b))
int a = 5, b = 0; max(++ a, b); max(++ a, b + 10);
190-823 117-202 在上面的操作中,max(++ a, b); 语句中a?+了两ơ,而max(++ a, b + 10); 语句中a只加了一ơ,q样在程序处理中很有可能成Z个bugQ且此bug也非常的难找。在实际~码时可以用如下的语句来做Q?br>
template<class T> inline const T& max(const T& a, const T& b) { return a > b ? a : b; }
2、Prefer C++-style casts 在程序中l常?x)需要把一U类型{换成另外一U类型,在C++中应该用static_cast、const_cast、dynamic_cast、reinterpret_cast关键字来做类型{换。因有以下好处,一是其本n是一U注释,在代码中看到上面q些关键字就可马上知道此处是q行cd转换。二是C语言中类型{换通常是很难进行搜索的Q而通过关键字cast则可以很Ҏ(gu)的找到程序中出现cd转换的地方了?br> 3、Distinguish between prefix and postfix forms of increment and decrement operators 通常对于操作pȝ或编译器自n支持的类型,prefixQ前~Q如++iQ与postfixQ后~Q如i++Q的效果是一L(fng)。因为现在的~译器都很聪明,它会(x)自动做优化,q两者的汇编代码是一L(fng)Q性能不会(x)有差别。但有时候也?x)有不同的,如一些重载了操作W的cd。下面是模拟prefix与postfix的操作过E,可以发现在postfix操作中会(x)生成一个(f)时变量,而这一临时变量是会(x)占用额外的时间和开销的?br>
// prefix form: increment and fetch UPInt& UPInt::operator++() { *this += 1; // increment return *this; // fetch } // postfix form: fetch and increment const UPInt UPInt::operator++(int) { UPInt oldValue = *this; // fetch ++(*this); // increment return oldValue; // return what was fetched }
一般情况下不需要区分是?+Q还是后++Q但是我们在~写E序的时候最好能?fn)惯性的其写成++i的Ş式,如在使用STL中的iteratorӞprefix与postfix?x)有相当大的性能差异。请不要看q些l节Q实际在~写E序的时候,若不注意具体l节Q你?x)发现程序的性能?x)非常的低。但要注意,虽然在大多数情况下可以用prefix来代替postfixQ但有一U情况例外,那就是有[]操作W时Q比如gzArray [++index] 是不{于 gzArray[index++]的?br>
4、Minimizing Compile-time Dependencies 有些人在~写E序Ӟ往往喜欢一?h文g包含到另一?h文gQ而实践证明在做大型Y件时q是一个非怸好的?fn)惯Q因q样?x)造成很多依赖的问题,包含较多?h文gQ别人又使用了这个classQ而在他的那个工程中可能ƈ不存在这?h文gQ这样很可能q译不能通过。而且q样做,q可能造成很难LC个模块的情况。因Z?h文g被很多模块包含的话,如果修改了此.h文gQ在~译pȝ的时候,~译器会(x)d扑֓些模块依赖于某个被修改过?h文gQ那么就D了所有包含入?h文g的模块全都要q行重新~译。在目比较?yu)的时候,大家可能q感觉不到差别,但是如果说是在大型的软gpȝ里,你可能编译一遍源码需要七、八个小时。如果你q个.h文g被很多模块包含的话,q?h文g中加了一行注释,在编译时~译器检查哪些文件被改动Q那么所有包含入?h文g的模块都?x)被重新~译Q造成巨大的时间和_֊负担。对于此问题Q解决的Ҏ(gu)是?h文g自包含,也就是说让它包含量的东西。所谓尽量少是指如删掉Q何一个它包含q来?h文gQ都无法正常进行工作。其实在很多情况下,q不需要一?h文gd含另一?h文gQ完全可以通过class声明来解决依赖关pȝq种问题。再来看下面q个例子Q?a >1Z0-043
#include "a.h" // class A #include "b.h" // class B #include "c.h" // class C #include "d.h" // class D #include "e.h" // class E class X : public A, private B { public: E SomeFunctionCall(E someParameter); private: D m_dInstance; };
当类X从类A和类B中派生时Q需要知道X在内存中都有哪些dataQ通常在内存中前面是基cȝdataQ后面紧跟的是此zc自w定义的dataQ因此就必须知道cA与类B的内部细节,要不然编译器无法来安排内存了。但是在处理参数以及(qing)参数q回值的时候,实际上ƈ不需要知道这些信息,在此处定义的SomeFunctionCall()只需知道E是个classp够了Qƈ不需要知道类E中的data如长度等的具体细节。上面的代码应该改写成如下的形式Q以减少依赖关系Q?br>
#include "a.h" // class A #include "b.h" // class B #include "c.h" // class C #include "d.h" // class D class E; class X : public A, private B { public: E SomeFunctionCall(E someParameter); private: D m_dInstance; };
5、Never treat arrays polymorphically 不要把数l和多态一起用,L(fng)下面的例子?br>
class BST { ... }; class BalancedBST: public BST { ... }; void printBSTArray(ostream& s, const BST array[], int numElements) { for (int i = 0; i < numElements; ++i) { s << array[i]; // this assumes an operator<< is defined for BST } } BalancedBST bBSTArray[10]; printBSTArray(cout, bBSTArray, 10);
数组在内存中是一个连l的内存I间Q而在数组中应该如何来定位一个元素呢Q过E是q样的,~译器可以知道每个数据类型的长度大小Q如果数l的index?Q则?x)自动去取第一个元素;如果是指定了某个indexQ编译器则会(x)Ҏ(gu)此index与该数据cd的长度自动去出该元素的位置?br> 在printBSTArray()函数中,管传入的参数是BalancedBSTcdQ但׃其本来定义的cd是BSTQ那么它依然?x)根据BST来计类型的长度。而通常zcd例所占的内存要比基类实例所占的内存大一些,因此该程序在~译时会(x)报错。请CQ永q不要把数组和C++的多态性放在一起用?br> 6、Prevent exceptions from leaving destructors 析构函数中一定不要抛出异常。通常有两U情况会(x)D析构函数的调用,一U是当该cȝ对象d了它的域Q或delete表达式中一个该cd象的指针Q另一U是׃异常而引h构函数的调用?br> 如果析构函数被调用是׃exception引vQ而此时在析构函数中又抛出了异常,E序?x)立卌pȝl止Q甚至都来不?qing)进行内存释放。因此如果在析构函数中抛出异常的话,很Ҏ(gu)h引v异常的原因,且这L(fng)软g也会(x)让用户非常恼火。由于析构函C很可能会(x)调用其它的一些函敎ͼ所以在写析构函数的时候一定要注意Q对q些函数是否?x)抛出异常要非常清楚Q如果会(x)的话Q就一定要心了。比如下面这D代码:(x)
Session::~Session() { logDestruction(this); }
比如logDestruction()函数可能?x)抛出异常,那么我们应该采用下面这U代码的形式Q?
Session::~Session() { try { logDestruction(this); } catch (...) { } }
q样E序出错的时候不?x)被立即xQ可以给用户一些其它的选择Q至先让他把目前在做的工作保存下来?br> 7、Optimization:Remember the 80-20 rule 在Y件界有一?0-80法则Q其实这是一个很有趣的现象,比如一个程序中20%的代码用了该程序所占资源的80%Q一个程序中20%的代码占用了总运行时间的80%Q一个程序中20%的代码用了该程序所占内存的80%Q在20%的代码上面需要花?0%的维护力量,{等。这个规律还可以被l推q下去,不过q个规律无法被证明,它是Z在实践中观察得出的结果。从q个规律出发Q我们在做程序优化的时候,有了针Ҏ(gu)。比如想提高代码的运行速度Q根据这个规律可以知道其?0%的代码占用了80%的运行时_(d)因此我们只要扑ֈq?0%的代码,q进行相应的优化Q那么我们程序的q行速度可以有较大的提高。再如有一个函敎ͼ占用了程?0%的运行时_(d)如果把这个函数的执行速度提高10倍,那么对程序整体性能的提高,影响是非常巨大的。如果有一个函数运行时间只占L间的1%Q那q把这个函数的q行速度提高1000倍,对程序整体性能的提高也是媄(jing)响不大的。所以我们的基本思想是扑ֈ占用q行旉最大的那个函数Q然后去优化它,哪怕只是改q了一点点Q程序的整体性能也可以被提高很多?br> 要想扑և?0%的代码,我们的方法就是用ProfilerQ它实际上是一些公司所开发的工具Q可以检查程序中各个模块所分配内存的用情况,以及(qing)每个函数所q行的时间等。常见的Profiler有Intel公司开发的VTuneQ微软公司开发的Visual Studio profilerQDevPartner from Compuware{?/p>
]]> C++cd设计的基本思想和方?/title> http://www.shnenglu.com/love4c/archive/2008/01/11/40963.htmllovetiffany lovetiffany Fri, 11 Jan 2008 07:53:00 GMT http://www.shnenglu.com/love4c/archive/2008/01/11/40963.html http://www.shnenglu.com/love4c/comments/40963.html http://www.shnenglu.com/love4c/archive/2008/01/11/40963.html#Feedback 29 http://www.shnenglu.com/love4c/comments/commentRss/40963.html http://www.shnenglu.com/love4c/services/trackbacks/40963.html 首先说指导思想。这是一个h(hun)D问题Q我们在此提Z条标准:(x)单,高性能Q可UL?/span>
我们在开就对简单性目标作了叙qͼq里再稍微展开讨论一下。我们提出的单标准,首先是外部接口简单,其次是内部结构简单。我们知道,cd是提供给上层应用E序使用的,也就是按照一定的接口规范Q向上层提供一定的功能服务。接口设计得简单,对上层用h说就方便,p不容易?/span>Bug 。我们可以注意到Q流行的成功cd都是拥有单接口的。ؓ(f)了接口单,常常不得不把有关具体实现的复杂性封装于cd内部Q也是_(d)关于单性的设计原则Q外部接口简单优先于内部实现单?/span>
高性能?/span>C++ 语言优于其它 OO 语言的一个特性?/span>C++ 的高性能应该首先归于它运行模式,和大多数 OO 语言不同Q?/span>C++ E序~译后直接生本地^C码( Native Code Q,理论上具备了可能的最大执行性能。另外的一个原因是L?/span>C++ ~译器都被设计得非常_yQ具有优的代码优化能力。对?/span>C++ cd设计者来_(d)保持 C++ 的高性能是一个重要目标。程序的高性能可以从两斚w来评P一是时间性能Q以量短的旉来解军_量多的业务;二是资源性能Q以量的资源消耗,包括 CPU 使用、内存占用、网l流量、磁盘空间等{,来维持正常的E序功能。提高性能的主要手D|数据l构、算法和E序体现l构的优化设?a >000-861 117-102 ?/span>
再说可移植性?/span>C++ 的编译后输出代码是本地^C码,因此 C++ 本n不具有目标代码可UL性, C++ 的可UL性只能是源代码可UL性。源代码的可UL性是指,同一软g产品的全部或者部分源代码可以在不同的~译环境中进行编译(不需要编译的除外Q,q且其结果具有相同的品质Ҏ(gu)(依优先顺序包括功能性、可靠性、可用性、性能性、可l护性等Q。编译环境可以大致分Z个层ơ,最底层的是操作pȝQ也是q_Q?/span>Platform Q,其次是对源代码直接进行处理的~译器,然后是其它在~译q程中必需的中间g物品Q如库文件等。我们知?/span>C++ 虽然在语a规范上获得了l一Q?/span>ISO/IEC Q,其编译器却是雄割据的局面,h代表性的?/span>Borland C++ pdQ已lE出市场)Q?/span>Microsoft ?/span>Visual Studio pd?/span>C++ ~译器和 GNU 阵营的压轴?/span>gc 中的 g++ 。源代码l编译环境处理后产生的可执行代码的执行^台称为目标^収ͼ不同的编译器的目标^C不同Q有的支持多q_Q如 g++ Q有的是单一q_Q如 Visual C++ 。对于类库设计者来_(d)惌获得完全的可UL性是非常困难的(除非是象 STL q样被纳入语a规范的类库,因ؓ(f)不支?/span>STL 是不支持标准的 C++ 。即便如此不同的~译环境q是存在不同?/span>STL 实现版本Q造成“一个类库多个实?#8221;的局面)Q我们只能有选择地支持一部分环境。我们在开就已经说明Q我们选择 g++ ?/span>Visual C++ ~译器,选择 Linux ?/span>Windows 32 位目标^台?/span>
接下来我们来讨论 C++ cd设计的方法论?/span>
首先Q我们采用仅用头文g的类库设计方式( Header -only Q?/span>STL 的大多数实现版本都是采用 Header-only 的方式)Q也是在头文gQ?/span>.h Q中声明和定义类Q将其成员函数全部定义ؓ(f)内联函数Q而不使用源程序文Ӟ .cpp Q?/span>
我们知道?/span>C 语言的开发环境中Q所谓库文g包含两个部分Q头文g部分和二q制文g部分。根据二q制文g和用L(fng)标文件结合方式的不同Q又可分为静态链接文件和动态链接文件。这U库的构成模式已成ؓ(f)事实上的 C 语言开发环境的标准Q绝大多数^台、绝大多数编译器都用这U模?117-301 190-721 ?/span>
然?/span>C++ 语言开发环境,q种库构成模式遭遇到一个重大问题,是W号命名问题。D例来_(d) C++ 允许多个函数可以被重?/span>(Overload) Q可以具有相同的名称Q而通过参数列表不同被予以区别。这样就带来一个问题,~译完成的目标代码中怎样来区别这些在源代码中h相同名称的函敎ͼ常见的做法是在编译器输出的函数的W号名称中加入描q类型信息的字符Ԍq种Ҏ(gu)通常被称为名U装饎ͼ Name decoration Q或者名U糟化( Name mangling Q这个术语真不好译Q笔者的感觉是发明这个词的h觉得~译器把本来单干净的符L(fng)搞ؕ了)。比如说Q?/span>g++3.4.4 对于函数 void func(int), 其编译输出符号名UCؓ(f) _Z1funci Q对于函?/span>void func(int, int) Q其输出W号名称?/span>_Z1funcii Q等{。但是,q种名称装饰规则没有l一规范Q也是说不同的~译器有各自不同的名U装饰规则,q样导致不同的 C++ ~译器只能识别自q输出文gQ而没有办法处理其他编译器的输出文件。因此,如果?/span>C++ E序制作成二q制的库文gQ则其能够支持的开发环境只能限于原始的开发环境,基本上不h多种开发环境间的通用性?/span>
一个解军_法是库文g保持在源代码形态(包括头文件和源文ӞQ而不~译成二q制文g。比?/span>STL 的许多实现版本都是以头文件Ş式存在。这栯然解决了名称装饰所带来的不可移植问题,但同时又?x)带来代码编译时间增长,源代码完全公开{问题。在 C++ 的名U装饰规则未被统一之前Q看hq个问题是很难两全其地解决了?/span>
在本pd中,我们也仿?/span>g++ ?/span>STL 实现方式Q完全以头文件Ş式来~写cd。ؓ(f)什么不把代码放到源文g中去呢?主要原因是,头文件只需要用户用包含指令( #include Q就可以处理了,而源文g则需要配|到用户工程的编译目标列表中Q和用户的源E序形成共同~译的Ş式,破坏了用户工E的~译目标的封闭性,比较ȝ(ch)而且不符合Y件开发的一般习(fn)惯?/span>
其次我们来讨论如何支持多q_。我们已l说q在本系列中我们的线E库支持 Linux q_?/span>Posix U程?/span>Windows 32 位^台的U程模式。我们可以参?/span>C++ ?/span>Pimpl “惯语” (Pimpl idiom Q在 Herb Sutter 的?/span>Exceptional C++ 》中有介l?/span>) Q采?/span>2 层类构造方式。上ơ类亦即接口c,为用h供统一的类接口Q在用户看来h唯一的类行ؓ(f)定义Q下层类亦即实现c,接口类的行为定义{化ؓ(f)某个q_的具体实现?/span>
]]>C++中extern “C”含义深层探? http://www.shnenglu.com/love4c/archive/2008/01/03/40301.htmllovetiffany lovetiffany Thu, 03 Jan 2008 03:10:00 GMT http://www.shnenglu.com/love4c/archive/2008/01/03/40301.html http://www.shnenglu.com/love4c/comments/40301.html http://www.shnenglu.com/love4c/archive/2008/01/03/40301.html#Feedback 1 http://www.shnenglu.com/love4c/comments/commentRss/40301.html http://www.shnenglu.com/love4c/services/trackbacks/40301.html C++语言的创建初h“a better
C”Q但是这q不意味着C++中类似C语言的全局变量和函数所采用的编译和q接方式与C语言完全相同。作ZU欲与C兼容的语aQC++保留了一部分q程式语a的特点(被世人称?#8220;不彻底地面向对象”Q,因而它可以定义不属于Q何类的全局变量和函数。但是,C++毕竟是一U面向对象的E序设计语言Qؓ(f)了支持函数的重蝲QC++对全局函数的处理方式与C有明昄不同?
2.从标准头文g说v 某企业曾l给出如下的一道面试题Q?br> 面试?br> Z么标准头文g都有cM以下的结构?
#ifndef __INCvxWorksh #define __INCvxWorksh #ifdef
__cplusplus extern "C" { #endif /*...*/ #ifdef
__cplusplus } #endif #endif /* __INCvxWorksh
*/
分析 昄Q头文g中的~译?#8220;#ifndef __INCvxWorksh?define
__INCvxWorksh?endif” 的作用是防止该头文g被重复引用?br> 那么
#ifdef __cplusplus extern "C" { #endif #ifdef
__cplusplus } #endif
的作用又是什么呢Q我们将在下文一一道来?br> 3.深层揭密extern
"C" extern "C"
包含双重含义Q从字面上即可得刎ͼ(x)首先Q被它修饰的目标?#8220;extern”的;其次Q被它修饰的目标?#8220;C”的。让我们来详l解读这两重含义?br> 被extern
"C"限定的函数或变量是externcd的; extern是C/C++语言中表明函数和全局变量作用范围Q可见性)的关键字Q该关键字告诉编译器Q其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句Q?br>
extern int
a;
仅仅是一个变量的声明Q其q不是在定义变量aQƈ未ؓ(f)a分配内存I间。变量a在所有模块中作ؓ(f)一U全局变量只能被定义一ơ,否则?x)出现连接错误?br> 通常Q在模块的头文g中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块BƲ引用该模块A中定义的全局变量和函数时只需包含模块A的头文g卛_。这P模块B中调用模块A中的函数Ӟ在编译阶D,模块B虽然找不到该函数Q但是ƈ不会(x)报错Q它?x)在q接阶段中从模块A~译生成的目标代码中扑ֈ此函数?br> 与extern对应的关键字是staticQ被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块用时Q其不可能被extern
“C”修饰?br> 被extern "C"修饰的变量和函数是按照C语言方式~译和连接的Q?br> 未加extern
“C”声明时的~译方式 首先看看C++中对cMC的函数是怎样~译的?br> 作ؓ(f)一U面向对象的语言QC++支持函数重蝲Q而过E式语言C则不支持。函数被C++~译后在W号库中的名字与C语言的不同。例如,假设某个函数的原型ؓ(f)Q?
void foo( int x, int y
);
该函数被C~译器编译后在符号库中的名字为_fooQ而C++~译器则?x)生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机Ӟ生成的新名字UCؓ(f)“mangled
name”Q?br> _foo_int_intq样的名字包含了函数名、函数参数数量及(qing)cd信息QC++是靠这U机制来实现函数重蝲的。例如,在C++中,函数void
foo( int x, int y )与void foo( int x, float y
)~译生成的符h不相同的Q后者ؓ(f)_foo_int_float?br> 同样圎ͼC++中的变量除支持局部变量外Q还支持cL员变量和全局变量。用h~写E序的类成员变量可能与全局变量同名Q我们以"."来区分。而本质上Q编译器在进行编译时Q与函数的处理相|也ؓ(f)cM的变量取了一个独一无二的名字,q个名字与用L(fng)序中同名的全局变量名字不同?br> 未加extern
"C"声明时的q接方式 假设在C++中,模块A的头文g如下Q?br>
// 模块A头文件 moduleA.h #ifndef MODULE_A_H #define MODULE_A_H int foo(
int x, int y ); #endif
在模块B中引用该函数Q?/p>
// 模块B实现文g moduleB.cpp #include "moduleA.h" foo(2,3);
实际上,在连接阶D,q接器会(x)从模块A生成的目标文件moduleA.obj中寻找_foo_int_intq样的符P 加extern
"C"声明后的~译和连接方?/strong> 加extern "C"声明后,模块A的头文g变ؓ(f)Q?br>
// 模块A头文件 moduleA.h #ifndef MODULE_A_H #define MODULE_A_H extern "C"
int foo( int x, int y ); #endif
在模块B的实现文件中仍然调用foo( 2,3
)Q其l果是:(x) Q?Q模块A~译生成foo的目标代码时Q没有对其名字进行特D处理,采用了C语言的方式; Q?Q连接器在ؓ(f)模块B的目标代码寻找foo(2,3)调用ӞL的是未经修改的符号名_foo?br> 如果在模块A中函数声明了foo为extern
"C"cdQ而模块B中包含的是extern int foo( int x, int y )
Q则模块B找不到模块A中的函数Q反之亦然?br> 所以,可以用一句话概括extern
“C”q个声明的真实目的(M语言中的M语法Ҏ(gu)的诞生都不是随意而ؓ(f)的,来源于真实世界的需求驱动。我们在思考问题时Q不能只停留在这个语a是怎么做的Q还要问一问它Z么要q么做,动机是什么,q样我们可以更深入地理解许多问题Q:(x) 实现C++与C?qing)其它语a的合编E?br> 明白了C++中extern
"C"的设立动机,我们下面来具体分析extern "C"通常的用技巧?br> 4.extern
"C"的惯用法 Q?Q在C++中引用C语言中的函数和变量,在包含C语言头文Ӟ假设为cExample.hQ时Q需q行下列处理Q?br>
extern "C" { #include "cExample.h" }
而在C语言的头文g中,对其外部函数只能指定为externcdQC语言中不支持extern "C"声明Q在.c文g中包含了extern
"C"时会(x)出现~译语法错误?br> W者编写的C++引用C函数例子工程中包含的三个文g的源代码如下Q?br>
/* c语言头文Ӟ(x)cExample.h */ #ifndef C_EXAMPLE_H #define
C_EXAMPLE_H extern int add(int x,int y); #endif /* c语言实现文gQcExample.c
*/ #include "cExample.h" int add( int x, int y ) { return x +
y; } // c++实现文gQ调用addQcppFile.cpp extern "C" { #include
"cExample.h" } int main(int argc, char* argv[]) { add(2,3);
return 0; }
如果C++调用一个C语言~写?DLLӞ当包?DLL的头文g或声明接口函数时Q应加extern "C"
{ }?br> Q?Q在C中引用C++语言中的函数和变量时QC++的头文g需dextern "C"Q但是在C语言中不能直接引用声明了extern
"C"的该头文Ӟ应该仅将C文g中将C++中定义的extern
"C"函数声明为externcd?br> W者编写的C引用C++函数例子工程中包含的三个文g的源代码如下Q?a >70-210 1Y0-327
//C++头文?cppExample.h #ifndef CPP_EXAMPLE_H #define
CPP_EXAMPLE_H extern "C" int add( int x, int y ); #endif //C++实现文g
cppExample.cpp #include "cppExample.h" int add( int x, int y
) { return x + y; } /* C实现文g cFile.c /* q样?x)编译出错?x)#include
"cExample.h" */ extern int add( int x, int y ); int main( int argc, char*
argv[] ) { add( 2, 3 ); return 0; }
如果深入理解了第3节中所阐述的extern
"C"在编译和q接阶段发挥的作用,p真正理解本节所阐述的从C++引用C函数和C引用C++函数的惯用法。对W?节给出的CZ代码Q需要特别留意各个细节?/p>
]]>lC(j)++初学者的50个忠? http://www.shnenglu.com/love4c/archive/2008/01/03/40300.htmllovetiffany lovetiffany Thu, 03 Jan 2008 03:08:00 GMT http://www.shnenglu.com/love4c/archive/2008/01/03/40300.html http://www.shnenglu.com/love4c/comments/40300.html http://www.shnenglu.com/love4c/archive/2008/01/03/40300.html#Feedback 5 http://www.shnenglu.com/love4c/comments/commentRss/40300.html http://www.shnenglu.com/love4c/services/trackbacks/40300.html 1.把C++当成一门新的语a学习(fn)Q和C没啥关系Q真的。)Q? 2.看《Thinking In
C++》,不要看《C++变成ȝ》; 3.看《The C++ Programming Language》和《Inside The C++
Object Model?不要因ؓ(f)他们很难而我们自己是初学者所以就不看Q?
4.不要被VC、BCB、BC、MC、TC{词汇所qh——他们都是集成开发环境,而我们要学的是一门语aQ?
5.不要放过M一个看上去很简单的编E问题——他们往往q不那么单,或者可以引伸出很多知识点; 6.?x)用Visual
C++Qƈ不说明你?x)C++Q? 7.学classq不难,template、STL、generic
programming也不q如此——难的是长期坚持实践和不遗余力的博览书Q?
8.如果不是天才的话Q想学编E就不要想玩游戏——你以ؓ(f)你做CQ其实你的C++水^q没有和你通关的能力一起变高——其实可以时刻记住:(x)学C++是ؓ(f)了编游戏的;
9.看Visual C++的书Q是学不了C++语言的; 10.躁的hҎ(gu)_(d)(x)XX语言不行了,应该学YYQ——是你自׃行了吧!Q?
11.躁的hҎ(gu)问:(x)我到底该学什么;——别问,学就对了Q? 12.躁的hҎ(gu)问:(x)XX有钱途吗Q——徏议你L银行Q?
13.躁的hҎ(gu)_(d)(x)我要中文版!我英文不行!——不行?学呀Q?
14.躁的hҎ(gu)问:(x)XX和YY哪个好;——告诉你吧,都好——只要你学就行;
15.躁的h分两U:(x)a)只观望而不学的人;b)只学而不坚持的hQ? 16.把时髦的技术挂在嘴边,q不如把q时的技术记在心里;
17.C++不仅仅是支持面向对象的程序设计语aQ? 18.学习(fn)~程最好的Ҏ(gu)之一是阅读源代码;
19.在Q何时刻都不要认ؓ(f)自己手中的书已经_了; 20.请阅诅RThe Standard C++
Bible?中文版:(x)标准C++宝典)Q掌握C++标准Q? 21.看得懂的书,请仔l看Q看不懂的书Q请着头皮看;
22.别指望看W一遍书pC和掌握什么——请看第二遍、第三遍Q? 23.L(fng)《Effective C++》和《More
Effective C++》以?qing)《Exceptional C++》;
24.不要停留在集成开发环境的摇篮上,要学?x)控刉成开发环境,q要学会(x)用命令行方式处理E序Q?
25.和别Z赯论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;
26.L(fng)《程序设计实c(din),q严格的按照其要求去做;
27.不要因ؓ(f)C和C++中有一些语法和关键字看上去相同Q就认ؓ(f)它们的意义和作用完全一P
28.C++l不是所谓的C?#8220;扩充”——如果C++一开始就起名叫Z语言Q你一定不?x)把C和Z语言联系得那么紧?117-102 117-301 Q?
29.请不要认为学qXX语言再改学C++?x)有什么问题——你只不q又在学一门全新的语言而已Q? 30.d了《Inside The C++
Object Model》以后再来认定自己是不是已经学会(x)了C++Q? 31.学习(fn)~程的秘诀是:(x)~程Q编E,再编E;
32.L(fng)意下列书c:(x)《C++面向对象高效~程QC++ Effective Object-Oriented Software
ConstructionQ》《面向对象Y件构?Object-Oriented Software Construction)》《设计模式(Design
PatternsQ》《The Art of Computer Programming》; 33.CQ面向对象技术不只是C++专有的;
34.h书上的程序例子亲手输入到?sh)脑上实践,即配套光盘中有源代码? 35.把在书中看到的有意义的例子扩充;
36.请重视C++中的异常处理技术,q将其切实的q用到自qE序中;
37.l常回顾自己以前写过的程序,q尝试重写,把自己学到的新知识运用进去;
38.不要漏掉书中M一个练?fn)题——请全部做完q记录下解题思\Q? 39.C++语言和C++的集成开发环境要同时学习(fn)和掌握;
40.既然军_了学C++,p坚持学下去,因ؓ(f)学习(fn)E序设计语言的目的是掌握E序设计技术,而程序设计技术是跨语a的;
41.pC++语言的各U^台和开发环境去Ȁ烈的竞争吧,我们要以学习(fn)C++语言本nZQ?
42.当你写C(j)++E序写到一半却发现自己用的Ҏ(gu)很拙劣时Q请不要马上停手Q请快余下的部分_略的完成以保证q个设计的完整性,然后分析自己的错误ƈ重新设计和编写(参见43Q;
43.别心急,设计C++的class实不容易;自己E序中的class和自qclass设计水^是在不断的编E实践中完善和发展的Q?
44.决不要因为程?#8220;很小”׃遵@某些你不熟练的规则——好?fn)惯是培d来的Q而不是一ơ记住的Q?
45.每学C个C++隄的时候,试着对别解这个知识点q让他理解——你能讲清楚才说明你真的理解了;
46.记录下在和别Z时发现的自己忽视或不理解的知识点;
47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号?x)变成Version 100.XXQ?
48.保存好你写过的所有的E序——那是你最好的U篏之一Q? 49.请不要做躁的hQ? 50.L(fng)爱C++!
]]> 我的Visual C++之\ http://www.shnenglu.com/love4c/archive/2008/01/03/40299.htmllovetiffany lovetiffany Thu, 03 Jan 2008 03:06:00 GMT http://www.shnenglu.com/love4c/archive/2008/01/03/40299.html http://www.shnenglu.com/love4c/comments/40299.html http://www.shnenglu.com/love4c/archive/2008/01/03/40299.html#Feedback 0 http://www.shnenglu.com/love4c/comments/commentRss/40299.html http://www.shnenglu.com/love4c/services/trackbacks/40299.html 一.C ++ 语言的基 说v入门慢,W一个原因莫q于语言基础了.高中时期学校l织的微机兴小l学?fn)的是PASCAL语言Q我也不知道Z么要讲这个语aQ如果说是ؓ(f)了应付比赛,当时也有C语言l呀Q,所以在大学转向Windows~程的时候,我首先选择了DelphiQ大三的时候学校要求考国家二U,二没有 DelphiQ于是又转向了VBQ原因是VB做v来与Delphi很像。后来发现VB的IDE做的比Delphi好用Q而且BASIC语言写v来简单,于是便弃Delphi而去Q明gh恐怕又要骂我了Q若不是太懒Q怎么?x)喜ƢVB的IDE呢?的确是这P后文?x)提刎ͼ懒不仅仅是学习(fn)VC的大敌,而且懒h是什么都学不好的Q。长q与VB打交道,让我对C / C ++ 语言很不?fn)惯——我不喜ƢC ++ 写一个句语要打一个分P我不喜欢大小写字母要严格区分Q我不喜Ƣ比较的时候要写两个等P我不喜欢……MQ对C ++ 很没好感Q没好感也就没兴学了(后面提到兴趣是相当重要的Q。当然如果你现在再问我应该学?fn)什么语aQ我?x)毫不犹豫地向你推荐C ++ Q因为就常用语言而言QC ++ 语言中包含的知识是相当全面的——从面向q程Q到Z对象 / 面向对象Q再到模板和范型Q可以说是应有尽有,不夸张地_(d)别的语言在某U程度上而言是C ++ 语言的子集或者说是在模仿C ++ 、向C ++ 靠拢?br> 在数ơ失败中Q给我很明显的感觉就是,不学好C ++ 语言学?fn)Visual C ++ Ua(b)是一U自虐。这ơ入门之前,我花?个多月的旉pȝ地学?fn)了C ++ 语言Q够意思吧。然后我信心实地敲响Visual C ++ 的家门,呵呵Q这ơ她l于肯给面子了。D个例子吧Q在看Dll的调用时Q用?#8220;函数指针”Q顺理成章就看下MQ想一惛_果没有C ++ 语言的基Q基本是不可能的。所以说Q没学会(x)中文之前Q别看《红楼梦》,那不是《看图识字》。奉劝想从VB转向VC学习(fn)的朋友,如果你指望能像学?fn)VB一栯学习(fn)VC 边学?fn)C ++ 语言Q那你可错了?br> Z提醒C ++ 语言入门的朋友一点,应该xANSI / ISO C ++ Q也是标准C ++ 了,市面上C ++ 的书良莠不齐Q很多书?#8220;旧书换新?#8221;Q讲的仍然是非标准C ++ Q一定要选好。计机书很贵,大家不妨扄(sh)子版的来看,|上有很多,甚至《C ++ Primer》或者《C ++ 沉思录》这L(fng)好书也有热心朋友攑ֈ了网上。不q,我最喜欢的是《C ++ ~程金典》这本书Q不愧是教育大师写的书,用来学习(fn)很合适。至于编译器的选择Q如果条件允许就安装VS.NET2003吧,据说Visual C ++ 7 .1的编译器是目前对标准C ++ 支持的最好的~译器了?br> ?VC学习(fn)资料的选择 VC入门难有很多原因Q其中不容忽视的一个就是优U的VC学习(fn)资相对较?yu)。C ++ 语言较深QVisual C ++ 用v来复杂,再加上资料少——难上加难。资料少Qƈ不意味着没有Q怎样选择或者说挖掘是关键。暂把资料分为光盘、书c(包括?sh)子书)和文档(包括|上的)三类?br> 在选择资料斚wQ大家一定要摈弃中国人思想中的两大劣根性:(x) < 1 > 不劳而获 < 2 > 一夜暴富?br> “不劳而获”的思想?x)导致趋向于选择“讲课”cȝ资料Q比如多媒体光盘。结果是光盘定w往往很少但又要求内容面面俱到Q不然怎么卖出dQ,q就造成了知识的q诏性差而且讲的又飞快,M一遍一遍地听,不见成效又打M心,最后只能放弃。期待早日有内容丰富Q讲解精彩的光盘面市?br> “一夜暴?#8221;的思想?x)让你趋向于选择“速成”cL材。那L(fng)教材大多是骗人的——能写个弹出H口Hello一下WorldQ这p是?x)Visual C ++ 了?我们q是不要自欺Zh的好。至也要能q数据库、能使用Socket?#8230;…而这些知识怎么可能“速成”呢? 我有很多Visual C ++ 的学?fn)资料,但没有一本我是抱着一啃到底的Q因为没有哪本书十全十美Q我是交替着使用些资料,q样做的好处在于Q?br> Q?/span>1 Q知识的q诏性好Q蟩跃性小Q进阶坡度较?yu),读v来舒服。都说Visual C ++ 的学?fn)坡度比较陡Q那个陡坡是出现在由单纯的C ++ 语言学习(fn)转向Windows~程的时候,C ++ 语言本n的学?fn)ƈ没有那么困难?br> Q?/span>2 Q有U篏效应Q这本书讲的不精不透,另一本书?x)帮你补上,q本书你没留心,下本书总该长个心眼。还有就是一些小例子E序Q把MFC的类或者函数拆开来给你看Q目的非常明,效果也不错。每天学一点,不图快,图扎实。呵呵,跟VC?#8220;面向对象”Q当然要一天一Ҏ(gu)׃?br> Q?/span>3 QD一q三Q动手实c(din)如果多本书中都把它列ؓ(f)重点Q那׃定要熟记在心而且上机操作Q书上的例子一定要分析透彻Q不能有“差不?#8221;的思想——差多少多呢?E序q东东,错一个字母都不行呀。光看会(x)了还差远着呢,自己要能写,而且能对例子q行扩展才行?br> < 4 > 内容详实丰富Q这一点上Q首推MSDN啦,q有是在网上能扑ֈ的微软出的Visual C ++ 的丛书,希望译的?sh)子版,是wdl格式的。虽然MSDN是英文版Q但其中的英文ƈ不难——?zhn)可以相信我Q因为在下的英文水^是奇烂无比的?nbsp;MSDN有两U用法,一U是当字典用Q因为内容全Q一U是当消遣,没事了看一个类Q敲几行代码Q看到那个MFC的承图了吗Q挺好玩儿的Q感觉像逛街—?nbsp;而且东西不要钱,help yourself?br> 互联|上的资源是非常非常丰富的,千万不要错过Q好|站和下载站BB皆是。还有论坛、新ȝ、在UQQ?#8230;…你问我有哪些Q呵呵,q在天边q在眼前呀:) 三.内因与外因:(x)“三心二意”?#8220;高手朋友”你有吗? 啊哦Q我不是在开玩笑?#8220;三心”是指军_Q信心和耐心。决心来源于动机Q说来好W,我最初动机很单,大学时有个朋友,计算机系的,我总认为我比他聪明Q我的天~~~~Q,他会(x)VC我不?x),我就惌q他Q现在都毕业两年了,最初的动机早已l不在了Q而学?fn)却VC已经成了我的心愿——最关键的一Ҏ(gu)我的愿望是写自己的输入法Q而写输入法只能用Visual C ++ d玎ͼ所以我?x)有军_学好Visual C ++ 。至于信心,有两ơ失败完全是信心不造成的,促成q次成功的信心说hq挺传奇Q我d京玩儿,回家的火车上一姓n位老师看见我别着一个MCP的领章就q来跟我聊天Q得知他是一位有着十多qVC开发经验的E序员,敬意油然而生。聊天的q程中,赵老师l了我极大的鼓励和支持——我问他像我q种 Wood Head能不能在半年内入门VCQ他告诉我,一定能Q于是我坚定了自己的信心,现在刚好?个月Q如果n老师有机?x)看到这文章——我在这里谢谢?zhn)? Q花i?下RQ两个小时后我与奛_分手了,是被甩呀同志们!随后的一D|子里Q一直与VC怼……Q?nbsp; q要说说耐心Q如果?zhn)已经看到q里了,说明(zhn)很有耐心Q竟然能看到q里q没有拂袖而去Q,耐心与个人的风格有关Q没耐心的h多半是懒人,懒h什么都做不成,学习(fn)VC是不能懒,书懒得看Q问题懒得问Q英语懒得译……或者是有点挫折放弃,学好VC是没指望了。我不知道别人怎样Q反正我是没受挫,其实有两ơ离入门那么一点点了,我放弃了……学VC要越挫越勇,学VC要肯定执着,Gogogo! “二意”是指W一你要感觉学习(fn)VC?#8220;意?#8221;Q二是你要感觉学?fn)VC?#8220;意义”。有意思,是说你喜欢写程序,“三心”的源动力来源于你对程序设计的热爱Q不喜欢~程的h可能能学好VB但绝学不好VC。有意义Q就是说你要l自׃个理由:(x)自己都不能给自己一个交待的事情是做不长久的。前面说q,我是Z写自q输入法,解放中国人的双手Q这个理由够U洁够崇高,q有一个理由就是通过学习(fn)VC来砺l自己,成ؓ(f)一个真正的E序员。你可以有自q理由Q比如提高薪水或者取得认证云云,一定要有!q就像是l自q“报酬”Q没有报酬只凭激情做事是M事都做不长久的?br> 我小的成功Q有严重的原因是因ؓ(f)我有?#8220;高手朋友”——杨WQ他是个VC高手Q大家会(x)好奇地问Q他教你写什么呢Q是MFCq是ATL或者是COMQ呵呵,都不是,他从来没教我写过一行代码,但他Ҏ(gu)的每一ơ帮助都弥珍贵Q当我不知道从哪里查扄库资源的时候,他告诉我QMSDNQ当我不知道从哪里找到类的成员函数时Q他告诉我:(x)在页面的左下角有一个class member链接Q当我问他能不能完成XXXXӞ他说Q别白费力气?#8230;…在他的帮助下Q我走了很多弯路,q也正是高手朋友的可贵之处。在此,我要衷心地说一壎ͼ(x)谢谢Q?br> q不是每位学?fn)VC的朋友都有我q么好的q气Q如果你w边没有q样的朋友也不用着急吗Q我q位好朋友可是经常出没于CSDN的坛坛里Q明白了Q不q,提醒与我一L(fng)初学者:(x)一定要做一个会(x)问问题的人哦Q怎么做一个会(x)问题的h呢?概括一下就是:(x)目的明确Q言意赅Q核心代码,客气谦虚?br> ?VC入门随笔 本h写东西向来思A凌ؕ、颠三倒四。剩下好多东西不知道写到哪里Q没办法了,只好?#8220;随笔”咯?br> ……学习(fn)VC~程Q首先要竖立一?#8220;pȝ / 全局?#8221;。无论是VB、C#、DelphiQ写E序的时候只需要考虑E序本np了,换句话说是你不用考虑消息是如何映和传递的。而VC写程序就要多多少考虑到这些东ѝ打个比方:(x)以前用VB写程序,好像是在一座山上徏一个亭子,山是山,亭子是亭子,我只造亭子就是了Q而用VC写程序,q是q个亭子Q那么你应该意识刎ͼ亭子是山的亭子,是山的一部分而不是一个孤立的建筑?#8220;亭子”是E序Q?#8220;?#8221;是WindowspȝQ亭子的地基是山留给建筑?#8220;接口”Q也是API?#8230;… ……VC相对VB入门难,一上来不是像VB那样l个H体从头做vQ而且AppWizard要分好几步,每一步里q有一大堆不知所云的选项Q不{生成一个程序就已经晕头转向了。怎么办呢Q一句话Q从对话框程序入手,因ؓ(f)它最单,生成的类最,而且相对是与VB~程最“?#8221;的。在对话框程序里Q你可以充分l习(fn)dcd成员变量或者成员函数?#8230;…不过我有一点始l搞不明白,由易到难是对话框E序、单文档E序、多文档E序Q在AppWizard里微软ؓ(f)什么不按这个顺序排列,非要倒着来呢Q成心跟我们q些初学的做对!Q国骂省去)…… ……又是没大?#8230;…又是分?#8230;…又是一个等?#8230;…提醒VB转过来的E序员,别d我这么没记性哦Q?br> ……q是提醒那些学习(fn)了VB或者是VB.NET / C#的DDMMQMFC的类虽然是面向对象的Q但它没?#8220;属?#8221;q个概念圎ͼ不要指望有Me.TextBox1.Text = " Hello World! " q样的语法,C/C++是函数型的语aQ类已经?#8220;属?#8221;装成了成员变量Q那些私有的成员变量你看不到Q只能通过函数来更改——this ->myTextBox.SetWindowText( " Hello World! " );……190-823 117-202 1Z0-043 1z0-042
……晕,原来Win32E序和MFCE序不是一回事呀Q看看,q就是一本烂书带l我的,让我一直以为Win32E序是MFCE序Q直到拜诅R深入浅出MFC》时才恍然大(zhn))…… ……VC好还是VB好?Q拜托,别再问这U无聊的问题了)…… ……VC的确能做底层Q但不是最底层QVC的确功能强大Q但不是万能的——拿手术刀切西瓜或者用菜刀动手术都不对…… ……VC高手都是用记事本写程序的Q笑不笑׃……190-802 000-834 000-861
……VCE序员比VBE序员强Q呵呵,毛主席说q,武器不是战争胜利的决定因?#8230;… ……在快速开发工PRADQ中Q控件与后台代码是捆l在一L(fng)Q而MFC?#8220;控gc?#8221;不一P它的“资源”Q或者说是皮Q与“c?#8221;Q或者说是瓤Q是分开的,要通过ClassWizard把它?#8220;_?#8221;h…… ……如果说C++ 是一U程序设计语aQ那么Visual C ++ 中的C ++ 语言不如?#8220;Windows语言”更合适——Visual C ++ 是在编EWindowsQ用到的宏或者Windows数据cd和W(xu)indowsl构C胜数Q做好心理准备哦Q?#8230;… ……我的天,那么长的函数或者结构都要一个字母一个字母写呀Q呵呵,按一下Ctrl + J看看发生了什么?我就奇怪了Q几乎没看到有书上提醒我们的初学者要q样d。这可是着实吓跑了不少初学者呢Q(臛_我就被吓跑过Q。器利工善,我们要把IDE用熟哦,微Y送的好礼物可不能费…… ……很多书在d完对新话框类之后都写着要在d话框c里手动d对这个新cd文g的引用,何必呢?用添加成员变量的Ҏ(gu)dq个新对话框cȝ实例Q头文g自动引用Q一举两得。一句话Q尽量多用Class WizardQ能不手写的地方׃手写…… ?virtual BOOL LongWayToGo(void) { // 头一ơ写文章Q其中Bug肯定不了,大家一hDeBug?br> // ׃是入门文章Q如果有错误Q很可能影响初学者学?fn),恐误人子弟,有错必纠Q?br> // 希望大家多提宝贵意见Q帮助我前进Q谢谢先Q?br> // q是虚函敎ͼ留待有所得时l以后文。我q有很长的\…… return TRUE ; }
]]> C/C++语言误区一 http://www.shnenglu.com/love4c/archive/2008/01/03/40298.htmllovetiffany lovetiffany Thu, 03 Jan 2008 03:03:00 GMT http://www.shnenglu.com/love4c/archive/2008/01/03/40298.html http://www.shnenglu.com/love4c/comments/40298.html http://www.shnenglu.com/love4c/archive/2008/01/03/40298.html#Feedback 0 http://www.shnenglu.com/love4c/comments/commentRss/40298.html http://www.shnenglu.com/love4c/services/trackbacks/40298.html 阅读全文 ]]> C++ Builder 2007 ?快速安?/title> http://www.shnenglu.com/love4c/archive/2008/01/02/40210.htmllovetiffany lovetiffany Wed, 02 Jan 2008 01:26:00 GMT http://www.shnenglu.com/love4c/archive/2008/01/02/40210.html http://www.shnenglu.com/love4c/comments/40210.html http://www.shnenglu.com/love4c/archive/2008/01/02/40210.html#Feedback 0 http://www.shnenglu.com/love4c/comments/commentRss/40210.html http://www.shnenglu.com/love4c/services/trackbacks/40210.html 安装向导cbuilder2007trialsetup.exe(g)是否有.net
2.0环境Q这个好办,如果没有安装环境Q在|上可以下蝲到ƈ安装。但是它的本体,全部安装文g400多MQ通过安装向导的单U程q行下蝲Q(f)q每个文件结时候还留下非常充裕的时间给你上wcQ你需要上q么多次吗?所以我强烈推荐我们的快车最新版Q开8个线E真是牛啊。好了,q告旉已过Q开始我们的旅程?
7zip文g理器,用于解压7zip格式的文Ӟ(x)
http://www.skyuc.com/bbs/showthread.php?t=62&goto=nextoldest
.net 2.0环境所需要安装的3个文Ӟ(x)
1Qhttp://installers.codegear.com/prereq/radstudio/5.0/microsoft%20.net%20framework%202.0.7zip
2Qhttp://installers.codegear.com.edgesuite.net/prereq/radstudio/5.0/microsoft%20jsharp%20runtime%202.0.7zip
3Qhttp://installers.codegear.com.edgesuite.net/prereq/radstudio/5.0/microsoft%20.net%202.0%20english%20framework%20sdk%20x86.7zip
?
http://www.microsoft.com/downloads/info.aspx?na=90&p=&SrcDisplayLang=zh-cn&SrcCategoryId=&SrcFamilyId=fe6f2099-b7b4-4f47-a244-c96d69c35dec&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2fb%2fe%2fa%2fbea35549-7804-4e28-beef-a7d9d1675f4c%2fsetup.exe
在www.codegear.com上注册,拿到你的安装序列P下蝲安装向导cbuilder2007trialsetup.exeQ?
C++Builder 2007 Enterprise Trial Serial Number: xxxxx CDN Login
Name: xxx First Name: xxx Last Name: xxx
重要提示Q注意下文的~号Q如1Q和Q?Q是不同的,q不是我写错? 需要特别注意的4个目录:(x)
1Q?007安装目录Q自定义Q我的ؓ(f)J:\CodeGear\RAD Studio\5.0
2Q示例文件目录,自定义:(x)J:\CodeGear\RAD Studio\5.0\Demos
3Q安装向导存?007安装文g用到的(f)时目录,自定义:(x)H:\download\bcb2007
4Q安装向导cbuilder2007trialsetup.exe解压3Q的安装文g用到的(f)时目录,不可自定义,所以一般要保证c盘剩余空间在1.2g以上Q安装了.net
2.0之后Q系l仍提示需?.7gQ实际上不要q么多,可以忽视它的提示Q对于所有用户用方式安装的为:(x)C:\Documents and Settings\All
Users\ApplicationData\{2EB4C530-C94F-4893-ABDC-C1E05A89956E} 安装?个步骤:(x)
Q?Q安?net 2.0环境?个文Ӟ|上遍地都是。如果是7zip格式的文Ӟ你要先安?zip的解压Y?
Q?Q运行cbuilder2007trialsetup.exeQ设|各U目录,直到它开始向3Q的目录下蝲q自动解压到4Q中Q这是一个环l地?0天的{待步骤Q就让它自动q行好了
Q?Q在Q?Q的同时Q我们用快R之类的Y件先下蝲3Q用到的所有文件约423Mq放?Q中的目录,下面的链接你可以手工一条条地输入快车,也可以做成一个html文g扚w导入Q方法我׃说了Q留l大家发挥:(x)
http://installers.codegear.com/release/radstudio/11.0.2709.7128/vcldotnetruntimes.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/vclwin32runtimes.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/bcbwin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/bcbwin32%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/dunit.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/core.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/core%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/corex.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/corecx.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/transm// 本文转自 C++Builder 研究 -
http://www.ccrun.com/article.asp?i=1024&d=lmp27s ogrifierc.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/corewin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/corewin32%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/xmlmapper.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/coredelphibcb.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/database.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/databasew32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/dbexplr.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/ibxw32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/ibxbcbwin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/ibxbcbwin32%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/dbgow32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/sqlbuilder.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/sqlbuilder%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/dbxcomponentsw32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/dbexpress.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/dbexpress%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/dbexpressx.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/unittesting.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/unittesting_bcb.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/htmldesigner.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/htmldesigner%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/ite.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/etm.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/itewin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/indywin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/indybcbwin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/intraweb.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/iwbcbwin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/sampleprograms.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/samplesbcbwin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/helpwin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/helpwin32%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/helpcommon.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/helpcommon%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/codevisualization.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/codevisualizationx.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/codevisualizationx%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/codevisualization_bcbw32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/internetcontrols.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/internetctrlswin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/internetctrlswin32x.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/soapwin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/webappdebugger.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/msofficecontrolscore.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/msofficebcbwin32.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/corba.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/codeguard.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/bde.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/bdecommon.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/bdecommon%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/bde_pro.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/bdecommon_pro.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/bdecommon_pro%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/databasedesktop.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/databasedesktop%20english.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/imagefiles.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/sampledatafiles.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/rave%20reports%20installer.7zip
http://installers.codegear.com/release/radstudio/11.0.2709.7128/borland%20database%20engine%20professional%20english.7zip
Q?Q完成了Q?Q之后,停止Q?Q的q行Q再重新q行Q?Q,q时候它?yu)׃再下载,只?x)自动解压3Q中的所有文件ƈ攑ֈ4Q去。当?dng)Q?Q中的文件下漏几个也无所谓,反正它会(x)补下。它仍需要通过|络验证q些文g的有效性,所以这也是一个环游地球一圈的漫长旉。最后,提示你注册,如果你没有那个可q破解文gbds.exeQ版?1.0.2709.7128Q,估计你会(x)q不厅R如果你今天才来Q很不幸Qhttp://www.ccrun.com/forum/forum_posts.asp?TID=6071提到的破解文件已l被删除了,但是我成Zq运者,所以我才能够完成这文章。替换bds.exeQ运行,启动速度比v我无法忍受的turbo
c++ 2006 professionalQ和bds 2006是兄弟)快了很多。com支持已经存在了,非常好?img src ="http://www.shnenglu.com/love4c/aggbug/40210.html" width = "1" height = "1" /> ]]> 如何用一个树(wi)节点(Disable Tree Node) http://www.shnenglu.com/love4c/archive/2008/01/02/40208.htmllovetiffany lovetiffany Wed, 02 Jan 2008 01:19:00 GMT http://www.shnenglu.com/love4c/archive/2008/01/02/40208.html http://www.shnenglu.com/love4c/comments/40208.html http://www.shnenglu.com/love4c/archive/2008/01/02/40208.html#Feedback 1 http://www.shnenglu.com/love4c/comments/commentRss/40208.html http://www.shnenglu.com/love4c/services/trackbacks/40208.html 我们写一个自定义函数Q用来启?用一个节点:(x)void __fastcall CrnEnableTreeNode(bool bEnable, TTreeNode *pNode) { pNode->Data = bEnable? NULL: (void *)0xFFFF; // 本文转自 C++Builder 研究 -
http://www.ccrun.com/article.asp?i=1015&d=r2tf61
pNode->TreeView->Invalidate(); } 然后考虑如何辑ֈ用节点的效果,前面说了Q我们只需实现q两个效果:(x) 1. 节点字体呈灰色显C?br>2. 节点无法选中 节点字体呈灰色显C可以通过TreeView的OnCustomDrawItem事g中的自绘实现Q在设计时状态,选中TreeViewQEvents选项卡双击OnCustomDrawItem事gQ添加以下代码:(x)void __fastcall TForm1::TreeView1CustomDrawItem(TCustomTreeView *Sender,
TTreeNode *Node, TCustomDrawState State, bool &DefaultDraw) {
if (int (Node->Data) == 0xFFFF) {
˾þһ |
þþþAV |
þòӰ |
ھƷþù½ |
þһ
|
ɫwwwþվҹ |
þþƷA㽶 |
91Ʒ91Ⱦþþþø |
ۺϾþùһ鶹 |
þþþ99оƷ10 |
˾ҹվھƷþþþþþþ |
Ʒݾþþþ
|
þ99ڹ |
vaĻþò |
aþ |
þþƷа |
Ļþþþ |
þþһ |
vaĻþ |
Ʒþ8xѹۿ |
ȫþվ |
˾ƷۺϾþþ |
ھƷþþþӰԺվ |
þþƷһ |
þþƷ |
˾þô߽ۺ |
AƬٸþ |
þþAVҰ |
þAV |
ھƷþ |
þþƷAVȫ |
97Ʒ˾þþô߽ |
þþƷһ
|
˾þۺϾƷAVר |
þùɫAVѿ |
99þùһ |
ȾþùŷһƷ |
ƷҾþþþþ |
ձƷþþþĻ |
Ļþþ |
þAVۺϺɫ
|