1. 在C++的数据类型表示中,通常 char为1个字节,int为4个字节,double为8个字节。
每个字节占8位,占8位的原因是:8位就可以有255个高低电频的状态,足够表示英文字符和数字以及一些符号的数量。
计算机中的位概念:
二进制数系统中,位,简记为b,也称为比特,每个0或1就是一个位(bit),位是数据存储的最小单位。其中8bit就称为一个字节(Byte)。计算机中的CPU位数 指的是CPU一次能处理的最大位数。例如32位计算机的CPU一个机器周期内可以处理32位数据0xFFFFFFFF
2. 左值和右值的概念:
左值就是变量的地址,或者是一个代表“对象在内存中的位置”的表达式。
右值就是变量的值。
变量名出现在赋值运算符的左边,就是一个左值,而出现在赋值运算符右边的变量名或字面常量就是一个右值。
3. 初始化:
C++中支持两种初始化:[直接初始化语法更加灵活而且效率更高]
a> 复制初始化 int val = 1024;
b> 直接初始化 int val(1024);
在C++中,初始化不是赋值。初始化是创建变量并给他赋值,而赋值是擦除对象当前值并用新值代替。
注:对于内置类型来说,复制初始化和直接初始化几乎没有差别!对于类类型的初始化来说直接初始化类似于调用类的构造函数
如果定义变量时没有初始化变量的值,系统会帮我们初始化。系统提供的值取决于变量的类型,也取决于变量定义的位置。
内置类型变量:在函数体外定义的内置类型变量都初始化成0; 在函数体内定义的内置类型变量都不进行自动初始化 [建议每个内置类型的对象都要初始化]
4. 变量的声明和定义:
变量的定义用于为变量分配存储空间,还可以位变量指定初始值。在一个程序中,变量只有一个定义。
变量的声明用于向程序表明类型和名字。变量的声明包括:对象名,对象类型和关键字extern:[extern int i]
声明是不分配存储空间的,但指出:变量是存在的、变量的名称、及变量的位置。
a> 使用extern修饰的声明:
extern int sp;
extern double val[MAXVAL];
这两个语句的意思就是 sp, val[MAXVAL],都是在本工程的其他文件中定义的。
在其他的文件中,你应该能看到 诸如int sp;或者 double val[MAXVAL];的定义。
目的是告诉本文件以下的代码部分,这两个变量的存在性及类型。
b> 不使用extern修饰的申明:
#include <iostream>
void * _Malloc(size_t); // 函数声明: 只是告诉编译器,本文件中有一个方法叫做 _Malloc,但是我没有具体定义它是这么实现的
int main(void)
{
void p = _Malloc(1);
return 0;
}
void * _Malloc(size_t _size) // 定义:具体方法的实现
{
return malloc(_size);
}
5. const限定符
const限定符将一个对象转换成一个常量,const修饰的变量在定义时必须初始化 --- 常量在定以后就不能修改!
const 对象默认为文件的局部变量,即--如没有特殊的声明,既是是在全局定义的变量也只能在本文件中访问 [注:默认情况]
const可以类似的理解为java中的final关键字
// const 对象默认为文件的局部变量,如果要使const变量可以在其他文件中访问,必须显式地指定它为extern,如下:
// file1.cpp
int count; // 定义
// file2.cpp
extern int count; // 声明:使用file1.cpp中的count
count++; // 自增定义在file1.cpp中的count的值
// file1_1.cpp
extern const int count = 10; // 定义并初始化一个const的对象,该对象可以在别的文件中被访问到
// file1_2.cpp
extern const int count; // 声明:使用file1_1.cpp中的count
for (int index = 0; index < count; ++index) // 使用
// ......
6. C++中引用初体验 --- 引用就是对象的另一个名字
a> 引用是一种复合类型 [所谓的复合类型就是指用其他类型定义的类型],通过在变量名前加 “&” 来实现定义
注:不可以定义引用类型的引用,但可以定义任何其他类型的引用
引用必须用与该引用同类型的对象初始化:
int ival = 1024;
int &refval = ival; //这是正确的
int &refval2; //错误:引用必须被初始化
int &refval3 = 10; //错误:引用在初始化时必须定义为和该引用同类型的对象 [在这里就是int型],10是一个常量
refval = 5; // 我们可以通过ival[原变量名]访问ival对象,也可以通过它的别名 refval 来访问。这句话实际上是更改了ival的值
b> 引用就是别名 --- 引用只是它绑定的对象的另一个名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上
refval +=2; // 将refval指向的ival对象加2
int i = refval; // 把和ival相关联的值赋给i
引用一旦被初始化,只要该引用还存在,它保持绑定到初始化时所指向的对象。--- 不可以将一个已经初始化的引用绑定到另一个对象,初始化是指明引用指向哪个对象的唯一办法
c> const 引用:是指向const对象的引用,const引用是只读的
非const引用不可以绑定到一个const对象
const int ival = 1024;
const int &refval = ival; // 正确,对象本身和引用都是const
int &refval2 = ival; // 错误!非const引用不可以指向一个const对象。这一点也很好理解:因为ival是const,所以ival是不可以修改的,而引用就是对象的别名,如果连对象的属性都修改了,还仅仅是别名吗?
非const引用只能绑定到雨该引用同类型的对象,const引用则可以绑定到不同但相关的类型的对象或者绑定到右值
int i = 42;
const int &r = 42; // 正确:这样的初始化引用对于非const引用是不合法的
const int &r2 = r + i;
double dval = 3.14;
const int &ri = dval;
// 正确:在编译器中会这样执行:
// int temp = dval; 创建一个临时int变量,从double转换而来
// const int &ri = temp; 将ri绑定到temp这个临时变量上
// 因此,对ri的赋值不会改变dval的值
7. typeof 名字
typeof用来定义类型的同义词:
typeof int exam_socre; 意思是 exam_score = int ,用int来定义的对象都可以用 exam_score来定义.
即 exam_score my_score = 100; 等价于 int my_score = 100;
typeof通常被用于以下的3个目的:
a> 为了隐藏特定类型的实现,强调使用类型的目的 --- 简言之就是抽象
b> 简化复杂的类型定义,使其更易于理解
c> 允许一种类型用于多个目的,同事使得每次使用该类型的目的明确
8. enum 枚举
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。
简单的将,如果定义一个变量为某种枚举类型,那么这个变量的的值只能等于该枚举中列出来的值。
enum open_modes {input, output, append} // 默认第一个枚举成员赋值为0,后面每个都比前者大1。
枚举成员都是常量:
用来初始化枚举成员的必须是常量表达式,如:
enum Points {point2d = 2, point2w, point3d = 3, point3w} // 在这里,point2w = 3, point3w = 4 默认初始化时比前者大1
既然枚举成员都是常量,那么,枚举成员就不能更改
point2d = 6; // 这样的赋值,是错误的!
#include <iostream>
int main()
{
enum Points {point2d = 2, point2w, point3d = 3, point3w};
Points pot2w = point2w; // point2w是Points里面的一个枚举类型,所以在定义时这么写是正确的
Points pot3d = point3d;
if (pot2w == pot3d){ // 这种比较就是值的比较,实际上他们的值就是相等的
std::cout << "我们的值相等" << std::endl;
}
return 0;
}