C++之Static与Const

C++之Static与Const

一、Static定义

1、Static意为静态成员,若Static修饰的成员位于C++类中,那么Static就实现了同一个类,多个对象共享数据,协调行为的目的。


2、静态变量具有全局变量的优势,又不会像全变量一样被滥用。C++中用于管理静态变量,就需要用到静态函数。


3、C++中类的静态成员,属于类,也属于对象,但终归属于类。(比较绕,直接记做属于类)

1.1、Static变量

//示例
#include <iostream>
using namespace std;
class A
{
	public:
	static int share;  //Static变量的声明
};
int A::share = 5;     //Static变量的初始化

int main()
{
	A x;
	cout<<A::share<<endl;    //方法一:Static变量的调用
	cout<<x.share<<<<endl;   //方法二:Static变量的调用
	return 0;
}

1.2、static静态成员小结

1、 共享 : static 成员变量实现了同族类对象间信息共享;
2、 初始化:static 成员使用时必须初始化,且只能类外初始化。声明与实现分离时;只能初始化在实现部分(cpp 部分);
3 、类大小: static 成员类外存储,求类大小,并不包含在内;
4、 存储 : static 成员是命名空间属于类的全局变量,存储在 data 区 rw 段;
5、 访问 :可以通过类名访问(无对象生成时亦可),也可以通过对象访问。

备注:static静态成员可以被类内的普通函数静态函数都可访问。

1.2、Static函数

  • C++为了管理静态成员,提供了静态函数,静态函数对外提供接口。并且静态函数只能访问静态成员。
//示例
#include <iostream>
using namespace std;
class A
{
	public:
	int a;
	static void foo()
	{
		// a = 1; 错误 只能访问静态成员
		share++;
	}
	static int share;
};
int A::share = 0;

int main()
{
	A a;
	a.foo();
	A::foo();
	return 0;
}

1.3、static静态函数小结

1、 静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员, 完成对静态数据成员的封装。


2、 staitc 修饰成员函数,仅出现在声明处,不可在定义处。

方式一、class A
{
	static void fun()
	{
		
	}
}
方式二、
class A
{
	static void fun();
}
void A:: fun()  //staitc 修饰成员函数不能出现在定义处
{
	
}

3、 静态成员函数只能访问静态数据成员。原因:非静态成员函数在调用时 this指针被当作参数传进。而静态成员函数是属于类,不属于对象,没有 this 指针。

二、Const

2.1、Const变量

1、 const 修饰数据成员,称为常数据成员。常数据成员可被普通成员函数和常成员函数来使用,不可以更改。


2、const 常数据成员在使用前必须被初始化。也就是定义的同时就要初始化,之后不能再去赋值,只能使用。可以在类中(不推荐),或初始化参数列表中(这是在类对象生成之前唯一一次改变 const 成员的值的机会了)。


Const单变量初始化

const int a = 1;

Const变量在类中初始化

错误示范!!!!!
#include <iostream>
using namespace std;
class A
	public:
	void dis()
	{
		cout<<data<<endl;
	}
	private:
		const int data;
};
当用该类去定义对象时就会显示出错,,提示没有初始化const成员data,且提示data为只读。
错误示范!!!!!
#include <iostream>
using namespace std;
class A
	public:
	void A()
	{
		data = 100;  //错误的写法
	}
	private:
		const int data;
};
const成员位于类中成员时会成为只读属性(只读:不能出现在“=”的左边)。所以也不可以直接在类的构造函数中去初始化const成员。
//当然你也可以把const定义为局部变量,语法OK,但一般一旦定义const都是作为全局的。局部的就和普通局部变量一样了,没有多大意义。
#include <iostream>
using namespace std;
class A
	public:
	void A()
	{
		const int data = 100;  //正确
	}
};

2.2、const变量初始化小结

const正确初始化方法 --- <采用初始化列表进行初始化>
1、初始化列表先与本对象的构造函数执行

2、初始化列表与成员的声明顺序相同的。

//方法一:
#include <iostream>
using namespace std;
class A
	public:
	void A(int i)data(i)
	{
		cout<<data<<endl;
	}
	private:
		const int data;
};
int main()
{
	A a(200);
	return 0;
}
//方法二:
#include <iostream>
using namespace std;
class A
	public:
	void dis()
	{
		cout<<data<<endl;
	}
	private:
		const int data = 100;  
};
int main()
{
	A a;
	return 0;
}
> 第三种情况:
//方法二:
#include <iostream>
using namespace std;
class A
	public:
   void A(int i)data(i)
	{
		cout<<data<<endl;
	}
	void dis()
	{
		cout<<data<<endl;
	}
	private:
		const int data = 100;  
};
int main()
{
	A a(200);
	return 0;
}	
//输出结果: 200  
//那么可以得出: 最终Const变量的初始化值为确定的初始化参数列表里面的值!!

2.2、Const函数

class Screen 
{  
public:  
   char get() const;  
};  
char Screen::get() const
 {  
   //do something
}  

1、const 修饰函数放在声明之后,实现体之前。


2、const 修饰函数不能修改类内的数据成员变量。


3、const 修饰函数只能调用 const 函数。非 const 函数可以调用 const 函数。


4、const 修饰的全局函数在定义和声明处都需要 const 修饰符。

三、Const对象

1、const 对象,只能调用const成员函数。

原文地址:https://www.cnblogs.com/retry/p/9509403.html