c++是静态类型语言(static type),编译时执行类型检查。所以,程序中使用某个名字前,必须先告知编译器该名字的类型。
除了内置数据类型(int等),允许用类自定义数据类型,称为“类类型”(class type)。
一、基本内置类型
1.arithmetic type:整数、浮点数、字符、布尔值、void。存储空间与机器有关(java的存储空间固定)。
1)整型integral type:整数、字符、布尔值。字符类型包括char和wchar_t:char为单字节,wchar_t为扩展字符集。整数类型包括short、int和long。 bool类型表示true或false,可将任何非0算术值赋给bool类型表示true。
除bool类型外,整型均有无符号和带符号类型两种,默认为signed,无符号的前加unsigned。当将一个超出取值范围的值赋给指定类型的对象时,编译器会调整越界值使其满足要求。unsigned类型会对可能取值求模,取所得值。负数总是超出unsigned的取值范围。如将-1给8位unsigned char,结果为255(-1对256求模后得255)。
整型可用于计数,使用unsigned可避免值越界导致结果为负。算术运算很少用short,可能隐含赋值越界错误,若机器截断wrap around,会产生很大的负数。char主要用于存储字符而不用于计算。所以,大部分应用int进行整型计算,long计算代价远高于int。
2)浮点型:float单精度(32位)、double双精度(64位)、long double扩展精度(96或128位)。float有隐式的精度损失,double计算代价相对于float可忽略(有些机器double计算甚至比float快),long double精度常没必要,运行代价高。
3)literal constant:只能用值称呼,且值不能修改,有对应的类型(如42.1是double型)。只有内置类型有leteral constant,类类型和标准库类型均没有。整型字面值可用8,10,16进制表示,类型为int或long(无short),后可加L,U。浮点字面值可用十进制或科学计数法表示,默认类型为double,数值后加F/f表示单精度,加l/L表示扩展精度。布尔字面值为true、false。字符型字面值加单引号(L'a')。
2.const限定符:提高程序的可读性、可维护性。
定义时必须初始化,定义后不能被修改。默认为文件的内部变量,若指定const变量为extern,可以在整个程序访问const对象。9(非const变量默认为extern)。
3.引用reference:是一种compound type(复合类型指 用其他类型定义的类型),主要用作形参。
通过在变量名前加&来定义,每种引用类型都关联到某一其它类型,不能定义引用类型的引用。必须用 与该引用同类型的对象初始化。
只是它绑定对象的别名,对引用的所有操作实际作用于该引用绑定的对象。
特:const引用---指向const对象的引用。不能用非const引用指向const对象。const引用可初始化为不同类型的对象或初始化为右值。eg. const int &i = 1; double a = 1.01; const int r = a;(编译器:int temp = a; const int r =temp;)
4.typedef:定义类型的同义词。
枚举:enum name1{eumerator1=0,enumerator2=0,....};枚举成员为常量,成员值可以不唯一。枚举类型对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的对象进行。
5.类类型:
从操作开始设计类---每个类都定义了接口interface和实现implementation,接口由操作组成,实现包括数据和类需要但不供一般性使用的函数;
类定义:class className{public:... private:.....}; 成员默认为private。 struct structName{public: .... private:....};成员默认为public。
6.头文件.h:由多个文件组成的程序中,将名字的使用和声明连接起来。
包含类定义、extern变量的声明、函数声明。原则:头文件不能太大,否则编译时间长;头文件中的声明在逻辑上应该适于放在一起。
因为头文件包含在多个源文件中,故不应该含有变量或函数的定义。只有三类定义:类、const对象、inline函数。
在源文件中,用#include包含头文件。#include <standard_header> #include "my_file.h"
头文件可以多次包含在同一源文件中。为避免多重包含,用预处理器变量(大写字母)。
#ifndef PREVARNAME 测试预处理器变量(变量名唯一)是否未定义。若已定义,跳过该指示到endif之间的代码。
#define PREVARNAME
#endif