C++學習總結(十一)——類的靜態函式,成員函式的預設引數,類中包含引用和常量
阿新 • • 發佈:2019-02-16
一.類的靜態成員變數,以及靜態函式。
靜態成員變數:
1.靜態成員共享機制
2.靜態成員區域性屬於類,它不是物件的成員,位於靜態區。
3.靜態成員變數需要在外部進行初始化。
靜態函式:
1.靜態成員函式都在程式碼區,類的靜態函式都是共享的。
2.類的大小不包含程式碼區,建立指向類方法的指標,需要指定所屬的類。如有類函式void go();想要建立指向該函式的指標,則建立方式如下:
class myclass
{
public:
static void go(){}; void go1(){};
};
3.靜態函式不需要進行類的指定。void (*p)()=&myclass::go1; void (*p1)()=&go;
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(); }