静态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

全部评论

·