C++ Primer读书笔记1(经典收藏)

来源:互联网 发布:永恒之塔淘宝双倍礼包 编辑:程序博客网 时间:2024/06/04 18:58
C++ Primer读书笔记
注:本文www.Eachfun.com
         (整理说明:本资料是我在网上无意间找到的,读起来感觉不错,但由于原文是每章一个网页的格式,读起来不是很习惯,而且也不方便保存,所以我花了2个多小时的时间将所有网页的内容综合整理了一下,但最后才发现,文章的顺序颠倒了,所以各位如果愿意阅读本文的话,请从后面向前读,每个红色“标题”代表一章,如有不便还请各位见谅,或到原文网站阅览)
标题:转换转换
于我3+1.5=4.5。但是算机来两个数的相加可不这么简单。因33.0是不同的数据型,3.01.5是可以相加的,3却不能与1.5相加。于是,C++上面的表达式,有必要其中一个(或两者)转换
  因为这转换的,也就是说这转换程序知道,那,系就不能必失,失指的是精度。了不失精度,数据是向精度高的转换。惟一的例外是当某个量用作条件,它被转换为bool型。
  术类型的转换这样的:所有比int小的都转为intunsigned int,即使没有必要也这么转。原因很简单,因int度正好等于字CPU,一次理一个字是最快的。如果intunsigned int无法达到要求,longdouble化。
  如果一个转换能不造成失,那自然是好事。可是世的事有不随人愿的候。于同一术类型,其signedunsigned所能表达的范是一大,但却是互不重叠的两个范。就像妇联工会,往哪边转换都可能会失。是无法解决的问题,所以,在VC中,试图intunsigned int示警告。
  奇怪的是,据我测试,在VC++.net中,只有“<”“>”候才会示警告,而“==”“!=”候却不示警告。实际两个比也会有同问题产生,比如以下代
int a = -3;
unsigned b = 4294967293;
if (a == b) cout << "yes" << endl;
  测试运行以上代发现表达式a==b值为true是从int转为unsigned int程中的副作用,个副作用我们应该知道,但是VC++.net行任何警告似乎也有些与理不通。——道我关闭了某些警告?
  其它转换还包括数转换为、算术值用作条件时转换为bool,枚转换为整数,非const转换为const象等。其中枚举转换为整数没什要提的,枚举值本来就是整数的名,非const转为const象只是临时声明它的保护级别,通常用于作参数传递时
 
 
标题::内存管理之newdelete
博士曾将内存管理比喻为雷区(《高C++/C程指南》第44),内存管理这块难?恐怕不好会者不难难者不会嘛。但是内存管理这块难以成会者应该是没有的。
  程序时时刻刻与内存打交道,只不以往我不用考,甚至不用知道。所以,所内存管理,是特指堆内存。
  如果把堆内存和内存的使用放在一起考,可以降低内存管理恐惧。
  一、内存的分配:
  int i(100);//上分配内存
  int *pi = new int(100);//堆上分配内存
  以上两分配,都使用了100初始值进行初始化,如果是类对象的分配,它们还可以指定使用哪个构造函数,比如:
  CString s(s1);//上分配内存
  CString *ps = new CString(s1)//堆上分配内存
  里的s可以是char*,也可以是另一个CString象,它的型将决定上面两行用哪一个构造函数。
  在里,有一点要特别说明,如果要使用默造函数,new句后面可以用空括号,而内分配的句切不可用空括号。如果写成“CString s();”并不是定一个CStrings,而是定一个返回值为CString的函数s
  上面两分配,也都可以分配象数,不同的是,用new操作符在堆内存分配数组时,只能用默构造函数。而在上分配却可以指定象成的初始。如:
  int a[3] = {1,2,3};//上分配内存,int可以成其它型名,后面的初始可作相应调整。
  int *p = new int[3];//不能指定三个象的初始
  二、内存的访问
  内存可以通过对访问,也可以通针访问,堆内存通针访问。方法完全相同。
  三、内存的放:
  内存在象作用域束后自动释放,堆内存要用delete
  delete pi;//放内存
  delete []p;//象数
  象数,那个空的[]不可以,否将只放数的第一个元素。致内存泄露。
  有了以上比,堆内存似乎没有了任何度。那内存管理的玄机究竟在哪儿呢?在行内存分配与放的候,有几个注意点要住:
  1new操作有可能失,当系无法分配需要的内存块时,将返回NULL,所以在new操作之后,要立即判断pi是否NULL
  int *pi = new int(100);
  if (pi = NULL) {...}
  2、堆上分配的内存必delete,而且只可以delete一次。了保内存只被delete一次,请务delete以后立即将指针设为NULL
  delete pi;
  pi = NULL;
  “pi=NULL;”不是必的,但是个好习惯。将指针设为NULL既可以防止继续读内存,也可以防止再次内存。
  老的C程序可能忘不了mallocfree函数,它也可以行内存的分配与放。但是C++代它落伍了。它只是按求的字行分配,而不管你用这块内存来干什这样做,就等于放弃了类对象的构造与析构。于很多这样做是很危
 
 
标题:合性和求值顺
,我能熟背出先乘除,后加减,之于C++列出的整整19又包含若干个操作符,我是看了就麻。以我的性,连军旗里哪个大哪个小都背不出来,几十个操作符——了我吧。
  住林博士的如果代行中的运算符比多,用括号确定表达式的操作序,避免使用默(《高C++/C程指南》第26这样做最直接的作用是不用记忆复杂了,不用记忆并不是因为懒,而是了更清晰。竟程序不只是编给计算机运行的,当我们处在一个多人作的体中,程序的清晰度和精确性比性能要高得多。再,多加几括号是不影响运行效率的。
  合性和求值顺序是容易混淆的两个概念。一个操作符都定了合性,但是只有极少数操作符定求值顺序。合性是如果有多个同级别的操作符,些操作数如何分。比如“1+2+3”究竟分成“(1+2)+3”“1+(2+3)”没有区,但不等于所有操作符都不生区。即使不生区算机竟是算机,它只能按死的范做事,于其它灵活机制,不如定了合性它遵守。
  C++只有四个操作符定了求值顺序,它“&&”“||”“?:”“,”四个操作符并不。反住其它操作符也不的是在写程序中是否有个意。那多网友讨论“j = i++ + i++ + i++;”果,正明了有好多人不了解未定的威力。如果不小心使用了依于未定程序的句,将是一个不容易发现并改正的问题比如“if (a[index++] < a[index]);”
 
 
标题:sizeof和逗号操作符
sizeof成操作符可能有些不合习惯,因sizeof的用法与函数没区。但是sizeof与函数有着本的区:它是编译时常量。也就是,在程序编译时,就会求出它的,并且成程序中的常量。
  sizeof本身比较简单,惟一要提的就是它名和指针进行操作的果。
int a[10];
sizeof(a);
  操作返回的是数所有元素在内存中的总长度。但是如果针进行操作,返回的是指本身的度,与指所指型无
  正因名与指有着千系,所以有个特性会人摸不着头脑
int function(int a[10])
{
  sizeof(a);
  ...
}
  以上sizeof返回的不是数所有成的大小,而是指的大小,因在参数传递中弱化
  逗号操作符除了在for句中用以外,我没发现在哪儿有用。因在一般情况下,逗号改成分号肯定是可以的,在for句中因分号的作用另有定,所以不能随便改。才有了逗号的用武之地
 
 
标题::条件操作符
得条件操作符的存在就是if-else句。第一,它与if-else句的功能完全一致;第二,它然是一行句,但是它定了求解序,序保了有些表达式不被求
  条件操作符是有一定的危性的,危的原因在于它的底,容易漏掉括号。它的级仅仅高于赋值和逗号运算符,也就是,只有在与赋值或逗号共存,才可以免去括号,其它情况下都得加上括号。漏加括号的BUG是很难发现的。
  比如“cout << (i < j) ? i : j;”句的实际作用是将表达式“(i<j)”值输出,然后测试一下cout的状<<操作符的返回cout),整个表达式的不管是ij,都被
 
 
