1.const 与 static
const用法
1.常变量:给字面常量起个名字(即标识符),这个标识符就称为标识符常量;因为标识符常量的声明和使用形式很像变量,所以也称常变量。
定义形式: const int a =3; int const b =3; 作用一样,都是定义常变量
注意: 常变量在定义时必须初始化; 常变量初始化之后,不允许再被赋值。
即所修饰的对象为常量,不可对其修改和二次赋值操作(不能作为左值出现)
2.指针常量:指针本身是一个常量(即地址值不可变)
int *const p = &a; p的值不可变即p的指向不可变,p指向的值可变
指针常量必须在声明时初始化,指定一个地址的值,即必须指向一个变量,指针常量的值不能修改,就是说不能更换成一个新的地址,不能指向别的常量,但是可以通过指针常量修改它所指向的变量的值。
p = &b; 错误 *p =666; 正确
3.常量指针:指针指向一个常量或是常变量(指针指向的值不可变,指针的指向可变)
const int a = 10; int b; const int *p = &a; == int const* p=&a;
常量指针不能通过指针修改所指向的常量,但是指针可以指向别的常量,因为指针p本身是变量,但它所指向的是常量
*p = 100; 错误 p= &b; 正确
如果const位于*号右侧,即const *p, const就是修饰指针本身,即指针本身是常量;
如果const位于*号左侧,即*const p, const就是修饰指针所指向的变量,即指针指向为常量;
4.const修饰函数参数:传入参数在函数内不可改
char* mystrcpy(char* dest,const char* src);
可以提示阅读者作为传入参数; 确保形参在函数内不会被改变
5.函数返回值为const引用:函数返回值为常量不可改,对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。
const int fun(); 可以去掉const,函数返回值已为常量不可改,加const修饰无意义
const myclass fun(); 返回自定义的类对象,有意义
6.常成员变量和常成员函数
class Student
{
const int age;
常数据成员的值不可变,只能通过构造函数的初始化列表对常成员变量进行初始化,而不能用在构造函数中赋值的方法实现
Student:Student(int a):age(a){} 正确
Student:Student() { age = a; } 错误
void print_age() const;
常成员函数只能访问本类的数据成员(包括const和非const数据成员),但是不能修改任意数据成员的值
只有常成员函数才可以操作常量或者常对象
const int get_age();
类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”
};
const作用
1.修饰常量值,限定常量值不可改,定义时必须初始化
2.const修饰,编译器可以检测错误,防止参数被修改,提高程序调试效率
3.提高程序执行效率, C++编译器不给const常量分配存储空间,而是保存于符号表中,没有了存储和读取操作,大大提高了执行效率,使常变量成为一个编译期间的常量
static用法
1.static局部变量: 函数内定义开始创建,存储于静态数据区,函数结束时不释放存储空间,下次使用该变量时,沿用上一次保存的值。
作用域:函数内定义开始到函数结束 生存期:函数内定义开始到程序结束
2.static全局变量: 限定变量只能在本文件中使用,其他文件无法访问
其他文件可以使用同名的全局变量不会发生冲突。
作用域:源文件内 生存期:源文件内定义开始到文件结束
3.static函数: 静态函数也叫内部函数, 该函数只能在本文件中使用,其他文件无法使用, 在不同文件中,避免了函数同名引发的冲突,同名也可以使用。
4.static类成员变量和static类成员函数
class Student
{
static int age;
类的静态成员变量是整个类的成员,不是一个类的对象的成员,类内皆可问
静态数据成员初始化在类体外进行,而且前面不加static,以免和一般静态变量混淆
一般在.cpp文件内类外初始化,格式 int Student::age = 0;
static int get_age() {}
属于整个类的成员函数,是整个类的成员
可以用对象来调用它,静态成员函数可以用类名通过::直接调用
静态成员函数没有this指针,只能访问该类的静态成员和静态成员函数
如果静态成员函数中要引用非静态成员,可以通过对象来引用,
};
static作用:
1. 控制可见性和连接属性(隐藏)
存储方式为静态存储,连接方式为内部连接,对应”extern“外部连接
静态局部变量(已经是内部连接),改变存储方式
静态全局变量(已经是静态存储),改变连接方式
未加static修饰的全局变量和函数都具有全局可见性,其它的源文件也能访问 。
加static修饰的全局变量和函数,就会对其他源文件隐藏,其他文件不可访问
2.控制存储方式
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,并且只初始化一次
3.默认初始化为0
在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。
总结:static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。