最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++簡明圖解分析靜態(tài)成員與單例設(shè)計模式

 更新時間:2022年06月02日 09:57:49   作者:Bright-SKY  
與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員,靜態(tài)成員函數(shù)沒有this指針。既然它沒有指向某一對象,也就無法對一個對象中的非靜態(tài)成員進行默認(rèn)訪問

靜態(tài)成員概述

1、靜態(tài)成員包括靜態(tài)成員數(shù)據(jù)、靜態(tài)成員函數(shù)

2、成員數(shù)據(jù)、成員函數(shù)被 static修飾 就叫靜態(tài)成員數(shù)據(jù)、靜態(tài)成員函數(shù)

3、不管這個類創(chuàng)建了多少個對象,靜態(tài)成員只有一份,這一份被所有屬于這個類的對象共享。

4、靜態(tài)成員 是屬于類 而不是具體的某個對象。

5、靜態(tài)成員 是在定義完類的時候 就存在了。

靜態(tài)成員數(shù)據(jù)

靜態(tài)變量,是在編譯階段就分配空間,對象還沒有創(chuàng)建時,就已經(jīng)分配空間。

靜態(tài)成員變量必須在類中聲明,在類外定義。

靜態(tài)數(shù)據(jù)成員不屬于某個對象,在為對象分配空間中不包括靜態(tài)成員所占空間。

class Data
{
public:
    int num;//普通成員變量
    static int data;//靜態(tài)成員變量(類內(nèi)聲明)
};
//定義的時候 不需要加static
int Data::data=100;//類外定義+初始化
void test01()
{
    //data是靜態(tài)成員變量 是屬于類 可以通過類名稱::直接訪問
    cout<<Data::data<<endl;//100
    //賦值
    Data::data = 200;
    cout<<Data::data<<endl;//200
    //data靜態(tài)變量 是所有對象 共享的 可以通過對象名訪問
    Data ob1;
    ob1.data = 300;
    cout<<Data::data<<endl;//300
    Data ob2;
    cout<<ob2.data<<endl;//300
    //普通成員變量 屬于對象的 只能通過對象名訪問
    ob1.num = 100;
    cout<<"ob2.num = "<<ob2.num<<endl;//隨機值
    //cout<<Data::num<<endl;//普通成員變量不能通過類名稱訪問
}

static修飾靜態(tài)成員函數(shù)

靜態(tài)成員函數(shù):只能訪問私有靜態(tài)數(shù)據(jù)

引出:

class Data
{
private:
    int num;//普通成員變量
    static int data;//靜態(tài)成員變量(類內(nèi)聲明)
public:
    //普通成員函數(shù) 依賴于 對象的 必須對象調(diào)用
    int getData(void)
    {
        return data;
    }
};
//定義的時候 不需要加static
int Data::data=100;//類外定義+初始化
void test01()
{
    //cout<<Data::data<<endl;//err 靜態(tài)data是私有的 類外不能直接訪問
    //cout<< Data::getData()<<endl;//err getData() 必須對象調(diào)用
    Data ob;
    cout<<ob.getData()<<endl;
    //存在問題:data靜態(tài)的 在創(chuàng)建對象之前 就已經(jīng)存在
    //如果類沒有實例化對象 難道 就不能使用data了嗎? 
    //解決上述問題 就要用到靜態(tài)成員函數(shù)
}

靜態(tài)成員函數(shù):

