c/c++关键字static和const
一、关键字static
参考:https://www.cnblogs.com/BeyondAnyTime/p/2542315.html
1. 静态全局变量和函数
- 生命周期(整个程序运行过程)不变,作用域限制在本文件中,全局变量在别的文件加extern 无效,别的文件即使include头文件也不能使用该头文件中的静态函数。
//静态全局变量
static a;
//静态函数
static void myFunc()
{
printf("this is a static function")
}
2. 静态局部变量
- 生命周期改变(由函数运行过程变为整个程序运行过程),作用域不变(函数内部有效)。且静态局部变量只执行一次内存分配,只进行一次初始化。
//静态局部变量
//每次调用该函数a都会加1,不会被重新初始化为0。
void myFunc()
{
static int a=0;
a++;
}
3. 静态类成员变量和函数
- 静态类成员变量属于整个类,对于该类的所有对象只维持一份拷贝。
- 静态类成员函数属于整个类共有,这个函数不接受this指针,且只能访问类的静态成员。
//类
class MyClass
{
//声明静态成员变量
static int a;
//声明静态类成员函数
static void myFunc();
};
//定义并初始化静态成员变量
int MyClass::a=0;
//定义静态成员函数时不用加static
void MyClass::myFunc()
{
}
二、关键字const
参考:https://www.cnblogs.com/icemoon1987/p/3320326.html
1. const变量
- const 变量值是只读的,不能被改变,必须同时进行初始化。
//声明并初始化
const int a=20;
2. const 指针
- const 指针分为三种,分别是:指针指向的内容不能变,指针地址不能变,两者都不能变,就近原则。
//指针指向的内容不能变
const int * a;
int const *a
//指针地址不能变
int * const a
//指针指向的内容和指针地址都不能变
const int * const a;
3. const修饰函数参数
- 将函数参数声明为 const 类型,表示对于函数来说,这个参数是一个 const 变量。函数内部不能够改变这个参数的值。
- 将函数参数声明为 const 类型的指针 ,允许上层使用“指向 const 变量的指针” 或“普通指针”作为参数,调用函数。(如果函数参数声明的是普通指针,则不允许使用指向 const 变量的指针作为参数调用)
// const变量作为函数参数
void myFunc( const int a )
{
a = 5; // 编译错误:不允许修改const变量
printf("a = %d\n", a);
}
// const指针作为函数参数
void myFunc( const int *a )
{
*a = 5; // 编译错误:不允许修改const指针
printf("*a = %d\n", *a);
}
4. const 修饰返回值
- 函数的返回值为一个 const 变量,不能被修改。主要用于函数返回const引用。
// 返回 const 引用的函数
const int& myFunc(int a)
{
return a;
}
int main( int argc, char *argv[])
{
myFunc(2)=3; // 编译错误,返回的引用为 const 引用,不允许修改。
}
4. const对象
- const类对象指的是该对象对象不能改变任何成员变量的值(不能直接改变成员变量
也不能通过成员函数改变成员变量),不能调用任何非const成员函数
//实例化const对象
const MyClass object;
5. const成员变量和成员函数
- const 成员变量指的是类中的成员变量为只读,不能够被修改(包括在类外部和类内部)。const 成员变量必须被初始化(在相关构造函数的初始化列表中),初始化后,不能够被修改。静态 const 成员变量需要在类外部单独定义并初始化(可定义在头文件)
- const成员函数指的是,此函数不应该修改任何成员变量,除非成员变量被 mutable 修饰符修饰。传给const成员函数的this指针,是指向 const 对象的const 指针。
class MyClass
{
public:
MyClass() {};
~MyClass();
const int c; //const成员变量
static const int sc; //static const 成员变量
int not_m; // 不带 mutable 修饰的成员变量
mutable int m; // 带 mutable 修饰的成员变量
void myFunc(int a); // 非 const 成员函数
void myFunc_const(int a) const; // const 成员函数
};
const int MyClass::sc = 1; // 静态常量成员需要在类外进行单独定义和初始化
MyClass::MyClass(): c(10){} // const 成员变量在构造函数初始化列表中初始化
void MyClass::myFunc(int a)
{
not_m = a; //正确
m = a; //正确
c = a; //编译错误,const 成员变量不能被修改
return;
}
void MyClass::myFunc_const(int a) const
{
not_m = a; // 编译错误,const 成员函数不能修改一般的成员变量
m = a; // 正常,const成员函数能修改被 mutable 修饰的成员变量
return;
}