标题::箭操作符(->
操作符是C++明的全新操作符,但却不是C++才用到的功能。早期的C然没有,却有构体,也允有指向构体象的指。不同的只是没有“->”个符号来化操作。到底,“->”的出只是代替原来就可以实现的功能。
  引用:C++包含点操作符和解引用操作符的表达式提供了一个同义词:箭操作符(->)。
  笔一同义词的出,不仅仅使程序化而且更易于理解,更重要的是,它降低了出的可能性。出什么错呢?就跟操作符的了:
p->a();
(*p).a();
  以上两行等价,但是第二行却很容易写成“*p.a();”,由于点操作符的高,就成了“*(p.a());”里至少包含了两个错误:一是p不是象,点操作无效;二是试图对类解引用(只有当返回指才有效)。
  也有人要了,第一个错误经导致了编译不通第二个错误干什这样理解就了。VC++程序提供了一个十分大的,其中有些象,既可以行点操作也可以行解引用操作的,如果上例中的p是那种类象,而且p.a()好又返回指,那上面句将可以通过编译,最终换找的BUG
  住,尽量多用箭操作符
 
 
标题:++的陷阱
自增和自减符作符是如此常用,以至于没有必要提了。但是任何一本都会下重手来提它,原因是它简单,却含有玄机。
  到前自增和后自增,几乎所有的都是这样讲的:用“j = i++”“j = ++i”比,告诉读i都增了1,但是j却不一
  也没法,因为绝大多数++时还没有提到表达式的个概念,有些本可能从到尾都不提。“j = i++;”,它是一个表达式没,但是等号右也是一个表达式,于表达式“i++”,它是有的,表达式的值赋予了j,而整个表达式也有一个,只是弃了。推:“i = j = k = 1;”句中独的“1”就是一个表达式,叫常量表达式,它的就是1,它k“k=1”个表达式也有,它的就是k,它j……最后i赋值的表达式也有,它的就是i弃。
  弄明白了表达式的后,就可以科学地“++i”“i++”了,因为这两个表达式的这样的:前置自增/减表达式的是修改后的,后置则为修改前的
  那,在不心表达式的——即只是量自增或自减一下——究竟用哪个好呢?当然是前置好,因前置只要用一个指令行一下自增自减运算,然后直接返回即可。而后置却要先保存好个初始,再自增减,然后再返回以前保存的。写操作符重的程序员应该更能体会里面的区
  “++i”“i++”这样简洁,所以它“i = i + 1;”要美得多,所以简洁就是美。但是,在美的同,一个美的陷阱正在招手,程序员们理解并小心。
  “if (ia[index++] < ia[index])”这样的表达式是危的。前文中已提到了,C++中只有极少的几个操作符是定了值顺序的,“<”号没有定,那两个数要比大小,系究竟先求前者是后者?如果先求前者,那求后者的index有没有增一?
  常在论坛上看到有人讨论“j = i++ + i++ + i++;”果,有人把自己的出来证实自己的理正是初学者令人悲哀与同情的地方:应该好好掌握的知没有足情,却把一腔血放在些无须讨论话题上,C++初学者要走的路不仅长,而且充
 
 
标题::回十几年前的程入
本来不想为这段写读书,不突然想起十几年前的一件趣事来,下来吧。
  1993年的候,学校开设的是BASIC言。于当时连电脑都没看一眼的我,学校开设这样,真是无比感。我至今仍然感我的母校,在片面追求升学率、大量减副的全局下,我的母校居然开设了音、美技等一系列副之又副的这让我至今忘。而令一方面,我今天能在程序界打拼,完全是从那始陪趣。如果我的高中没有开设这门课,我未必就不入程序界,但是入至少要三年。
  三年,我学的西少之又少,于整个BASIC皮毛都不如,而且学校只提供了一次上机机会,的是机与机。我所调试程序是在自己的小霸王学机上行的。但是,在电脑没有普及的年份,懂得一点点就是很先的了。入大学后,堂堂一个大学的班,居然只有两个人碰过电脑,大家的基可想而知。在同学拼命学DOS命令的候,我已遥遥地走在了前面。之后学True Basic自然一日千里,之后自学VB、自学C也就理成章。如果我的高中没有开设这门课,我未必就不入程序界,但是我在大学的一段时间肯定会与其他同学一起拼命DOS命令。要知道,其他同学至所以学得比我慢,并不是比我笨,而是没有习惯电脑的思模式。
  该说赋值操作符了。高中开设BASIC,其本是不到半厘米厚的小。但是我手地提前阅读了。得一知半解就去做后面的习题发现一句“P=P+1”,心想:可能嘛?P可能等于P加一呢?移一减,不就相当于0=1?一定是上印了。于是,我将其中一个P改成了R,而且是用黑笔描的。我描得是如此致,以至于根本看不出那个RP改的。等到老师讲候,我然已懂了“=”与数学上的“=”不一,但是由于把P看成了R这题还是做了。
  当的情况是这样的:老喊了几个同学上去做,没有一个会。老师说有没有会做的?主上来?好几个同学立即喊我的名字,把我逼上去了。果我这么一做就做了。老了我的勇气,但是同学却然平捧着不放,原来也是个
  赋值操作符就是在那个我留下深刻印像的,那天我知道了,“=”号不表示左右相等。
  赋值操作符也比较简单,理解了它的用法就好了。C++至所以有了赋值操作符以后赋值操作符,不仅仅化代可以加快理速度。“i=i+j”“i+=j”相比,前者的i了两次。不点性能差别对整个程序性能来不大。有一个区就是方面的了。“i*=j+1”如果不写成赋值,就要加上括号:i=i*(j+1)
 
 
标题:系、逻辑和位操作符
系操作符本身没什好提的,它与我逻辑,所以不理解。有两点可以略提一下:
  一、因ASC字符中没有“≥”些符号,所以只好用“>=”代替。于是生了BASICC++的两不同符号集:BASIC“<>”表示不等于,C++“!=”
  二、程序设计时不能用“if (i < j < k)”这样的写法。原因很简单,因为这种写法另有含,或者正因不能这样写,才给这种写法另外了一
  BASICC++逻辑操作符也有完全不同的写法,BASIC用比关键“And”“Or”C++“&&”“||”也没什住就行了。
  逻辑操作符中的“&&”“||”C++准中数不多的指定了求值顺序的操作符(除此以外有条件操作符“?:”和逗号操作符“,”于求值顺序,后面将提及)。这样定惟一的缺点是需要外的记忆是很明的:它可以的操作得不危。如“while (i<MaxSize && Array[i]>0)”“Array[i]”,指越界是很可怕的,但是“&&”操作符的求值顺序保了指不越界。从另一方面,要保不越界,就必须记操作符的求值顺序(不然就只能分成两个句写)。
  又要提到bool的比了,“if (i < j < k)”实际就是行了bool的比。本解的候,然提到了k与整数01做比,但是我宁可提醒大家不去个。bool只有truefalse两个,比10要好得多,因为虽false就是0,但是true却不1
  C++中如果只有逻辑操作符也就算了,它偏“&”“|”这样的位操作符。而位操作正是BASIC不提供的功能。初学C/C++的人来了度。点不在于理解,而在于记忆。位操作符的作用是行某一Bit位的定,在一个字节掰成八份用的年代,它非常常用,比如Turbo C中的屏幕置,就是3位表示背景色、4位表示前景色、一位表示闪烁,用一个字完全存放了屏幕字体的信息。在的海量存与高速理中,大可不必这么节约了(从理速上看,非但没有节约,反而浪了),所以,不会位操作也没什大不了的。
  不,不熟悉位操作的用却都知道“<<”“>>”的另一用事不能怪程序,几乎所有的C++本都会从“cin >> i;”“cout << i;”入手。不用知道两个操作符原来是干什的,甚至不用知道是怎回事。C++来到个世界,展了C言,使得知其然不知道其所以然的程序也能好好工作。许这是它的一个进步
 
 
标题::可的算操作符
操作符是最容易理解的符号了,因它与平做的数学是完全相同的规则。就小学的知先乘除后加减都完全适用。
  不,就像因与生活的逻辑完全一样导致易于理解一般,与生活逻辑不一致的问题就比较难以理解了。比如9个苹果,3个小朋友分,平均个小朋友可以分到几个苹果?现实中既不可能是-9个苹果,也不可能-3个小朋友分。而是C/C++中的除法和求余却不得不面对这种情况。它非但于理解,而且有不确定因素。
  引用:如果两个操作数都正,除法和求模操作的果也是正数(或零);如果两个操作数都是数,除法操作的正数(或零),而求模操作的则为负数(或零);如果只有一个操作数是数,操作的果取决于机器;求模果的符号也取决于机器,而除法操作的值则数(或零)。
  笔:以上一大堆似乎有些口舌。这么说吧,如果两个数同号,一切都那么简单。即使是两个数相除,只要把它当成两个正数就可以了——商肯定是正的,余数只要对应调整一下符号即可;如果是一正一两个数相除,那商肯定是的,但是究竟是多少可不一定,余数就更难说了,是正是都不能确定。
21 % 6 = 3;
21 % 7 = 0;
-21 % -8 = -5;
21 % -5 = ?;//
与机器相,可能是1可能是-4
21 / 6 = 3;
21 / 3 = 3;
-21 / -28 = 2;
21 / -5 = ?;//
与机器相,可能是-4-5
  引用:当只有一个操作数为负,求模操作的符号可依据分子(被除数)或分母(除数)的符号而定。如果求模的果随分子的符号,除出来的向零一取整;如果求模与分母的符号匹配,除出来的取整。
  10个苹果分-3个朋友,平均个小朋友可以分到几个剩下几个
 
 
标题::操作符
第五章始了,看得出来,从章才真正C++的基本内容。没有里的内容,前四章都是狗屎。
  操作符就是我理解的运算符了,不C++算机言,它与我生活有着不一逻辑,所以,在我看来简单“3+4”,到了C++里,就得分成一个操作符和两个操作数了。
  操作符的含以及它能得到的果,不仅仅取决于操作符本身,取决于操作数。当初学C言的候,发现做除法要用“10/3.0”而不用“10/3”了一回。特是从BASIC来的人,BASIC里没有这么强型,所以10/3就是浮点数,要整除得用“Int()”函数或改用“/”运算符(不是VB程序都知道个运算符的哦。)
  从C/C++中弄明白了“10/3.0”“10/3”,反来再去理解CBASIC的区,不难发现C/C++这样做的确比BASIC高明得多。而了解了硬件的运算机制后,可以理解这样做不仅仅是高明,而且是必
  引用:有些符号既可以表示一元操作也可以表示二元操作。例如*……这种两用法相互独立、各不相,如果将其视为两个不同的符号可能会更容易理解些。……需要根据符号所的上下文来确定它代表一元操作是二元操作。
  笔是一个大家都明白,但是大家都不会去想的问题想起来,我不去想,正是因早已熟知。然而我们读程序可以上下关联算机要做到点就不容易——比如拼音入法的自动选词。由此看来,C++编译器是十分秀的人工智能
 
 
标题::多
引用:格地C++中没有多
  笔:不只是C++啦,C中就是这样。不,正因C++中没有多,而提供了的数,所以C/C++在数使用上更灵活。
  多的定和使用没什要多提的,用就懂了。无非是多一括号而已。不,如果把它跟指一起用,倒是要注意的:二对应的是指向指的指,所以,如果要在函数间传递,指针类型一定要正确:
  int a[3][4];
  int *p1 = &a[0][0];//a[][]是一个int其取地址就是int*
  int *p2 = a[0];//a[0]然是a有一个元素,但它也是另一个数的数
  int **p3 = a;//a是一个二的数
  int **p4 = &a[0];//a[0]是一个数名,它是a的一个成
  另外,有一个比较难记、容易混淆的用法:
  int (*p5)[4] = a;
  它容易混淆,是因它与“int *p5[4];”有着截然不同的意。前者是指定一个指向数的指,后者是定一个指——ing...
  本人在实际使用中,常避,而用其它途径来使用一大堆数。比如可以这样用:
  int a, b;//的元素个数
  int *p = new int[a*b];
  for (int i=0; i<a; ++i)
    for (int j=0; j<b; ++j)
      p[i*a+j].....;
  delete []p;
  用这种方法,就是三、四也不用考指向指的指这么复杂西。不是我不会,而是不高去想
 
 
标题:动态
,本了个开头,居然newdelete了。我偷窥了一下:下一章始才到操作符,而且下章将有专门的一节讲newdelete。看来里提到它的目的只是string这样类为可以自大小。
  new的返回是一个指,不书暂时没有提到new也会返回NULL的。是的,暂时还不用提内容不够这么复杂的情况。
  引用:在自由存区中建的数组对象数是没有名字的,程序只能通其地址接地访问堆中的象。
  笔里有两个问题,一是的名字也是个指,指当然也可以看成的名字本来就可以互的,正如我前面的一“5[a]”完全等价于“*(5+a)”。至于a是静的数动态的指,没有区。第二个问题里提到了,在没有解内存之前,这样说毕竟理解上有度。是那句有一定基的人看的。
  令我耳目一新的是:newconst——不是我不懂,而是在没想到。再了,建一大堆const的内容,而且只能初始化同一个。那有什用?正如本提到的一这样的数组实际上用不大。依我看,不是用不大,而是根本没用。
  动态应该“delete []p;”而不是“delete p;”是一个只要住就可以的问题,我之所以提上一句,是因有人没有注意过这细节,包括很多自以很了不起的程序
  引用:如果漏了方括号是一个编译器无法发现错误,将致程序在运行
 
 
标题:C格字符
给这篇文章定下标题:,是因为书中就是这样说的。本C++的,所以它推荐者尽量使用C++的内容,而实际上像我这样C来的人,习惯于使用C格的字符串。——我又想起了那句原来我只是一个古代C++程序”(《数》一文)
  C言是用字符数来做字符串的(当然个字符数必需要有一个NULL尾),因字符串是如此常用,C还专门开发了一套函数来个特殊的数。于是,我们进行字符串操作,可以忘、忘可以忘char个内置型。
  正是因如此,林博士的《高C++/C程指南》中别强调,不可以用指赋值和比行字符串的赋值和比个警告于从VB转过来的人尤其重要。
  使用C格的字符串有两点是必的:一是要给这个数组开劈足够长度的空;二是一定不要忘了NULL;其中第二点一般程序不会犯,因为毕竟没几个人用“chat s[3] = {'a', 'b', '/0'}”这种方式来定字符串。第一点就成了重中之重。我strcpy之前,有没有考虑过字符串可能的空不足?
  “strn”格的函数既救了大家也可能害了大家,它救了大家,因大家在strncpystrncat可以控制字符个数,即使源字符串太,也可以避免内存溢出。但是它存在的危性是它不会字符串添加NULL
  所以,写到里再次做了一个提醒:尽可能使用库类string”——我都忘了是第几次提醒了,本一而再再而三地提醒者不要做古代C++程序
 
 
标题::指(三)指与数
和数是什么关系呢?中曰密切相。其,那真就是同一回事嘛。用到指候,你未必会用到数;但是只要你用到数,你就必要然用到指(即使你不知道)。
  正是因可以用加或减运算来移它所指的位置,而且加一或减一正好移到相一个同型的量(不管量占内存是多少),那我有意将一堆同型的量放在一起,拿一个指指向它中的第一个,再住它的个数,就成了数
  数用一方括号来解引用其中的某个成也只是指运算的化。比如:
  int a[10];
  a[5] = 5;
  以上这种码谁都用都能理解。那下面行代呢?
  5[a] = 5;
  这种用法恐怕很少有人知道,即使在知道了,恐怕也很理解。实际上知道了数运算的实质行代的迷就会立即消失:C/C++理括号的方法很简单,将方括号前面的和方括号内的相加,得到一个新的指,再取指所指的“a[5]”就完全等价于“*(a+5)”“5[a]”就完全等价于“*(5+a)”
  那“*(a+5)”是什运算呢?指运算。因编译“int a[10];”候,就等于定了一个“int * const a;”将它初始化指向内存的某
  实际上,正是因“*(a+5)”这种用法在太常用了,C定了它的替代用法,后来个替代用法被广接受,而它的实际却被人忘。
  以上内容本未有提及,是我看看到里的一点心得,作为读书写下来。不是了炫耀。本书虽然是有一定基的人的,但是竟它只是按就章地写下C++规则,没有必要提及技巧性高而又用性少的内容。我之所以要写下来,目的是了便于理解指运算
 
 
标题::指(二)
的初始化与赋值:指是一个量,它可以被赋值,也可以被求。指可以接受的只有以下几
  1编译时可求0常量。(必0,其就是NULL啦)
  2型匹配的象的地址。(也就是用&运算符取一个量的地址)
  3、另一象末的下一地址。(这种用法主要用在循里,其当指值时其所指的内存行存取往往会致灾
  4、同型的另一个有效指(如“p=q;”)。
  其中第1点,将0值赋给,主要是了有一个状表示个指空的C/C++通常0NULL然的确存在地址0的内存,但是指望用指访问这个内存。
  初学者怎才能消除的恐惧?我得首要的一点是清醒地认识并且刻提醒自己也是一个。比如以下两行程序:
  int i;
  int *p = &i;
  看到儿的人几乎无一例外把pi系起来(当然不是坏事),但是,我得更重要的是将pi分离,心里住,p是一个量,该变量是有它的的,i的唯一系是:目前该值正好等于i在内存中的位置。两情况下pi将毫无系:
  1p被改,如“p = &j;”“p++;”
  2i量被放,如离i的作用域。
 
 
标题::指
C/C++的精,也是最的部分。——所有学C/C++的人都明白点,当年我初学的候也是这样。但是,在再回想指,我却很它究竟在哪儿。应该说这就叫者不会,会者不吧。饱汉不知饿汉饥是有一定的道理的,即使饱汉经饿过
  本中矩地解了指的概念、定与初始化、操作等。正如上面提到的饱汉不知饿汉饥,我似乎很健忘,以至于不得指点在哪儿了。
  指的灵活性可以把大量的工作化繁易,前提是必首很把足繁的指弄懂。听起来有点像口令,事就是这样,你在把懂的西弄懂了,日后可以把事化,大事化小。
  从VB来的人一定会熟悉值传递地址传递两个概念,实际上,地址传递这种说法正是了弥VB没有指却有似的需要才明的。我认为C/C++程序要想深入理解指,首先要抛弃个概念。在C/C++程序中,即使在函数用中传递,也不能地址传递还应该说值传递,只不过这传递有点特殊,特殊在于借用,可以找到其。就好像我你一把匙一,你通过钥匙可以得更多,但是我你的只不匙。
  我前子曾写一篇于指的文章,之所以写那篇文章,是因看到一大堆初学者在论坛上提。通过对提的问题的分析,我总结了几点。下面,首先就先引用我自己写的《于指》中的片段吧(完整的文章到我的个人主页查找):
  一、指就是量:
  然申明指候也提型,如:
  char *p1;
  int *p2;
  float *p3;
  double *p4;
  .....
  但是,只表示向某型的数据,而不表示型。白了,指都是一个型:四字无符号整数(将来的64位系中可能有化)。
  二、指的加减运算很特殊:
  p++p--的运算并不是p四字无符号整数加一或减一,而是它指向下一个或上一个存储单元,它实际加减的就是它所指型的size
  比如:
  char *型指次加减的改量都是1
  float *型的指次加减的改量都是4
  void *型指无法加减。
  要注意的是:指不能相加,指相减的差int型。
  正是因有着不同于其它量的运算方式,所以,在任何候用到指都必明确(即指所指的量的型)。就不理解函数声明“int abc(char *p)”用的候却成了“a = abc(p);”这样的形式了。
  三、用指做参数传递的是指针值,不是指本身:
  要理解参数传递,首先必形参弄明白。
  函数A用函数B,如果要传递一个参数C实际是在函数B中重新建立一个C,并将函数A中的C值传入其中,于是函数B就可以使用了,在函数B中,无有没有修改C于函数A中的C都没有影响。函数B,会将所有内存收回,局部C销毁,函数B对变C所做的一切修改都将被抛弃。
  以上示例中,函数A中的C,函数B中的C被称形参用函数,会在B函数体内建立一个形参,形参的参的是相同的,但是形参的改不影响参,函数,形参被销毁参依然没有化。
  指也是一个量,所以它也符合以上的定,但是,指存放的不仅仅是一个,而是一个内存地址。B函数对这个地址行了改,改的并不是形参,而是形参所指的内存。由于形参的参的完全相同,所以,参所指的内存也被修改。函数个形参会被销毁,指化无法影响参,但此前它所指的内存的修改会持有效。所以,把指参数可以在被函数(B)中改函数(A)中的量,好像形参影响了参一
  注意:是好像。在这过程中,函数B影响的不是参数,而是内存。
  下面再来看才的例子:“int abc(char *p)”“a = abc(p);”中要用*号,因函数必知道是指么调不加*号,因为传递的是针值,而不是所指内存的
  四、指向指的指
  正因也是一个量,它一要尊守形参与参的定。所以,然指做参数可以将函数内对变量的修改到函数外,但是,函数体内本身作任何修都将被弃。如果要本身被修改而且要影响函数外,那,被函数就应该知道所在的内存地址这时,指不再是指,而是普通。作参数传递的不是普通,而是指向普通的指。即指向指的指
  如果p是一个指向指的指,那*p就是一个指,我妨就把它看成q。要访问q所指的内存,只要*q就是了。用初中数学的等量代就知道,*q就是**p
  五、指
  之所以要把独提出来,是因本身就与指有着千系。即使你不想用指,只要你使用了数实际就在与指打交道了。
  只要理解了指本身就是量,就不理解,我可以且把它当成普通数理,a[0]a[1]a[2]……就是数的元素,只是,a[0]是一个指a[1]a[2]也是一个指。那a呢?当然也是指,但是两事。你可以完全无a的存在,只去管a[0]等元素。*a[0]*p没有什的区。  
  有一个西不得不提一下,它比重要:
  指的定有两个可取的方式,它各有缺点:“int *p;”“int* p;”是完全等价的,后者的好人体会到p是一个指向int,前者会*p是一个int量(里没有定int量);但是前者的好是不会生混淆,如“int *p, *q;”人一眼就看出定了两个指,而“int* p,q;”解成定了两个指实际q不是指
 
 
标题::数
入本第四章,了。数组难不好。但是数非常重要是肯定的,有多基本的算法就是与数一起出——比如冒泡排序法。而离了那些算法,数本身也失去了价
  注意:阅读本章概念加以小心,按平的理解,是多中的概念,但是本中的指的是元素个数。了避免干,我在阅读中用个数来取代
  引用:在出现标之前,C++程序大量使用数保存一组对。而代的C++程序更多地使用vector来取代数,数格限制于程序内部使用,只有当性能测试表明使用vector无法达到必要的速度要求,才使用数
  笔:我汗一个先!原来我只是一个古代C++程序
  数的定必需指明元素的个数,而且必常量表达式一点想必理解数的人都会操作(即使弄了,编译器也会立即报错),但是真正去思考它的人也不多。里的常量概念是指程序在编译阶段就能求的量。
  在C代,我并不会多地理会常量个概念,那是因C代没有const,而define西,都知道它是在编译前就直接替的。但是到了C++代,由于const的存在,使常量个概念得更普了。
  const size1 = 5;//是个编译时就可以求的常量,它可以在数据的定中使用。它的作用仅仅相当于“define”
  const size = getsize();//个常量是运行才能求的。
  除此之外,常量求达式的概念指明可是以一个算式,只要编译时能求。如“char username[max_name_size + 1];”这种用法非常常用,因它可以避免在定组时忘掉NULL
  数的初始化可以式指定,也可以不指定。式指定指定成的个数可以小于等于实际个数,但不可以比实际个数大,如果小于,其它元素视为未指定。于未指定的元素的初始,它遵循量的初始化原看《量初始化》一文。
  大多数本在介字符串都会提到,字符串其是字符数,只是因太常用,才会有专门的使用方法。本也不例外。
  本没有提数实质,因没有者的眼睛。
  引用:数著缺点在于:数度是固定的,而且程序无法知道一个定数度。
  笔:其实这正在程序心中的一个痛。当我把数参数函数,函数么处西?要大小有个事先的——这样的程序将失去很多通用性,要么连大小一起传递给人家
 
 
标题:C++,想说爱你不容
第三章就这样结束了,本章介了三个库类型:stringvectorbitset
  可惜的是,整个第三章我都是草草读过的。一方面因不属于格意上的C++内容,另一方面C代的西在不抵触着它
  确切地,它C代的那些西的替代品。它存在的理由就是它秀。然而秀是一回事,心又是一回事。
  C言在象方面的缺失,使C程序更多地掌握了底的操作。面C++中的stringbitset西,C程序员们都知道,在C++出来以前自己是怎想方法解决过问题的。刻苦才有刻骨心,C++以后,是使用更简单安全的是使用自己曾熟悉的老法,是一个取舍的问题
  引用:程序员应优先使用库类类型。
  笔:本里放置了这样一个提示,大概是想告这样固派:再死腐旧套不放了,回吧。,早在本的前言就有了似的内容。可是,我依然不能自己静下心来细读并熟第三章。
  也有一天我会回第三章,当然,也不会。stringvector这样西,在MFC有更好的替代品
 
 
标题:bitset
当使用到布尔变量数组时是有点心疼。因尔变量只需要01种值,然而编译动辄使用一个字——甚至四个字来存放一个布尔变量。面1/32的使用效率,叫人怎能不心疼?
  要想节约也不是没有法,代价是写更多的代:用“&”操作将量的某一个bit取出来,一个字就可以存放8个布尔变量。但是,个代价是比重的,重到足以程序望而生畏的地
  bitset运而生,它可以方便地管理一系列的bit位而不用程序自己来写代
  更重要的是,bitset除了可以访问指定下bit位以外,可以把它一个整数来行某些统计,如:
  b.any();//b中是否存在置1的二制位?
  b.count();//b中置1的二制位的个数
  ……
  不话说回来,我是不习惯bitset,原因在于我是从CC++的。详细问题留到后一篇文章中讨论
 
 
标题::迭代器:指与数据库杂交的后代
迭代器与数据的相似之在于end()函数返回值为指向末元素的下一个。跟数据记录集的eof这么相似。话说回来,熟C/C++的程序一定不会忘了,利用下标访问组时用的是用。就拿“int a[10]; for(int i=0; i!=10; i++)”,下标为10就可以视为最后一个元素的下一个。只是以前不会有这么的思考。
  迭代器与指的相似之在于它的解引操作符,居然就是一个“*”号。而且存在着“ivec[n]”“*ivec”两个完全等价的操作。而且持算运算来移访问的元素。
  迭代的const用法与指有个区
  “vector<int>::const_iterator ivec = vec.begin();”ivec并不是常量,只是它指向的元素会得到保。如果要定本身const的迭代器,要用“const vector<int>::ivec = vec.begin();”
  指这样处理的:
  const int *p = &i;//p指向的量是const
  int* const p = &i;//pconst
  地雷:任何改vector度的操作都会使已存在的迭代器失。例如,在push_back之后,就不能再信指向vector的迭代器的了。
  笔:我不得不相信所的迭代器其本就是一个指了。因vector支持动态,而且保内存的连续。所以,次改它的度都会放已有内存、重新申内存。当然得失效
 
 
标题:for句的条件思
for句,我几乎这样写的:“for(int i=0; i<Max; i++);”。但是,按本法,我这样写似乎同犯了两个错误
  1、本中写for句中的第二个表达式(条件表达式)时总是用!=,而不用<几天来然心里得奇怪,但是一直没去思考里面的含。本没有急着告所以然,只是提醒我完本的第二部分后就会明白。我等着吧:)
  2、我得用Max这样一个量去代替某个需要用函数才能返回的可以增加运行效率,但是本的建与我的理解相反。它建“i<ivec.size()”数据构可以动态……如果确增加了新元素的,那么测试已保存的size环结束条件就会有问题,因没有将新加入的元素算在内。
  同,本书为了打消运行效率的顾虑提到了函数个概念。没有到介候,但是C++是一个有机体,在述某一个知点的候,不可能完全避免另一个知点。所以,我是建初学者不要急着阅读
 
 
标题:vector
模板了,可惜的是,在本的第三章,不能让类模板浮出水面,只能将就着提一下。
  引用:使用模板可以写一个或函数定,而用于多个不同的数据型。……vector并不是一数据型,而只是一个模板,可用来定任意多数据型。
  笔“vector<int> ivec;”中,“vector<int>”是一个数据型,C++支持模板,以后大量接触模板个一定要刻注意。
  引用:在元素已知的情况下,最好是动态地增加元素。……然可以对给定元素个数的vector先分配内存,但是更有效的方法是先初始化一个空的vector象,然后再动态地增加元素。
  将vectorstring比,可以松地empty()size()函数和[]===!=等运算符。不过这似乎有个前提:C言比熟并且VBString型。因string然是一个量,但是如果缺少“char []”的理解,将注定不能理解它。——所以,我很反某些人可以不学C言直接学C++”论调
 
 
标题:string
习惯VC++CString,而此前用的又是C言,所以,根没有看一眼string在既然专门讲它,我就看一看吧。
  定与初始化:
  string s1;
  string s2(s1);
  string s3("value");
  string s4(n, 'c');//nc成的一串
  string象的入除了可以“cin >> s1;”以外,可以将cinstring象一起作getline()函数的参数“getline(cin, s1);”,而且个函数的返回值还cin
  除此之外,string类还empty()size()等函数和[]+===等运算符。
  地雷:empty()函数的功能并不是将象置空,而是测试是否空。可是与CStringEmpty()函数不一的哦!
  本书还详细empty::size_type型存在的原因。在使用VC++.NET候,我已经见过size_t——strlen()函数的返回就是size_t象。当我也没有西,想来应该了支持64位机而的吧。不过现在我知道了,原来我想得
  引用:通过这些配套型,库类型的使用就能与机器无
  “+运算必至少包含一个string可能初学者摸不着头脑。比如“s1 + s2”“s1 + "hello"”“"hello" + s1”是合法的,唯独“"hello" + "world"”不合法。我在看懂运算符重之前也没有明白个。本由于刚开头,离运算符重还远呢,所以只告诉读、没有告诉读所以然。我也不写了。
  引用:下操作可作左
  笔:人一思考,上帝就笑。就是一个例。下操作可作左有什的?早就用啊?比如“char s[]="abcde"; s[2]='t';”。可是在的不是指针变量,而是“string s("abcde");”“s[n]”就不是简单操作一个内存了,而是从“[]函数中返回了一个可以做左,并不是想当然的事
 
 
标题::命名空using声明
实际工作中少用到cincout,但是我得要用它必先“using namespace std;”,至于么这样做,三个字:不知道。
  本从一开头就用到了cincout,但是它没有using,而是一次用到它都写成“std::cin”“std::cout”,同提醒说这两个字名是来自std命名空的。于是,我似乎明白了“using namespace std;”的作用。
  也C++在太作者迟迟不介更深入的内容,到了第一部分、第三章,没有打算深入using,但又不得不一点,于是提了这样两行:
using std::cin;
using std::cout;
  至此,究竟什是命名空,命名空是干什的,我是不懂。也许书后面会提吧
 
 
标题:文件
文件的用主要是代重用——重用不仅仅了减少工作量,可以保证每一次重用都是完全相同的内容。
  正因为头文件可以多次重用,所以要防止有些只能出一次的代进头文件中。比如量的定只能有一次,声明(含extern且不含初始化)却可以有多次。函数也是。
  引用:一些const象定文件中。
  笔:看到里,算想通了前面的困惑:const常量的作用域仅为一个文件。正如我前面的估const常量是不劈内存空的,代编译候就被直接替成常量。而且,编译多个CPP是分开编译的。所以,它必编译候知道常量的。如果常量的作用域也是全局的,那我告诉编译常量的在另一个CPP将使其无可适从。
  避免文件被重包含是个比有岐法,文件既然可以被多次包含,又要避免重包含?是因CPP文件的编译。在编译任一个CPP文件,都要知道文件的内容,所以,如果两个CPP都包含了同一个文件,那么头文件就要被编译两次。但是同一个CPP如果重复调——甚至可能循环调——了某一个文件,要及避免。#ifndef...#define...#endif可以起到个作用。
  了,我一直没想通VC++.NET“#pragma once”是怎工作的。它不需要用量来标记不同的文件?只需要一行也能标记出整个文件的所有内容?
  第一部分、第二章
 
 
标题:classstruct
首次考classstruct系源自我对类对象占用内存数的察。我发现VC++6CString——这么强大的——它占内存居然是4sizeof(CString)4)。那我就认为类对仅仅在内存中存放成员变量(《C++ Primer》称作数据成)而不存放成函数。后来,博士的《高C/C++程指南》,才看到了比法:C++classstruct没有本的区——我将话给我朋友看,他出不相信的神色。
  C++ Primer,我已熟知了classstruct系。但是我细细地没有放过书中的任何一个字,是作点记录吧:
  引用:用classstruct关键字定义类的唯一差在于默认访问级别:默情况下,struct的成员为public,而class的成员为private
  笔:不,一般情况下公司与公司间规协议时,喜写成struct,我想可能是源于程序C承来的习惯有就是协议内容一般只包含数据,不包含函数,也没有必要定安全的访问级别
  引用:程新手常会忘记类后面的分号,是个很普通的错误
  笔中将段文字作一个地雷,我是引用一下吧
 
 