class Data
{
private:
    int num;//普通成員變量
    static int data;//靜態(tài)成員變量(類內(nèi)聲明)
public:
    //普通成員函數(shù) 依賴于 對象的 必須對象調(diào)用
    int getData(void)
    {
        return data;
    }
    //靜態(tài)成員函數(shù)  屬于類 而不屬于對象
    static int getDataStatic(void)
    {
        return data;
    }
};
//定義的時候 不需要加static
int Data::data=100;//類外定義+初始化
void test01()
{
    //cout<<Data::data<<endl;//err 靜態(tài)data是私有的 類外不能直接訪問
    //cout<< Data::getData()<<endl;//err getData() 必須對象調(diào)用
    Data ob;
    cout<<ob.getData()<<endl;
    //存在問題:data靜態(tài)的 在創(chuàng)建對象之前 就已經(jīng)存在
    //如果類沒有實例化對象 難道 就不能使用data了嗎?
    //解決上述問題 就要用到靜態(tài)成員函數(shù)
    //1、靜態(tài)成員函數(shù) 屬于類 就可以通過類名稱直接訪問
    cout<<Data::getDataStatic()<<endl;
    //2、也可以通過對象名訪問(對象共享靜態(tài)成員函數(shù))
    cout<<ob.getDataStatic()<<endl;
}

注意:

1、靜態(tài)成員函數(shù)的目的 操作靜態(tài)成員數(shù)據(jù)。

2、靜態(tài)成員函數(shù) 不能訪問 非靜態(tài)成員數(shù)據(jù)。(靜態(tài)成員函數(shù)內(nèi)部沒有this指針)

3、普通成員函數(shù) 可以操作 靜態(tài)成員數(shù)據(jù) 非靜態(tài)成員數(shù)據(jù)。

4、靜態(tài)成員變量 和 靜態(tài)成員函數(shù) 都有權(quán)限之分。

const修飾靜態(tài)成員

如果一個類的成員,既要實現(xiàn)共享,又要實現(xiàn)不可改變,那就用 static const 修飾

class Data
{
public:
    const static int data;//靜態(tài)成員變量(類內(nèi)聲明)
public:
    //靜態(tài)成員函數(shù)  屬于類 而不屬于對象
    static int getDataStatic(void)
    {
        //num = 200;//err 靜態(tài)成員函數(shù) 不能訪問普通成員變量
        return data;
    }
};
//定義的時候 不需要加static
const int Data::data=100;//類外定義+初始化
void test02()
{
    //訪問
    cout<<Data::data<<endl;
    //賦值
    //Data::data = 200;//err data靜態(tài)成員只讀
    cout<<Data::data<<endl;
}

const修飾對象 叫常對象

const int num = 10;//系統(tǒng)不會給num開辟空間 num被放入符號表中 如果后期對&num 這時系統(tǒng)才會給num開辟空間

class Data
{
private:
    int data;
    mutable int num;
public:
    //遍歷 成員的函數(shù) 不會去修改成員的值
    //如果函數(shù)不會更改成員數(shù)據(jù) 就讓編譯器知道 這是一個const函數(shù)
    void myPrintData(void) const
    {
        //data =10000;//err const修飾函數(shù) 函數(shù)不能操作普通成員變量
        cout<<this->data<<endl;
        //cout<<data<<endl;
        //mutable修飾的成員變量 可以修改
        num = 200;
    }
    //編譯器認(rèn)為 普通成員函數(shù) 存在修改成員變量 可能
    void setData(int data) const
    {
        //this->data = data;
        return;
    }
    Data()
    {
        cout<<"無參構(gòu)造"<<endl;
    }
    Data(int data)
    {
        this->data =data;
        cout<<"有參構(gòu)造"<<endl;
    }
    Data(const Data &ob)
    {
        this->data = ob.data;
        cout<<"拷貝構(gòu)造"<<endl;
    }
    ~Data()
    {
        cout<<"析構(gòu)函數(shù)"<<endl;
    }
};
void test03()
{
    //常對象
    const Data ob1(200);
    //常對象 只能調(diào)用const修飾的函數(shù) 遍歷成員數(shù)據(jù)
    ob1.setData(20000);
    ob1.myPrintData();
}

運行結(jié)果:

const修飾成員函數(shù)

用const修飾的成員函數(shù)時,const修飾this指針指向的內(nèi)存區(qū)域,成員函數(shù)體內(nèi)不可以修改本類中的任何普通成員變量, 當(dāng)成員變量類型符前用mutable修飾時例外。

