Chapter 2. Variables and Basic Types
1.基本内置类型(Primitive Built-in Types)
![](http://7xkpdt.com1.z0.glb.clouddn.com/16-2-29/81663937.jpg)
除了算数类型外还定义了一种称为void的特殊类型。
算数类型是如何在计算机中存储的?
- 每一个字节和一个称为地址的数关联起来
- 要让地址对应的字节有意义,我们需要知道存储在该地址的值得类型,从而知道需要多少位和如何解释这些位。
可以将算数类型的任何值赋给bool对象。0值算数类型代表false,任何非0都代表true。
signed and unsigned types. 前者可以表示正负0,后者只能表示非负数,即正数和0。
C++中,把负值赋给unsigned对象是完全合法的, -1赋给8位的unsigned char,那么结果是255,因为255是-1
对256求模后的值。
浮点型,float一般用一个字(32位)来表示,只能保证6位有效数字。而double型一般用两个字(64位)来表示
,至少是10位有效数字。
因为C++的整型数设计的很开放,就像C语言一样,能够在有必要的时候直接处理硬件,所以对大多数程序员来
说,应该通过限制实际使用的类型来忽略这些复杂性。
比如用整型计数的时候,当你统计标准库容器元素的个数的时候,最好用标准库为你定义的计数类型,除此之外,
使用unsiged比较明智,因为可以避免越界导致结果为负数的可能性。
1. 整型算数运算的时候,尽量别用short,以防止赋值越界,后果可能是产生一个很大的复数。
2. 用32位表示int,64位表示long的机器,会出现选择int还是long的难题, 用 long 类型进行计算所付出的运
行时代价远远高于用 int 类型进行同样计算的代价,所以选择类型前要先了解程序的细节并且比较 long 类型与
int 类型的实际运行时性能代价。
3. 决定使用哪一种浮点型就容易多了。使用 double 类型基本上不会有错。在 float 类型中隐式的精度损失是不
能忽视的,而 double 类型精度代价相对于 float 类型精度代价可以忽略。事实上,有些机器上,double 类型比
float 类型的计算要快得多。long double 类型提供的精度通常没有必要,而且还需要承担额外的运行代价。
2.字面值常量 (Literal Constants)
表示内置类型的值的常量就叫做字面值常量,而类类型或者标准库类型都没有字面值。
整型:
20 // decimal 10进制
024 // octal 8进制
0x14 // hexadecimal 16进制
128u /* unsigned */ 1024UL /* unsigned long */
1L /* long */ 8Lu /* unsigned long */
没有short类型的字面值常量
浮点型(默认的浮点字面值常量为 double 类型):
3.14159F .001f 12.345L 0.
3.14159E0f 1E-3F 1.2345E1L 0e0
3.14159E0f 1E-3F 1.2345E1L 0e0
布尔型的字面值 true false
打印型字符的字面值
'a' '2' ',' ' '
L'a' //宽字符,wchat_t类型
非打印型的字符 例如 \n \b
另外,我们可以用反斜杠加数字来表示通用转义字符,注意:此处的数字默认是八进制,如需用十六进制需要
写成,\xddd,d为一个或多个16进制数字组成
\7 (bell) \12 (newline) \40 (blank)
\0 (null) \062 ('2') \115 ('M')
字符串字面值 “HelloWorld”编译器自动在末尾加上一个空字符。因此'a'和"a",后者由'a'和'\0'组成。
同理也有宽字符串,L"helloworld",里面的每一个字符都是宽字符。包括最后的\0。
两个相邻的仅由空格、制表符或换行符分开的字符串字面值(或宽字符串字面值),可连接成一个新字符串字
面值:
// concatenated long string literal
std::cout << "a multi-line "
"string literal "
"using concatenation"
std::cout << "a multi-line "
"string literal "
"using concatenation"
<< std::endl;
连接字符串字面值和宽字符串字面值的行为是未定义的。结果是受很多因素影响的。不要依赖未定义行为,尽
量杜绝出现。
C++允许用反斜杠来连接语句:
// ok: A \ before a newline ignores the line break
std::cou\
t << "Hi" << st\
std::cou\
t << "Hi" << st\
d::endl;
// multiline string literal
std::cout << "a multi-line \
string literal \
using a backslash"
<< std::endl;
return 0;
std::cout << "a multi-line \
string literal \
using a backslash"
<< std::endl;
return 0;
}
后继行的行首的空格会算到字符串里面,因此不能有缩进。
3.变量(Varible)
为什么要有变量?
- 变量可以重复利用并计算,减少代码冗杂。
- C++是强静态类型语言,在编译时会检查,操作对象是否能够被这样子操作,这种机制能使得在程序越来
越复杂的时候,帮助我们更早的发现错误。
什么是变量?
变量提供了程序可以操作的有名字的存储区。
什么是对象?
内存中具有类型的区域。
我们可以自由地使用对象描述程序中可操作的大部分数据,而不管这些数据是内置类型还是类类型,是有名字的
还是没名字的,是可读的还是可写的。
规定变量命名要以字母或下划线开头,变量命名习惯最重要的是保持一致。
变量定义:
double salary, wage; // defines two variables of type double
int month,
day, year; // defines three variables of type int
std::string address; // defines one variable of type std::string
int month,
day, year; // defines three variables of type int
std::string address; // defines one variable of type std::string
变量初始化和赋值是两种不同的操作。直接初始化语法更灵活效率更高。
变量初始化方式是多变可以混合的,具体如下。
#include <string>
// ok: salary defined and initialized before it is used to initialize wage
double salary = 9999.99,
wage(salary + 0.01);
// ok: mix of initialized and uninitialized
int interval,
month = 8, day = 7, year = 1955;
// ok: both forms of initialization syntax used
std::string title("C++ Primer, 4th Ed."),
publisher = "A-W";
double salary = 9999.99,
wage(salary + 0.01);
// ok: mix of initialized and uninitialized
int interval,
month = 8, day = 7, year = 1955;
// ok: both forms of initialization syntax used
std::string title("C++ Primer, 4th Ed."),
publisher = "A-W";
extern是声明,任何变量都需要声明或定义。
命名一样的时候,局部变量屏蔽全局变量。
for(int i=0;i<2;i++) 此处的i作用域在for循环外面。
4.const限定符
非const变量默认为extern,所以不用显式声明为extern。但是在一个文件中的全局变量如果是const类型的
话,要让它可以在别的文件中可用,就必须显式声明为 extern const
5.References引用
引用是一种符合类型,是一种别名。
普通引用应该绑定到它的对象上。
不能把普通引用绑定到const类型,只能将其定义为const引用。 const int a = 100; const int &b=a;
double a=1.0;
int &b = a; // 不允许
const int &b = a; //允许。此处的a会被强制转换为int型。
6.typedef 名字
现有数据类型的同义词
7.Enumerations枚举
enum成员的值可以一样
// point2d is 2, point2w is 3, point3d is 3, point3w is 4
enum Points { point2d = 2, point2w,
enum Points { point2d = 2, point2w,
point3d = 3, point3w };
枚举类型是唯一的类型,枚举成员是常量。不能将其他类型的值赋给枚举类型,只能在初始化的时候赋给
它,而且初始化的值也只能是常量表达式。
8.Class类
和Struct的区别,仅仅只是默认访问级别不同,class是p'rivate,而struct默认为public。
9.头文件的编写和预处理技术
头文件用于声明而不是定义,一些const对象可以定义在头文件里的时候,是需要用常量表达式初始化的。
避免重复包含,可以用预处理器变量
#ifndef SALESITEM_H
#define SALESITEM_H
// Definition of Sales_itemclass and related functions goes here //
#endif
#include <standard_header> //一般是这样来自定义头文件的,尖括号表示标准头文件