标题::枚
是我向来不太喜用的西,几乎我见过都是这样的:
  enum weekday {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
  我看到里,是想:多浪啊,与其这样不如直接用0-6些数呢。以后要写“weekday Today = Sunday;”,哪有“int Today = 0;”舒服。
  本似乎早看透了我的心理,于是,不从枚入手,偏从const常量入手:
  引用:
  const int input = 0;
  const int output = 1;
  const int append = 2;
  这种方法也能奏效,但是它有个明的缺点:没有指出是相关联的。提供了一替代方法,不但定了整数常量集,而且把它聚集成
  笔:大就是大,他能切中要害,让读者明白准制定者的苦心。  
  另外,本儿冷不丁地提了一个冷冰冰的概念:常量表达式。
  引用:常量表达式是编译器在编译时就能够计算出果的整型表达式。整型字面常量是常表达式,……
  笔我先汗一个。常量表达式必需是整数?我怎不知道?那“double pi = 3.14159;”后面的字面不属于常量表达式是个疑,先下来。
  引用:枚举类型的象的初始化或赋值,只能通其枚或同一枚举类型的其它象来行。
  笔现实生活中的做人要有点相似,呵呵。简单,你选择了用名字来代替数,那就得始如一地使用名字,不可以用数或其它表达式。比如“weekday Today = Sunday;”不可写成“weekday Today = 0;”Sunday就是0
 
 
标题:typedef
期以来,我一直在疑惑:typedef要它干什?因没有它我照可以完成所有任。而有了它我反而得无法适。比如“UINT i;”不写作“unsigned int i;”?本短的三句我它存在的意
  引用:typedef通常被用于以下三目的:藏特定型的实现,更强调使用型的目的;复杂型定,使其更易理解;允种类型用于多个目的,同使得次使用该类型的目的明确。
  :第三目的我的启特大。以后就“typedef unsigned int age;”,呵呵。
 
 
标题::引用
引用是C++的特色,一般用在函数的参数中。按有些本的法,叫普通量的用法,指针变量的效果中本没有讲诉引用在函数参数中的用法,只提了给变量起个一个用竟本开头)。说实在的,如果撇函数参数,真想不到引用有什
  引用个概念本身也不理解(除了C程序有些不习惯以外),但是引用的符号却增加了理解它的度,我常在论坛上看到有初学者“&”“*”两个符号的疑惑,他们问问题可以非常基,但却表出了问题以理解的特点:
  C言中的指经够复杂的了,加再上一个引用,引用与指有着千系,就算了,而且用了“&”个符号。真初学者忙昏了。呵呵。下面四行程序,用到了两个“&”和两个“*”,但是它的意却全然不同:
int a;
int &b = a;//&
用在定表示量的性质为引用
int *c = &a;//*
用在定表示量的性质为&用在表达式中表示取地址
int d = *c;//*
用天表达式中表示取指针变量所指的量的
  写下以上文字,我得有些越了。些内容估在本后面会详谈的,我心急了点
 
 
标题:const常量的作用域仅为一个CPP文件
如果将量定放在任何{}的外面,则该变量是全局的,规则不适用于const常量。
  以前然心里隐隐约约个感,但是从未正面考虑过这问题。之所以隐隐约约有此感,是因认为编译器并不const常量劈内存空
  我曾经专门过测试:程序如下:
const int i = 5;
int *p;
p = (int *)&i;
cout << *p << "/t" << i << endl;
(*p)++;
cout << *p << "/t" << i << endl;
  测试结发现const常量也是可以通某些途径改的,但是改不起作用。我的解是,程器在生成机器码时将所有的i直接替成了5。使得上面两个cout句都成了“cout << *p << "/t" << 5 << endl;”
  回想起以前做测试,便不理解“const常量的作用域仅仅为它的CPP文件,因为编译器是对每CPP文件编译的,只有在才会去理会CPP系。然本才看了个开头还说将会在2.9.1看到const象局部于文件。我不打算跳式地阅读,所以,我是先保留我自己的理解吧。
  const常量也是可以成全局常量的,方法是在定候就加上extern。看到里,我于明白了《extern的困惑》中的困惑:原来,那有些多余,而且增加了出的可能性的做法在常量的理上派上了用
 
 