int myFun(void) const //const修飾的是成員函數(shù)
{}//函數(shù)內(nèi)部不能修改 普通成員變量  mutable修飾時例外
class Data2
{
public:
    int a;
    mutable int b;
public:
    Data2(int a, int b):a(a),b(b)
    {
//        this->a = a;
//        this->b = b;
    }
    //const修飾的是整個成員函數(shù) 表明在函數(shù)內(nèi)部只能對數(shù)據(jù)成員 讀操作
    void showData2(void) const
    {
        //a=100;//err
        //如果在const修飾的成員函數(shù)中 修改成員數(shù)據(jù)的值 請事先對成員數(shù)據(jù)進行mutable修飾
        b = 200;//ok
        cout<<"a="<<a<<", b="<<b<<endl;
    }
};
void test02()
{
    Data2 ob(10,20);
    ob.showData2();
}

靜態(tài)成員案例

案例1:靜態(tài)成員 統(tǒng)計類 實例化對象的 個數(shù)

#include <iostream>
using namespace std;
class Data
{
public:
    Data()
    {
        cout<<"無參構(gòu)造"<<endl;
        count++;
    }
    Data(const Data &ob)
    {
        cout<<"拷貝構(gòu)造函數(shù)"<<endl;
        count++;
    }
    ~Data()
    {
        count--;
        cout<<"析構(gòu)函數(shù)"<<endl;
    }
    static int count;
};
int Data::count = 0;
int main(int argc, char *argv[])
{
    Data ob1;
    Data ob2;
    {
        Data ob3;
        Data ob4;
        cout<<"對象的個數(shù):"<<Data::count<<endl;
    }
    cout<<"對象的個數(shù):"<<Data::count<<endl;
    return 0;
}

運行結(jié)果:

單例模式

單例模式 所設(shè)計的類 只能實例化一個對象。

單例模式的步驟:

1、不允許Printer實例對象(把構(gòu)造、拷貝構(gòu)造函數(shù)私有化)

2、定義一個靜態(tài)對象指針 保存唯一的對象地址

3、定義一個靜態(tài) 成員函數(shù) 拿到唯一的對象的地址 方便外界使用

案例:

單例模式設(shè)計--打印機(重要)

步驟1:在單例類內(nèi)部定義了一個Singleton類型的靜態(tài)對象,作為外部共享的唯一實例

步驟2:提供一個公共靜態(tài)的方法,讓客戶可以訪問它的唯一實例。

步驟3:為了防止在外部對實例化其他對象,將其默認(rèn)構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)設(shè)計為私有

#include <iostream>
using namespace std;
class Printer
{
public:
    //2、提供一個方法 獲得單例指針
    static Printer* getSignlePrint(void)
    {
        return signlePrint;
    }
    //4、設(shè)置功能函數(shù)(自定義)
    void printText(char *str)
    {
        cout<<"打印"<<str<<endl;
        count++;
    }
    int count;
private:
    //1、定義一個靜態(tài)的 對象指針變量 保存唯一實例地址
    static Printer *signlePrint;
private:
    //3、防止 該類實例化其他對象 將構(gòu)造函數(shù)全部 私有
    Printer(){count=0;}
    Printer(const Printer &ob){}
};
Printer *Printer::signlePrint = new Printer;
int main(int argc, char *argv[])
{
    //打印任務(wù)1
    Printer *p1 = Printer::getSignlePrint();
    p1->printText("入職報告1");
    p1->printText("體檢報告2");
    p1->printText("離職證明3");
    //打印任務(wù)2
    Printer *p2 = Printer::getSignlePrint();
    p2->printText("入職報告1");
    p2->printText("體檢報告2");
    p2->printText("離職證明3");
    cout<<"打印任務(wù)數(shù)量:"<<p2->count<<endl;
    return 0;
}

運行結(jié)果:

