督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正。
一:大小端的概念
二:浮点数的机器级表示
三:c++的基本的内置类型:
1)算术类型,又包括:
整型(包括:整数int、short、long int类型,单个字符(分为存储单个机器字节的char类型,1个字节,char有三种不同的类型,普通char,unsigned char和signed char,一共两个表达方式unsigned char和signed char。和存储汉字和日语等的扩展字符集的wchar_t类型,2个字节),布尔值0,1)。
整型又分为无符号和有符号的(除bool类型之外)
在选用整数类型的时候,一定先分析好大概范围,一些机器int和long int一样,如果贸然总使用范围很大的类型,则额外代价较高,总用范围娇小的,又容易溢出。
浮点型,float,double,long double。一般用double就足够了,且很多经典书籍都建议使用double,少用long doouble,因为一没必要那么高精度,二运行起来代价额外很大。
2)还有一种void ,空类型。
问题1:在输出汉字字符串的时候会乱码,一般解决方案是字符串前面加l,why?
这是在说明字符串的字面值是宽字符wchar_t, l"大家好!" 这样表示就可以了。因为编译器有时候默认使用unicode字符集,不加l显示的日文或者韩文,l代表宽字符
问题2:针对模的问题


4294967296模4294967296就是0
//%运算符只能用于整数相除求余,运算结果的符号与被除数相同,绝对不能用于实数。
//被除数=商 x 除数 + 余数
//余数的绝对值一定小于除数的绝对值


问题3:没有short类型的字面值常量
字面值常量比如:
有无符号int类型111u,有默认带符号的int类型111,有long int类型111l,有无符号long int类型111lu或者111ul,有默认的double类型,1.1,有单精度类型1.1f,有扩展精度类型1.1l,有true,false的bool字面值,有字符和字符串类型的字面值。就是没有short int类型字面值!
问题4:多行字面值的表示


针对第三行代码,\ 虽然可以实现多行字面值字符串的输出输入,但是有局限,\ 必须在本行末尾,后面不能有注释和其他字符,且后续行bbbb前面的空,都算作了字符串字面值的一部分,故出现如图第三行所示的情况,解决办法:
问题5:程序尽量的不要过多的依赖机器
比如,int在win32下是一个长度,也许换个机器就不一样了,如果有,最好是在依赖处都有说明,否则程序移植起来很困难。
问题6:c和c++的变量为什么要先声明还要定义名字,使用前为什么还必须先定义变量或者常量的类型?
c/c++是静态类型的语言(编译时做类型检测),对程序的操作是否合法都是在编译期间检测,故编译器必须能够识别程序内每个实体,对于不是关键字的且没有呗引号括起来的符号,对于c/c++编译器来说,它是不认识的,如何让编译器知道这个单词是什么意思呢?
所以就有了声明(declare)。编译器每次开始工作,不知道有哪些变量,不知道有哪些函数,也不知道有哪些符号常量,它不是人!如从代码里读了一个单词,既不是关键字,又不是自己认识的东西,编译器就认为这是一个没有声明的东西,因为不认识它,所以不知道如何处理。所以“声明”,就是告诉编译器有这么一个东西。声明的时候主要做四件事:
一是建立变量符号表
声明变量,编译器可以建立变量符号表,如此,程序用到多少变量,每个变量类型是什么,编译器非常清楚,是否使用了没有声明的变量,编译器在编译期间就可以发现,从而帮助了程序员远离由于疏忽而将变量名写错的情况。
二是变量的数据类型指示系统分配多少内存空间
数据类型指示系统如何解释存储空间中的值。同样的数值,不同的类型将有不同的解释。32位机器,一般情况下,int占4个字节,float占4个字节,在内存中同样存储二进制数,且这个二进制数也没有标志区分当前是int还是float型,那么如何区分?就是通过变量的数据类型来区分。由于声明建立了变量符号表,所以系统知道变量存储空间该如何解释。
三是变量的数据类型确定了该变量的取值范围
例如短整型short的数据取值-32768~32767之间。
四是不同的数据类型有不同的操作
比如,模运算,不能用于浮点数。如下:


问题7:理解初始化和赋值是两个完全不同的概念
c++支持两种初始化方式,复制初始化(使用=),和直接初始化(常用于构造函数的初始化列表),且使用直接初始化,语法更灵活,效率更高(对内置类型没什么区别),专家推荐多用!
初始化:创建新的变量,并给变量赋一个初始值的过程。
赋值:变量早在前面声明过,且有了初始值,此时再给它一个新值(把前面的值擦掉)的过程。
注意


问题8:关于自动初始化
在函数外定义的变量自动初始化为0,函数内就不会自动初始化,且对于c和c++的基本内置类型,最好定义的同时就初始化,即使当下没用。


针对c++,还需要考虑类的构造函数
问题9:变量定义和声明的区别
因为c和c++经常是多文件开发,故有了声明和定义
变量的定义是为了给变量分配内存,指定初始值,一个变量只能有一个定义存在。
声明变量,是告诉程序变量的类型和名称
即定义也是声明,因为定义变量的同时,也声明了变量的名字和类型,一个变量可以有多次声明,但是定义只有一次!因为声明仅仅指定名称和类型,不分配内存!
通常用关键字extern专门进行变量的声明,而不定义。告诉本文件,这个变量已经定义在了其他文件。俗称外链接。