标题:量的作用域
作用域个概念是程序都耳熟能的知点。部分知我几乎可以跳,不阅读了相内容。阅读过程中是有体会的:
  有无数本曾提醒我:少用(尽量不用)全局量,多用局部量。其,即使是局部量,也有作用域大小的,局部量的作用域也是越小越好。原因自然和少用全局量一个道理。正如中所言:通常把一个象定放在它首次使用的地方是一个很好的法。
  以往,我使用局部是把它放在函数的开头,表示量在本函数中起作用。唯一的例外是for句的循环变量(for (int i=0; i<Max; i++);)。以后我就改改,把局部量的作用域小到仅仅用到它的
 
 
标题:extern的困惑
extern用来告程序:你不用我的劈内存空,你只要知道别处声明了。所以,我是在程序包含多个CPP文件这样用:
  1、在某一个CPP文件中直接定义变量,如int i = 0;
  2、其它CPP文件中声明量,如extern int i;
  但是,中介exturn可以用来定,如:extern double pi = 3.1416;特点是extern句包含量的初始化。
  我C++这样做有些多余,而且增加了出的可能性。因“extern double pi = 3.1416;”完全可以用“double pi = 3.1416;”来代替,这样做可以与声明划清界线竟定只能有一次,而声明可以无数次。如果没有个特性,可以程序员简单记为extern的只能有一次,extern的可以有无数次,而且extern不能指定初始一特性的支持,使原本简单规则变复杂,但没有来灵活(众所周知C++复杂是以高度灵活为补尝的)。
  个段落还让认识到了我以前使用extern的不足。我以往在同一个CPP文件中只使用一次extern,所以我往往是在文件部用extern句来声明一下量,这样然没有什么错,但却会致上下翻:有在文件的某一用到,想看一下它的声明,不得不把滚动条拖到上去看。如果在用到它的段落开头处再声明,明部声明要好一些
 
 
