C/C++入门:关键字static与const
在C/C++中关键字中,最基础最重要的就是static与const,无论是等级考试,还是求职考试都是经常遇见的,今天就详细介绍相关内容。
一、static
1.1 C语言中static
1)修饰局部变量:
当再一个函数体内使用static修饰一个变量时,static延长变量的生命周期,不会因为函数调用完而被销毁,
只有当整个程序执行完才被销毁。
只能被定义处的函数进行访问,函数体外不能被访问。
2)修饰全局变量:
被static修饰的全局变量,该变量只能在定义该变量的源文件中访问,其他源文件不能被访问。
3)修饰函数:
被static修饰的函数,该函数只能在定义该函数的源文件中访问,其他源文件不能被访问。
static函数可以很好地解决不同原文件中函数同名的问题,因为一个源文件对于其他源文件中的static函数是不可见的。
1.2 C++语言中的static:
1)修饰局部变量:(与C相同)
2)修饰全局变量:(与C相同)
3)修饰函数:(与C相同)
4)类的static的成员变量:
性质1:该静态变量只归类所有,不归实例化的对象所有,这意味着:它的生命周期不依赖某个对象的创建或释放,而是随程序一直存在着。
性质2:该静态变量需要在类外单独初始化。
#include <iostream>
class My{
public:
static int Num;
My() {Num++;}
~My() {Num--;}
};
int My::Num = 0; //静态变量初始化
int main(){
My a;
My b;
My c;
std::cout << My::Num << std::endl;
return 0;
}
// 结果输出 3
5)类的static的成员函数:
性质1:静态成员函数属于类,没有this指针。
性质2:可以通过类名::函数名直接调用。
性质3:静态成员函数只能访问static变量和static函数,非静态成员函数可以访问static变量和static函数。
性质4:static成员函数只能返回static成员变量
性质5:静态成员函数不能是虚函数
二、const
2.1 C语言中的const
1)修饰常量:
const可以修饰常量,使该常量的值不能改变,局部变量与全局变量都一样,定义时就要赋值。
补充: const与define对比:
● const常量有数据类型,#define没有数据类型;
● const可以保护被修饰的东西,防止其被意外修改,可以增强程序的健壮性; #define只进行字符替换,没有类型安全检查,在字符替换过程中可能会出现一些错误,例如:边界问题;
● 通常情况下,编译器不会为const常量分配存储空间,而是将其保存在符号表中,作为编译期间的一个常量,不会占用内存以及不进行读操作,效率自然很高;
● 有些集成化的调试工具可以对const常量进行调试,但不能对宏常量进行调试。
2)修饰指针:
int b = 10;
const int *a = &b;//情况1
int const *a = &b;//情况2
int* const a = &b;//情况3
const int* const a = &b;//情况4
● 忽略类型int(因情况而定,有的代码中是char、double等等类型或者函数名等);
● const放在*号左边时,代表的意思是该指针变量指向的内容是不能通过指针变量来改变的(常量指针); //底层const
● const放在*号右边时,代表的意思是该指针变量本身的内容是不能改变的(指针常量)。//顶层const
由此很明显我们可以判断以上四种情况:
情况1、2属于常量指针,
情况3属于指针常量,
情况4既是常量指针也是指针常量。
3)修饰函数:
3.1)const修饰函数的参数
● 防止修改指针指向的内容
void Funtext(char *dest,const char *sou)
● 防止修改指针本身
void swap(int* const p1, int* const p2)
●防止修改指针本身和指针指向的内容
void Fun(const int* const p)
3.2)const修饰函数的返回值
如果函数返回值以指针传递方式并且加const修饰,那么函数返回值(指针)的内容就不能被修改,该返回值只能被附加给加const修饰的同类型返回值(指针)。
const char* GetString(void);
2.2 C++语言中的const
C++兼容C语言,C语言中的const特性,C++同样适用,下面将一些C语言中没有的特性。
1)const修饰成员变量
const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。
class A
{
//…
const int nValue; //成员常量不能被修改
//…
A(int x): nValue(x) { } ; //只能在初始化列表中赋值
}
2)const修饰成员函数
const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。
class A
{
void function()const; //常成员函数, 它不改变对象的成员变量.
//也不能调用类中任何非const成员函数。
}
对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。
a. const成员函数不被允许修改它所在对象的任何一个数据成员。
b. const成员函数能够访问对象的const成员,而其他成员函数不可以。
参考文献
https://blog.csdn.net/cherrydreamsover/article/details/79326505