1)const在*前还是在*后的问题
const int * a = &b;
const在*之前,修饰指针所指向的变量,即指针指向的内容为常量,不允许对内容进行直接修改
int b =100;
const int * a = &b;
*a = 600; //错误
a是一个仓库管理员,他所进入的仓库(*a)是他没有权限动的,里边有什么就是什么。
如果要改变,可以通过改变b的值 b=200,或者将指针指向别处 int c = 200; a = &c;
const在*后边,修饰指针本身是常量,不能将其指向其他地方,必须初始化
int b=500,c=300;
int * const a; //错误,没有初始化
int * const a = &c; //正确
* a = 600;// 正确
a++; //错误,
a是一个仓库管理员的话,他只能进入某一个指定的仓库,不能进入其他的仓库。
如果const前后都有*的话,表示指针和内容都是常量。
2)const成员函数
把不改变数据成员的函数后加上const关键词标识,提高程序的可读性和可靠性,如果一定要改变,则用mutable修饰成员变量,
如果const在成员函数声明前边,表示函数的返回值是一个常量。
3)和宏定义相比
const有数据类型,宏定义没有,编译器对const有进行类型安全检查,对宏定义只是简单的替换。
sizeof返回的是数据类型的大小,int float 4个字节,char 1个字节,指针类型4个字节,short 2个字节,double 8个字节 bool 1个字节
计算结构体的时候需要考虑对齐,是最长数据元素的整数倍,加通过pack预处理指令可以禁止对齐调整,但一般不这样做,这样会降低程序的性能,
class A
{
private:
bool a;
int b;
bool c;
}
A中 的元素所占内存分别为 2 4 2 ,依据最大元素长度补齐, sizeof(A)的大小为12
class B
{
private:
int a;
bool b;
bool c;
}
B中的元素所占内存分别为 4 2 2,依据最大元素长度补齐,sizeof(B)的大小为8
char* ss = "0123456789";
sizeof(ss)的结果为4,指向字符串的字符指针,sizeof(*ss)的大小为1,*ss是第一个字符。
char ss[] = "0123456789";
sizeof(ss)的大小为11,ss是数组,计算到"\0",sizeof(*ss)的大小为1,第一个字符。
char ss[100]="0123456789";
sizeof(ss)的大小为100,strlen(ss)的大小为10,strlen的的参数只能是chaar*型的,结尾必须是“\0”
数组做形参时传递的不是数组,是指针,这时候sizeof就退化为指针的大小。
sizeof 括号内的内容是不被编译的,直接被替换为类型。
int a=8;sizeof(a=6); 执行结束后a的值还是8。
空类、多重继承空类的大小都是1,虚继承涉及虚指针,所以大小为4。
内敛函数要做参数类型检查,一般使用情况如下:
(1)一个函数被反复不断的调用;
(2)函数只有简单的几行,且不包括,for,while,switch
内联关键词inline必须与函数定义体放在一起才能成为内联函数,和函数声明放在一起没用