标题:量初始化
int ival(1024);//直接初始化
  int ival = 1024;//制初始化
  以前的我常用第二用法,原因很简单:从来没见过第一用法。直到后来学了林博士的《高C/C++程指南》。
  那本讲类的构造时说道:CMyClass b = a;这种形式看起来像赋值实际用的是拷构造函数。
  那本书给我的感觉仅仅停留在类变量的初始化中,一直没有渡到内置型。直到后来,我在用VC++.NET的向功能程序,才发现帮我生了似于“int i(100);”这种语法来初始化。
  本重点强调:初始化不是赋值
  引用:当定没有初始化的,系候会帮我初始化量。这时,系提供什么样取决于量的型,也取决于量定的位置。……内置量是否初始化取决于量定的位置。在函数体外定量都初始化0,在函数体内定的内置量不行自初始化。……类类型)通一个特殊的构造函数即默构造函数来实现的。个构造函数被称作默构造函数,是因它是运行的。……不管量在哪里定,默构造函数都会被使用。
  笔:林博士的《高C/C++程指南》中,如果没有定无参数构造函数或拷构造函数,系会自动产两个构造函数,它采用最简单值传递位拷来完成构造。
 
 
标题:量和量名
引用:象是内存中具有型的区域。
  笔话说得很直白,也只有这样面向C++工的才可以这样说竟初学者不知道内存与量的系,或者没考到。
  引用:C++保留了一些用作各操作符的替代名。些替代名用于支持某些不支持C++操作符号集的字符集。它也不能用作标识符(此量名,)。
  一般的只提到C++量名不可以使用关键字,本书还额外提了这样一句,然后列出一个表,有andbitandcomplnot_eqor_eqxor_eqand_eqbitornotorxor。不据我在VC++.NET测试些是可以用作标识符的。
  都说变量名可以含“_”可以用“_”开头,但我一直没有试过光光用一个“_”来做量名,正好习题里有,我就了一下,果然可以的
 
 
