您的位置:首页 > 编程语言 > C语言/C++

C++ Primer 笔记 第二章

2012-09-02 00:28 127 查看
第二章

1、数据的类型决定程序可以对数据进行哪些操作,同时也决定了程序对这个数据的解读方式,例如如果是int,则将其解释为一个整数。
2、关于取值范围
     例如8位signed类型的取值范围是-128~127,其中,上限:0111,1111(最大正数,标志位1为负,0为正)=2^7-1=127,下限1000,0000(这个是补码,要查看原值,必须将补码转成原码,即-1,再取反,且为负数),-1后:0111,1111,取反:1000,0000
为-128.具体见

           整型数在计算机里面都是按照“补码”来存储的,补码是什么呢?请看:

0. 补码的最高位,代表符号位,0为正1为负

1. 对于正整数,补码和该整数的二进制码一样

2. 对于负整数,相当于对其绝对值的二进制码按位取反,然后+1,最后再把符号位置为1(当然还可以有更简便的算法【数学里面叫有限域的算法,用模运算来计算可能比较符合一般习惯一点】,不过逻辑电路层面是这么实现的,个人认为这么说明比较底层一点:D)

来几个直观的例子:

+3的补码是0000 0000 0000 0011

-1的绝对值为1,按位取反为1111 1111 1111 1110,+1之后是1111 1111
1111 1111,再置最高位为1,于是最终结果就是1111 1111 1111 1111

再来看-2,绝对值为2,于是二进制表达为0000 0000 0000 0010,按位取反为1111
1111 1111 1101,+1之后(再置最高位为1)是1111 1111 1111 1110

从数学上看,正好-2就像是在-1的基础上“减一”得到了

好,那么一直这么算下去,于是

1000 0000 0000 0000

这个是多少呢?

按照补码的规则,他可以是+32767(0111 1111 1111 1111)再加1得到~然则最高位是符号位,这又是一个负值,按补码解析的时候,这必须是一个负值...

好,稍微扯远一点点,-32767的补码是多少?是:

1000 0000 0000 0001

再减一呢?就得到了

1000 0000 0000 0000

于是把这个解析为-32768是合理的~~~

3、变量的左值与右值
     左值:变量出现在左右均可(左值就是变量的地址);
     右值:只能出现在右边(右值就是变量的值)。
4、保留字
     注意goto是保留字,但是go to 可以作为变量名使用。
5、变量初始化的两种方式

直接初始化:int val(1024);    //直接将val赋值为1024
复制初始化:int val=1024;  //先是创建一个临时int对象temp,令其值为1024,再将temp复制给val
     所以对于某些自定义的类类型,初始化时一般是直接初始化,若用复制初始化则可能需要自己写copt constructor.
6、变量初始化规则

内置类型变量的初始化

          函数体外定义:默认为0;
          函数体内定义:不自动初始化。

类类型初始化

          通过构造函数实现。
7、const
     作用:将一个变量设为只读的,注意在定义const变量时要同时初始化,并且const变量时不允许修改值的。
     const对象默认为局部变量。
8、引用

const对象必须被初始化
     引用必须用与该引用同类型的对象初始化:

          int val=1;
          int $ref=val;  //ok,引用ref的类型与被引用变量val的类型一致
          int  &ref1;  //error,定义引用的时候要同时初始化
          int &ref2=1;  //error,1的类型为int,引用ref2的类型为int

     引用是别名,通过引用访问原对象与使用对象的名字访问效果一致
     const引用

          cosnt引用是指向const对象的引用:
               const int val=1;
               const int &ref=val;     //ok,类型都是const int
               int &ref1=val;  //error,from const int to int

9、typedef:相当于给某个数据类型取个别名;
     如:typedef double wages;  //wages是double的别名
10、枚举类型
     //input is 0, output is 1, append is 2
     enum oper_modes{input, output, append};

     枚举成员是常量,不能改变其值,并且默认第一个为0

     如:input=5;     // error, input is a constant
11、用struct和class关键字定义类的唯一差别是默认访问级别:默认情况下,struct的成员为public,而class的成员为private。
12、

    c++中,定义只可以出现一次,而声明则可以声明多次。
    因为头文件包含在多个源文件中,所以不应该含义变量或函数的定义。(为避免重复定义)
     头文件可以定义const对象和inline函数。
13、预处理器
     避免多重包含:
     #ifndef SALESITEM_H  //如果SALESITEM_H未定义,则定义它;否则跳到#endif的下一个语句执行。
     #define SALESITEM_H
     #endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息