C++知识点很多,要问它的坑有多深,试一试便知。为了不使自己掌握的技能随时光流逝逐渐褪色,还是需要多多回顾以前的知识点,留下学习的痕迹,方便后期有需要进行回溯.
这一节是开篇,主要讲述以下内容:
1 bool类型
2 const限定符的使用
3 const限定符与#define的区别
4 结构体内存对齐原则
先谈bool型,bool型是C++在C的基础上新增的逻辑类型,它的值为true or false,它的存储字节在不同的编译器可能不同,在vc++中占1字节,可以通过sizeof()来查看不同编译器下具体的数值。它也可以表示数值,非0时为1,其它为0,如下:
bool a;
a = 100; //编译器将int型 --> bool型,要进行截断,因为bool只占1字节
cout << a << endl; //output: 1
bool a;
a = 100;
cout << a << endl; //output: 1
a = -1;
cout << a << endl; //output: 1
a = 0;
cout << a << endl; //output :0
const限定符的使用:
顾名思义,const是用于修饰标识变量的, 被const修饰的变量其值将不能被更改,所以可以称为标识符常量或者称为常变量,它的定义格式有以下两种:
const 数据类型 常量名 = 常量值;
数据类型 const 常量名 = 常量值;
注意事项:常变量在声明时必须初始化,且在初始化后,不允许再赋值。见如下例子:
//const int a; //Error, a没有被初始化
const int a = 100; //right
//a = 2; //Error,a不允许再赋值
int b = 22;
const int *p; //right,*p是常量,const在*号左边,表示*p为常量, 经由*p不能更改p指针所指向的内容。
p = &b; //允许,因为p不是常量
//*p = 200; //Error, *p是常量,常量不允许重新赋值
//int *const p2;// Error, p2是常量,没初始化
int *const p2 = &b; //right.
int c = 100;
//p2 = &c; //Error, p2是常量,不允许修改
*p2 = 200; //允许,p2是常量,*p2是变量,可以经由p2修改指针所指向的值
const与#define宏的区别
共同点是两者均可以用于定义常量,这里着重看二者之间的区别:
(1) 数据类型
const定义的常量是有数据类型的,而#define定义的常量是没有数据类型之分的,所以编译器对二者的处理不相同,编译器对const定义的常量会进行类型的检查,对#define只作简单的替换。
(2) 内存管理
const定义的常量是在编译时分配内存,#define定义的常量是在预编译时进行替换,不进行内存的分配
(3) 作用域
const定义的常量其作用域就是该变量本身的作用域,而#define所定义的常量作用域是由#define定义的起始点至程序结束,也可以在某个地方用#undef取消。
在C++中,定义常量除了使用const,外,还可以使用枚举enum, 在C++中提供尽量使用const和enum来代替C的#define
最后,来看看结构体的内存对齐原则。
关于为什么结构体要进行内存对齐,原因只在于性能上的原因,CPU在对齐的地址上访问数据更快。
(1) 结构体第一个成员与结构体的偏移量为0
(2) 其它成员要对齐到某个数字(对齐数)的整数倍地址
(3) 对齐数取编译器预设的一个对齐数与该成员大小的较小者
(4) 结构体总大小为最大对齐数的整数倍
#include <iostream>
#include <stdio.h>
using namespace std;
//这里是对齐数的设定,对齐数的值与编译器有关,可以设定,默认是4,这里改成2。
//在linux g++中,编译器对齐整数只能设到1,2,4,设到8是没有用的,还是4
#pragma pack(2)
struct Test
{
char a;
double b;
char c;
};
#pragma pack()
int main(void)
{
Test test;
//&test = &test.a
char *p = (char *)&test;
// cout << p <<endl;
printf("p = %p\n",p);
p = &test.a;
// cout << p << endl;
printf("p = %p\n",p);
cout << sizeof(Test) << endl; //output:12bytes.
return 0;
}
总结:关于bool类型、const限定符使用、const与#define定义常变量的区别、结构体内存对齐的规则。