const int a=0;
int const a=0;
上述两行代码都表示a是常量,对于a本身来说他只有只读的属性,不能通过a这个名字对a所表示的这块区域做写值得操作,但是可以通过其他方式间接地改变a所代表的这块区域的值,如:
int *p=&a;
*p=5;
同样一段程序用不同的编译器也是不一样的结果
#include<stdio.h>
int main()
{
const int a=1;
int *p=(int *)&a;
*p=100;
print("%d",a);
return 0;
}
gcc中a=100;而g++中a=1;因为g++中并不给a 分配空间,而是直接把const当做编译时的常量,只把他的名字保存在常量表中,但只要在前面加上volatile;
const在类与对象中的应用:
const修饰的常变量在初始化的时候必须要通过初始化成员列表才能对其进行初始化
如:
class DEMO
{
private:
int a;
const int b;
public:
DEMO(int a,int b):a(a),b(b){}
void show()
{
cout<<a<<","<<b<<endl;
}
};
常量函数必须定义在类里面,以成员函数的形式出现。擦灰姑娘来那个成员函数得好处及时保证类的封装性,能够有效地防止类的数据成员被非法访问。
const int fun(void);这不是常量函数,仅仅表示返回值为常量
int fun (void) const; 与int fun (void) 构成重载关系:因为类的成员函数的第一个参数this指针被隐藏,普通成员函数的this指针是只想当前这个类的普通指针,而常量成员函数得this指针是常量指针;因此我们不能通过this指针去修改对象对应的内存块,但是,这仅仅是编译器的限制,我们可以用const_cast(去const)运算符完成将this指针的const属性去掉,转换为非常量指针的实收就可以通过编译器的检查。
数据成员的存储类型
auto:自动类型变量:动态存储,局部变量默认auto
static:静态类型变量:静态存储,永久的存储单元,知道程序核结束,具有记忆功能,保留上次调用的结果,初始化只有开始时进行一次
register:寄存器类型:动态存储,存放于CPU中,以提高对其存取的速度
extern:外部类型变量 :可被其他源文件使用
函数定义时如果省略返回值,默认int
对象调用常量函数的规则如下:
(1)、非常量对象可以调用常量函数和非常量函数。
(2)、常量对象只能调用常量对象不能调用非常量函数
(3)、常量函数与非常量函数重载时常量成员调用常量函数,非常量成员调用非常量函数
static成员
static变量:
存储在全局数据区域,但是他的作用域还是局部的,静态局部变量只能在局部被调用,但是被调用完他也不会被释放,里面的值还是上次调用这个局部变量的值,
静态局部变量的初始值是0,生命周期是全局的,所以只能初始化一次,后面遇到合法初始化会自动0跳过,普通的局部变量没有初始化时他的值是随机的,因为局部变量的生命周期是随机的,所以合法的初始化每次都会执行
static 函数:
静态函数的作用于是当前源文件,对于该工程的其他源文件是隐藏的,而普通函数的作用于是整个工程都可以调用的