第2章 变量和基本类型

来源:互联网 发布:淘宝联盟2016 编辑:程序博客网 时间:2024/06/11 08:52

2.3.1、什么是变量

    左值(lvalue):可以出现在赋值语句的左边或右边。如变量。

    右值(rvalue):只能出现在赋值的右边,不能出现在赋值语句的左边。如常量。

(p40)一般而言,对象就是内存中具有类型的区域,计算左值表达式就会产生对象。

(p41)C++关键字。冷僻关键字:关键字mutable只能用于类的非静态和非常量数据成员,如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员。但是有些时候需要在该类函数中对类的数据成员进行赋值。这个时候就需要用到mutable关键字了;还有asm用于内联汇编即插入汇编语言等。

(p41)除了关键字,C++标准还保留了一组标识符用于标准库。标识符不能包含两个连续的下划线,也不能以下划线开头后面紧跟一个大写字母有些标识符(在函数外定义的标识符)不能以下划线开头。

2.3.3、定义对象

    C++初始化变量有:复制初始化(用=赋值)和直接初始化(把初始化式放在括号中,如int v(1024),直接初始化语法更灵活且效率更高)。

    初始化不是赋值:初始化指创建变量并给它赋初始值,而赋值则是擦除对象当前值并用新值代替。

(p44)2.3.4、变量初始化规则

    内置类型变量是否自动初始化取决于变量定义的位置。在函数体外定义的变量都初始化成0,在函数体里定义的内置类型变量不进行自动初始化。

2.3.5、声明和定义

    变量的定义(definition)用于为变量分配存储空间。还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。(定义不一定包括初始化)

    声明(declaration)用于向程序声明变量的类型和名字。定义也是声明。可以通过使用extern关键字声明变量名而不定义它。如声明但不定义(在main函数外面,函数内部会错):extern int i;声明并且定义:int i;extern声明不是定义,也不分配存储空间。程序中变量可以声明多次,但只能定义一次。extern double pi = 3.1415属于定义了pi,分配并初始化了存储空间。

2.3.6、作用域

    定义在所有函数外部的变量名具有全局作用域;定义在函数中有局部作用域;定义在语句块中具有语句作用域。定义了相同的变量名,三个域前者在后者所在的域不可见

2.4、const限定符

    const对象默认为文件的局部变量。

    常量const定义式必须初始化。并且对于非const变量默认为extern(关注点是它可以在其他文件中访问,这个与2.3.5并没有矛盾,在文件一定义了int i,这在文件二通过声明extern int i可以访问,而文件一必须要定义extern const int j=1,文件二才能声明j,const不带extern则不能访问,要使const变量能够在其他的文件中访问,必须显示地指定它为extern。

2.5、引用

    引用(reference)是一种复合类型(指用其他类型定义的类型),通过变量名前添加“&”符号来定义。不能定义引用类型的引用。引用必须用与该引用同类型的对象初始化,引用必须初始化(int &refVal;及int &refVal=10;都是错的,必须赋值且是对象)。

    当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象。不可能将引用绑定到另一个对象

    可以定义多个引用。const引用是指向const对象的引用。const的引用不能重新赋值,且用普通非const引用绑定const对象是不合法的。

    const引用可以初始化为不同类型的对象或者初始化为右值。如:constint &r = 42;

       const int &r1 = r+1;但如果去掉任意一个const,则有错误。double pi = 3.1;

       const int &r = pi;这边编译器会创建一个临时int变量存储(int)pi,再r引用该临时变量,如果非const也可以,就会产生你修改r值,其实修改的是临时变量值,pi依然不变,这就有问题了。因此,由上面可知非const引用只能绑定到与该引用同类型的对象(不能成为右值)。const引用则可以绑定到不同但相关类型的对象或绑定到右值

2.6、typedef名字

       typedef double wages;以关键字typedef开始,后面是数据类型和标识符。用这个的目的:(1)为了隐藏特定类型实现,强调使用类型目的;(2)简化复杂的类型定义,使其更易理解。(3)允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。

2.7、枚举

       enum Points{point1, point2 = 2, point3, point4=3,point5};初始化枚举成员的值必须是一个常量表达式(它是编译器在编译时就能够计算出结果的整形表达式。int a=1;a*a则不是常量表达式,因为编译期间计算不了)。

       枚举类型的对象初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。如:enumPoints{point1,point2 = 1+1,point3 = point1,point4};不能单独Points p = 3;上述这是错误的。Points p = point1;这是对的。

2.8、类类型

       类定义以关键字class开始,其后是该类的名字标识符。类体位于花括号里面。花括号后面必须要跟一个分号!!。这与java不同。

       类体可以为空。类体定义了组成该类型的数据和操作,它们成为类的成员。操作称为成员函数,数据则称为数据成员

       一般不能把类成员的初始化作为其定义的一部分。当定义数据成员时,只能指定该数据成员的名字和类型,通过构造函数初始化。

       访问标号public、private可以多次出现在类定义中,给定的访问标号应用到下一个访问标号出现时为止。

       C++支持另一个关键词struct,它也可以定义类类型。如果使用class关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为private(java则是default)。如果使用struct关键字,那么这些成员都是public。使用class还是struct关键字来定义类,仅仅影响默认的初始访问级别

2.9、编写自己的头文件

       头文件一般包含类的定义、extern变量的声明和函数的声明。因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义(定义只能出现一次,而声明可以出现多次)。同一个程序中有两个以上文件含有头文件变量或函数定义,都会导致多重定义链接错误

       对于头文件不应该含有定义这一规则,但有三个例外,头文件可以定义类、值在编译时就已知道的const对象(因为要被其他文件访问,必须是“extern const 类型 类型名=值”这样的形式)和inline函数。

       如果const变量不是用常量表达式初始化(例如是函数返回值),那么它就不应该在头文件中定义。相反,和其他变量一样,该const变量应该在一个源文件中定义并初始化。应在头文件中为它添加extern声明,以使其能被多个文件共享。

2.9.2、预处理器的简单介绍

       头文件要避免多重包含,方法:

#ifndef **.h

#define **.h

这边书写头文件内容

#endif

       头文件在<>尖括号里,认为该头文件是标准头文件,编译器会在预定义的位置集查找该头文件。若是“”引号,则认为它是非系统头文件,查找通常开始于源文件所在的路径。
原创粉丝点击