到此這篇關(guān)于C++簡明圖解分析靜態(tài)成員與單例設(shè)計模式的文章就介紹到這了,更多相關(guān)C++靜態(tài)成員內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++中智能指針的用法詳解

    C/C++中智能指針的用法詳解

    C/C++中,指針是一個非常重要的概念,其強大但也麻煩,麻煩之處就在于一旦你申請了內(nèi)存,那就必須要手動去釋放內(nèi)容,否則就會造成內(nèi)存泄漏。所以智能指針的作用就是防止我們麻痹大意忘記釋放內(nèi)存,幫助我們管理內(nèi)存的,本文就來聊聊智能指針的用法
    2023-01-01
  • C++編程中使用設(shè)計模式中的policy策略模式的實例講解

    C++編程中使用設(shè)計模式中的policy策略模式的實例講解

    這篇文章主要介紹了C++編程中使用設(shè)計模式中的policy策略模式的實例講解,文章最后對策略模式的優(yōu)缺點有一個簡單的總結(jié),需要的朋友可以參考下
    2016-03-03
  • C語言 字符串首字母轉(zhuǎn)換成大寫簡單實例

    C語言 字符串首字母轉(zhuǎn)換成大寫簡單實例

    這篇文章主要介紹了C語言 字符串首字母轉(zhuǎn)換成大寫簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C語言18個必背經(jīng)典程序

    C語言18個必背經(jīng)典程序

    這篇文章主要分下工的是18個C語言必背的經(jīng)典程序,下面文章我們就來看看實例,需要的小伙伴可以參考一下喲,希望對你有所幫助
    2021-10-10
  • 詳解C語言位域的使用與注意事項

    詳解C語言位域的使用與注意事項

    所謂“位域”是把一個字節(jié)中的二進位劃分為幾個不同的區(qū)域, 并說明每個區(qū)域的位數(shù)。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節(jié)的二進制位域來表示。下面這篇文章就給大家介紹下關(guān)于C語言中位域的使用與注意事項。
    2016-12-12
  • 深入了解C++ 結(jié)構(gòu)體(struct)與共用體(union)

    深入了解C++ 結(jié)構(gòu)體(struct)與共用體(union)

    這篇文章主要介紹了C++ 結(jié)構(gòu)體與共用體的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • 一篇文章帶你了解C語言內(nèi)存對齊

    一篇文章帶你了解C語言內(nèi)存對齊

    在單片機下使用C語言編程時,內(nèi)存對齊的知識點必須掌握。掌握內(nèi)存對齊后,可以防止內(nèi)存碎片化,并且證明你有能力優(yōu)化內(nèi)存。嵌入式單片機開發(fā)的后階段,無非就是優(yōu)化內(nèi)存與優(yōu)化代碼執(zhí)行效率。
    2021-08-08
  • C語言菜鳥基礎(chǔ)教程之求1到100的和

    C語言菜鳥基礎(chǔ)教程之求1到100的和

    在C語言中可以通過定義一個累加器(一個變量)并結(jié)合for循環(huán)來實現(xiàn)計算1到100之和。
    2017-10-10
  • C++中單調(diào)棧的基本性質(zhì)介紹

    C++中單調(diào)棧的基本性質(zhì)介紹

    這篇文章主要介紹了單調(diào)棧的基本性質(zhì)介紹,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 深入探討C++父類子類中虛函數(shù)的應(yīng)用

    深入探討C++父類子類中虛函數(shù)的應(yīng)用

    本篇文章是對C++父類子類中虛函數(shù)的使用進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

西乡县| 临夏市| 揭西县| 和硕县| 阳信县| 浏阳市| 沁阳市| 汶川县| 邮箱| 扎兰屯市| 启东市| 屏东市| 定结县| 浏阳市| 岗巴县| 攀枝花市| 乐昌市| 昌江| 怀集县| 应用必备| 河西区| 东乌| 江油市| 达州市| 绥江县| 开平市| 定远县| 辽宁省| 额敏县| 克什克腾旗| 绥江县| 开平市| 新沂市| 云林县| 枝江市| 邹城市| 安徽省| 湄潭县| 孙吴县| 开阳县| 定结县|