静态static,常量const,详细探究
734 2023-02-02 11:25
这里主要讨论,静态变量,静态函数,静态和常量混用等情况,常量,常量函数。
静态变量:
静态成员变量。被所有对象共享。
当一个进程的全局变量被声明为static之后,它的中文名叫静态全局变量。静态全局变量和其他的全局变量的存储地点并没有区别,都是在.data段(已初始化)或者.bss段(未初始化)内,但是它只在定义它的源文件内有效,其他源文件无法访问它。所以,普通全局变量穿上static外衣后,它就变成了新娘,已心有所属(来源于点击打开链接),只能被定义它的源文件(新郎)中的变量或函数访问。
static局部变量,也差不多的意思,存留在全局存储区
静态函数:
分两种说,类的静态成员函数,被调用来说,类不例化,也能使用,和类的静态成员一样,不包含this指针。另外,假如在类内要调用非静态的变量,得通过对象去引用,这里有个例子,f1为了使用a变量,得用这种方式才能使用:
#include
class M
{
public:
M(int a) { A=a; B+=a;}
static void f1(M m);
private:
int A;
static int B;
};
void M::f1(M m)
{
cout<<"A="<<m.a<<endl;
cout<<"B="<<b<<endl;
}
常量const(参考点击打开链接):
常量变量,value不能变。
常量指针,看怎么写,是指针常量,还是指针指向的那个地方是常量。
修饰函数参数:void function(const char* Var);
const修饰类的成员,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。
const修饰成员函数,void function()const; //常成员函数, 它不改变对象的成员变量. //也不能调用类中任何非const成员函数
const修饰类:
class AAA
{
void func1();
void func2() const;
}
const AAA aObj;
aObj.func1(); ×
aObj.func2(); 正确
const AAA* aObj = new AAA();
aObj-> func1(); ×
aObj-> func2(); 正确
一个 混用的问题(引用 点击打开链接):
我们可以用static修饰一个类的成员函数,也可以用const修饰类的成员函数(写在函数的最后表示不能修改成员变量,不是指写在前面表示返回值为常量)。
请问:能不能同时用static和const修饰类的成员函数?
答案是不可以。C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。
我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。
另:const static 和 static const在修饰类成员变量的时候,貌似没区别
————————————————
版权声明:本文为CSDN博主「DDHKing」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/baidu_34674626/article/details/78027470
全部评论