1. 程式人生 > >C++學習總結(十一)——類的靜態函式,成員函式的預設引數,類中包含引用和常量

C++學習總結(十一)——類的靜態函式,成員函式的預設引數,類中包含引用和常量

一.類的靜態成員變數,以及靜態函式。

靜態成員變數:

1.靜態成員共享機制

2.靜態成員區域性屬於類,它不是物件的成員,位於靜態區。

3.靜態成員變數需要在外部進行初始化。

靜態函式:

1.靜態成員函式都在程式碼區,類的靜態函式都是共享的。

2.類的大小不包含程式碼區,建立指向類方法的指標,需要指定所屬的類。如有類函式void go();想要建立指向該函式的指標,則建立方式如下:

class myclass
{
 public:
 static void go(){};  void go1(){};
 };
void (*p)()=&myclass::go1; void (*p1)()=&go;
3.靜態函式不需要進行類的指定。

4.static const int num; 該變數型別位於靜態常量區(可讀不可寫),呼叫時不讀記憶體,直接呼叫符號表。

二.類與記憶體

類在內部存在引用時,需要進行初始化,引用在輸出時不可用std::endl,否則會關閉流,當做地址輸出。常量與引用必須過載建構函式進行初始化,且常量只可以初始化一次。

#include<iostream>

class myclass
{
public:
	int num;
	int data;
	int *p;
	const int coint = 0;//類內部定義常量要先對其進行初始化
	int & myint; //類內部包含引用,要對其進行初始化,否則會報錯,通過建構函式進行初始化
	static int shu;
	static const int scnum;
public:
	static void go()
	{

	}
	void run()
	{

	}
	//過載建構函式,對常量和引用進行初始化
	myclass(int a,int b):myint(a),coint(b)
	{
		//引用共用地址,常量備份新開闢地址
		std::cout << &a << " " << &b << std::endl;
		std::cout << &myint << " " << &coint << std::endl;
		const int *p = &coint;
		std::cout << coint << " " << *p << std::endl;
		int *px = const_cast<int *>(p);//去掉const屬性
		*px = 12;
		std::cout << coint <<" "<<*px<< std::endl;
	}

	~myclass()
	{

	}
//private:
};

int myclass::shu = 0;
const int myclass::scnum = 10;
void main1()
{
	int data1 = 10;
	myclass m1(data1,10);
	std::cout << m1.myint ;//std::endl 加上關閉輸出流,當做地址輸出
	int data2 = 20;
	m1.myint = data2;
	std::cout << m1.myint;


	std::cin.get();

}

class myclass1
{

public:
	const int num;
public:
	myclass1(int data) :num(data)
	{

	}
};

void main2()
{
	int data(100);
	myclass1 m1(data);
	std::cout << m1.num << std::endl;
	//m1.num = 1000;  常量只可以進行一次初始化
	std::cin.get();
}

int main()
{	//類中的普通成員變數
	//類名  變數名   棧上
	//類名  *指標名 =new 類名 堆上
   //類的靜態成員  靜態區
    //靜態函式,成員函式都在程式碼區,類的函式共享
	myclass mm(0,0);

	//位於程式碼區
	void (myclass::*p)() = &myclass::run; //程式碼共享,通過類名進行區分
	void(*p1)() = &myclass::go;//靜態函式,不需要說明類名

	std::cin.get();
}


三.類的成員函式的預設引數

通過呼叫預設引數,減少建構函式的重寫,預設引數從左向右進行呼叫。

#include<iostream>
class goodclass
{
public:
	int num=1; //預設初始化的值
	const int data=90; //預設初始化,減少重寫建構函式
public:
	static void show(goodclass good1)
	{
		std::cout << good1.num << " " << good1.data << std::endl;
	}
};

void main()
{
	goodclass good1;
	goodclass::show(good1);
	const int *px = &(good1.data);
	int *p = const_cast<int *>(px);
	*p = 123;
	goodclass::show(good1);
	std::cin.get();
}