C++Primer读书笔记知识点

C++Primer读书笔记知识点

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却不一
也没法,因为绝大多数++