C++之Static與Const

來源:互聯網
上載者:User

標籤:就會   方法   唯讀   c函數   數列   namespace   需要   靜態函數   大小   

目錄

  • C++之Static與Const
  • 一、Static定義
    • 1.1、Static變數
    • 1.2、static靜態成員小結
    • 1.2、Static函數
    • 1.3、static靜態函數小結
  • 二、Const
    • 2.1、Const變數
    • 2.2、const變數初始化小結
    • 2.3、Const函數
  • 六、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 指標。

二、Const2.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.3、Const函數

1、const 修飾函數放在聲明之後,實現體之前。

2、const 修飾函數不能修改類內的資料成員變數。

3、const 修飾函數只能調用 const 函數。非 const 函數可以調用 const 函數。

4、const 修飾的全域函數在定義和聲明處都需要 const 修飾符。

六、Const對象

1、const 對象,只能調用const成員函數。

C++之Static與Const

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.