同样,声明也可以变为定义,如果声明有初始化,那么就变为定义,针对extern语句仅仅在函数外部(拥有文件作用域范围),才可以变为定义,否则出错!


回忆,多文件开发,都是在一个文件进行变量的定义,而其他文件使用这些变量就仅仅需要包含这些变量的声明 即可,无需(也不可以)重定义。
再看:


问题10;避免硬编码


这样做,如果常量定义出错,或者被无心的修改,那么可以被编译器立马检测出来!程序健壮性提高!因为常量定义后不能被修改,故常量定义的同时必须马上初始化!
问题11:引用初步探讨
多个方法定义多个引用没问题,记住:引用就是外号而已!不占新的内存空间,和原数值共享内存空间。
注意,引用必须初始化!因为引用必需要绑定到一个实体对象!故不能是引用的引用。也不能不初始化!


引用一旦绑定一个对象,不能再绑定其他对象
引用要注意字面值常量的绑定问题
同理,const常量必须用const引用来绑定!
注意引用和不同类型变量的绑定问题
原因:对于不同类型的引用绑定过程,编译器内部做了这样的优化,先针对int类型的i = 512,自动生成一个double类型的临时变量
再让double引用去绑定temp,而不是我们看到的直接绑定int i=512;
故这里有一个问题,现在refi是非const类型,那么说明可以对refi也就是i修改,但是事实上,我们修改只是修改了temp,不会对原值i修改,这违背了引用的初衷,故这样是定义为不合法的行为。同理,使用const引用就ok了,因为仅仅是使用i的值,并不修改,这样是完全合法的。
问题12:尽量多用枚举定义常量
//c++的枚举类型可以省略美剧名字,也可以加上名字,枚举本身就是常量表达式!不能修改它的成员!


//使用枚举定义de 常量,是真正的常量!不受限于类的对象!且有很好的可读性!含义的聚集性!
比如在类中定义const成员,我们不能在类里初始化,必须创建对象的时候,构造函数初始化。看似是常量,但是针对的只是某一个对象,其他对象的话,仍然可以去初始化属于自己的那一份const成员。并不是真正的constant!而枚举就无所谓这个问题。


//枚举是一种类型!可以定义枚举类型的对象,同理也可以给枚举类型的对象赋值。赋值,必须是这个枚举类型的成员,或者是同一枚举类型的其他的枚举对象!


问题13:c++也支持结构类型
区别就是c++的结构里,可以有函数,且默认的成员访问属性是public,而class是private。
问题14:回答问题,类a里的private成员int a;都是谁能直接去访问?
千万不能忘记友元!当然还有类a内部的组成部分也可以直接访问。
问题15:规范化的头文件
头文件不应该含有变量或者函数的定义!只能有声明!但是头文件也有例外,那就是头文件可以定义类,头文件可以定义编译时就知道具体值的const对象,可以定义inline函数。
问题16:什么是常量表达式?
编译器在编译的时候,就能够计算得出表达式的明确结果的表达式!表达式由常量表示:
两个关键点:一是必须是编译的时候就能计算出明确结果的表达式,二是表达式组成部分都必须是常量,不能包含变量,比如1+2是常量表达式,整型字面值常量就是常量表达式,枚举常量也是常量表达式!如果定义a为常量1,那么a+2也是常量表达式。如果定义变量a,那么a+2就不是常量表达式。
问题17:解答前面const对象默认在函数外部定义,为什么是局部作用域?(需显式的加extern才是全局的,不同于一般变量)
15说了,头文件只能有声明,但是const常量的定义却可以,因为c++里,const常量在函数外部定义的话,c++规定为局部变量(本文件可见,而本文件外的本程序其他文件不可见),故不会造成重定义现象。
注意更深层次的原因:
如果const对象使用常量表达式初始化,那么该变量(变为常量的变量,仅仅说的是这个变量,不是常量表达式本身!)不会被分配内存空间,因为绝大部分的编译器编译时,都直接使用的相应的常量表达式来替换掉该const变量,这需要理解!所以,如果const对象在头文件内的函数外部没有被常量表达式初始化,那么就不应该定义在头文件,应该和其他变量一样定义在源文件并初始化。然后在头文件添加extern声明即可被共享。比如:
这里具体意思应该是说,头文件的const,一方面,定义在了函数外部,是局部作用域,局部的那就是互不影响!另一方面,就是大部分const变量都是用常量表达式初始化!上面说了,编译器不会为这样的const变量分配内存,而是使用对应的常量表达式替换该变量名!等价于,声明!那么这里有一个名词叫:
常量折叠
至今没有找到一些权威的论证,网上的各个论坛博客,都说的有一定的道理,但是具体细节又各有不同的争论,还没有什么权威的说法,具体涉及到了编译原理的知识。
再说说c语言里的const常量
《c primer plus》一书清晰的说到:c语音里的const定义的常量,不被看为常量,而是只读变量!《c和指针》一书也说到,c中const定义的常量,仅仅能用在应该使用变量的地方,比如设置数组维数,使用const定义的常量就报错!当然这是c99之前。如今c99也支持了这一做法!如下:


问题18:给头文件设置头文件保护符,避免重定义,也就是多重包含


辛苦的劳动,转载请注明出处,谢谢……http://www.cnblogs.com/kubixuesheng/p/4116354.html