标题:cout << (wchar_t)
C++ Primer了,字符常量或字符串常量前加L,表示wchat_t型,于是我了一下:
程序如下:
char a = "a";
wchar_t b = L"a";
cout << a << endl;
cout << b << endl;
果如下:
a
0012FEBC
,怎现这果?
我再
程序如下:
char a = 'a';
wchar_t b = L'a';
cout << a << endl;
cout << b << endl;
果如下:
a
97
由此可cout<<运算符没有wchat_t的重(或不健全)
 
 
 
标题::内置型之精度选择
引用:……大多数通用机器都是使用和long型一样长32位来表示int型。整型运算,用32位表示int型和用64位表示long型的机器会出现应该选择intlong型的难题。在些机器上,用long算所付出的运行代价远远高于用int行同样计算的代价。……决定使用哪浮点型就容易多了:使用double型基本上不会有。在float型中式的精度失是不能忽的,而double型精度代价相float型精度代价可以忽略。上,有些机器上,double型比float型的算要快和多。long double型提供的精度通常没有必要,而且需要承担外的运行代价
 
 
标题::内置型之intbool
第一部分,第二章
  引用:C++定了个算术类型的最小存,但它并不阻止编译器使用更大的存,事上,int型,几乎所有的编译器使用的存都比所要求的大。
  笔:确如此,VC++intlong是一大。VC++.NET增加了_int64的支持。
  引用:字符型有两charwchar_twchar_t型用于展字符集,比如字和日
  笔:我怎不知道wchar_t?我自己用包含字的字符串用的也是char:(
  看到bool型,我心里VC++有些气。因VC++里有一个BOOL宏。它的原型“typedef int BOOL”。既然C++准已bool型,VC++加入BOOL的用意很明:迎合更多的习惯。但是,即使非要增加BOOL的支持,我认为原型应该这样“typedef bool BOOL”这样更易于理解。
  当然了,期以来我一直没有注意到bool也不应该但是正是BOOL的存在,阻碍了我bool的理解。
 
 
标题::第一章:快速入
第一章:快速入
  本章的存在使本书变得不像一本,似乎成了门书可能是后来版本新加入的内容。以至于一章被排除在任何一个部分之外。
  本章无厘要介cincout、注whileforif等概念。这么西,一个都介点皮毛,然后合成一个例。
  我称其无厘有以下原因:如果本不了解C++者,那么这一章似乎是有用的,但是C++的入者使用本书显然很,我不了解国外的情况怎,至少我身的人是这样;如果本了解C++者,那西都不用介者也可以看懂那个,而且所也没有存在的必要。
有一个小小的收
int main()
{
  return -1;
}
如果返回值为-1WindowsCMD中运行也没有任何外信息,Windows并不告运行失
 
标题::《〈C++ Primer阅读》前
之前,我已一段C++程序的史,如果C言也算在内,可以追溯到十年前。用BASIC程序的有十四年(1992-2006)
  程序中所使用的参考无非有两:介算法的和介绍语法的。我所的参考往往是同两者的。而对语法的介只是基于某一个编译器。
  于是,十年来,我所学“C/C++”,从本只是Turbo CVisual C++C/C++本身的理解也是被编译过滤的内容。不是我不想去了解C/C++的本,只是我C/C++法典有着与生来的恐惧。
  个恐惧直到我发现了《C++ Primer中文版》,当我捧起C++,我于能理解么每有几十万人冒着被死的危前去朝圣。
  我用来比喻这,我知道这样并不合适,因为绝大多数中国人并不知道的地位,但是我搜遍大一个角落也找不到其它合适的比源于中国人缺乏信仰。
  在半年前,我曾经带着无限的敬仰阅读了林博士的《高C/C++程指南》,并且及/修正了我的习惯。当然了,正如《C++ Primer》所言:CC++程序的正确格式存在着无休止的争……”。所以,我所修正的只是自由体,而不是与林矛盾的方面。令我感到欣慰的是,《C++ Primer》居然也用一定的笔默来格式与格,不同的是,它同种风格,然后作出一个略带倾向性的建。同诫读者:一旦选择了某种风格,就要始如一地使用。
  从在起,我就要捧起一本四五厘米厚、七百多的圣,在阅读过程中,免会有重点、要点要记录。我比较爱书,不愿在上做标记,只好选择BLOG这种形式来做读书
  以此作我的BLOG明吧 
原创粉丝点击