C++基础bool、const、引用

C++中的布尔类型:

C++在C语言的基础类型系统之上增加了bool

C++中的bool可取的值只有false和true

理论上bool只占用一个字节,如果多个bool变量定义在一起,可能只会各占一个bit,这取决于编译器的实现

true代表真值,编译器内部用1表示

false代表非真值,编译器内部用0表示

bool类型只有true(非0)和false(0)两个值

C++编译器会在赋值时将非0值转换为true,0值转换为false

C++中的const:

const是常量的意思,即不可修改,但是C语言实现是伪造的比如

const int  a=10; 
int * p=&a;   
*p=12;
printf("%d\n",a);//12

//这个时候a的值为12.C语言并没有真正实现不可修改,仅仅表示只读

const int b=10;

int * p=(int *)&b;

*p=100;

printf("%d\n",*p);//100  //修改了指针的所指的空间

printf("%d\n",b);//10   //并没有修改a的值


//本质原因是,c++编译器实现const,时间const类型的变量存储到符号表中,并没有存储到内存中
//因为这个时候用p获取(&b)了b的内存,所以仅仅给b分配了个内存,供给指针p,这也符合(&b)的逻辑
//毕竟是取地址的意思,但是const类型b变量的值与其分配的内存空间的值无关。

C++编译器对然可能为const常量分配空间,但不会使用其存储空间的值。

const好处:1)如果指针做函数参数,可以有效的提高代码的可读性2)可以分清楚输入和输出特性,输入是不可修改的,用const修饰一眼就可以看出来。

结论:

C语言中的const变量:C语言中的const变量是只读变量,有自己的存储空间

C++中的const常量:可能分配空间也可能不分配空间,这要看他使用不使用了,如果为全局,在其它文件中使用,则要分配空间,如果使用&操作符,也要分配空间。

C++中的const常量类似于宏定义:

const int c=5;类似于#define c 5 (#define 的本质是替换)

不过const 常量是由编译器处理的,提供类型检查和作用域检查,宏定义是由预处理器处理,单纯的文本替换。

C++中的引用:

int a=10;

int &b=a;//b就是a的别名

引用出现就必须给它赋值。

普通的引用在声明时必须用其它的变量进行初始化

原因:引用的本质是常量指针,Type & name 本质是Type * const name既然是常量那就必须得初始化,那么为什么常量就必须初始化呢?常量的意思是不可修改,比如const  int   a; 这个时候没有初始化,那么他没有值的话有什么意义呢?还是要给它赋值,好这时候a=100;这就又矛盾了,常量不能修改呀!所以与语法相矛盾,即必须初始化,即引用也必须初始化。

C++编译器在编译过程中使用常指针作为引用的内部实现,一次引用占用的空间大小与指针相同。

从使用的角度,引用会让人误会是一个别名,没有自己的存储空间,这是C++为了使用性,隐藏的细节,实际有空间。

const int &a = 100; //相当于const int * const a

int *b = (int *)&a; 
	
*b = 12;

printf("a:%d", a);//12

//当使用常量(字面量,具体的数字)对const引用初始化的时候,编译器会为字面量分配空间,并将
//引用名作为这段空间的别名
//使用常量对const引用初始化后生成一个只读变量

const & 相当于const  int * const e

普通引用相当于 int * const e

猜你喜欢

转载自blog.csdn.net/Raven_csdn/article/details/88389378