溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++?static的作用是什么

發(fā)布時(shí)間:2023-02-22 17:49:03 來(lái)源:億速云 閱讀:123 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“C++ static的作用是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“C++ static的作用是什么”文章吧。

1. 隱藏

當(dāng)同時(shí)編譯多個(gè)文件時(shí),所有未加 static 前綴的全局變量和函數(shù)都具有全局可見(jiàn)性。

下面是一個(gè)簡(jiǎn)單的例子:

假設(shè)我們要編譯兩個(gè)文件 a.c 和 main.c

// a.c
char a = 'A';
void msg()
{
    printf("Hello\n");
}
//main.c
int main(void)
{
    extern char a;
    print(“%c ”, a);
    (void)msg();
    return 0;
}

此時(shí)程序運(yùn)行的結(jié)果是:

A Hello

而如果在 a 和 msg 定義前加了 static,那么 main.c 就無(wú)法使用它們了。利用這一特性可以避免命名沖突。

對(duì)于函數(shù)來(lái)說(shuō),static 的作用僅限于隱藏。而對(duì)于變量來(lái)說(shuō),它還有其他作用。

2. 保持變量?jī)?nèi)容的持久

儲(chǔ)存在靜態(tài)數(shù)據(jù)區(qū)的變量會(huì)在程序剛開(kāi)始運(yùn)行時(shí)完成它唯一的一次初始化,它與全局變量一起儲(chǔ)存在靜態(tài)存儲(chǔ)區(qū),只不過(guò) static 的作用域不一定是全局的。

說(shuō)到底,這其實(shí)也可以理解為一種隱藏。

int func(void)
{
    static int count = 10; //僅在初始化時(shí)被執(zhí)行了一次,靜態(tài)變量只會(huì)進(jìn)行一次初始化
    return count—-;
}

int count = 1;

int main(void)
{
    printf(“global\t\tlocal static\n”);
    for (; count<=10; count++)
    {
        printf(“%d\t\t%d\n”, count, func());
    }
    return 0;
}

3. 默認(rèn)初始化為 0

全局變量也有這一特點(diǎn),因?yàn)樗泊鎯?chǔ)在靜態(tài)數(shù)據(jù)區(qū)。

在靜態(tài)數(shù)據(jù)區(qū)中,所有的字節(jié)默認(rèn)值都是 0x00,利用這一特點(diǎn)可以減少工作量。

如初始化一個(gè)稀疏矩陣,就能省去把所有位置置 0 的操作。

4. 多個(gè)對(duì)象之間數(shù)據(jù)共享

在類(lèi)中,靜態(tài)成員可實(shí)現(xiàn)多個(gè)對(duì)象的數(shù)據(jù)共享,而且由于隱藏的特點(diǎn),它也同時(shí)保證了安全性。

靜態(tài)成員的初始化格式:<數(shù)據(jù)類(lèi)型><類(lèi)名>:: <靜態(tài)成員名>=<值>

  • 初始化在類(lèi)體外進(jìn)行,而且前面不加 static,以免與靜態(tài)變量或?qū)ο蠡煜?/p>

  • 初始化時(shí)不加訪問(wèn)權(quán)限控制符 private public 等

  • 初始化時(shí)用作用域運(yùn)算符標(biāo)明它所屬的類(lèi)。由此也可以看出靜態(tài)數(shù)據(jù)成員是類(lèi)的成員,而不是對(duì)象的成員。

引用靜態(tài)數(shù)據(jù)成員的格式:<類(lèi)名>:: <靜態(tài)成員名>

下面是幾個(gè)例子:

class Point
{
public:
    void output() {}
    static void init()
    {
        x = 0;
        y = 0;
    }
private:
    int x;
    int y;
}

int main(void)
{
    Point:: init();
    return 0;
}

報(bào)錯(cuò),因?yàn)榉庆o態(tài)數(shù)據(jù)成員此時(shí)還沒(méi)有分配內(nèi)存。

class Point
{
public:
    void output() {}
    static void init()
    {
        x = 0;
        y = 0;
    }
private:
    static int x;
    static int y;
}

int main(void)
{
    Point:: init();
    return 0;
}

報(bào)錯(cuò),因?yàn)殪o態(tài)成員變量需要進(jìn)行初始化。

5. 注意

類(lèi)的靜態(tài)成員函數(shù)屬于整個(gè)類(lèi),因此沒(méi)有 this 指針,這就導(dǎo)致了它僅能訪問(wèn)靜態(tài)數(shù)據(jù)和靜態(tài)成員函數(shù)。

不能將靜態(tài)成員函數(shù)定義為虛函數(shù)。

對(duì)靜態(tài)成員進(jìn)行取地址操作會(huì)有些特殊,變量地址是指向其數(shù)據(jù)類(lèi)型的指針,函數(shù)地址類(lèi)型是一個(gè) “nonmember 函數(shù)指針”。

由于沒(méi)有 this 指針,所以相當(dāng)于 nonmember 函數(shù),這就有一個(gè)好處:成為一個(gè) callback 函數(shù),使得我們將 C++ 和 C-based X Window 系統(tǒng)結(jié)合,也成功應(yīng)用于線程函數(shù)身上。

父類(lèi)和子類(lèi)共享靜態(tài)成員。為了防止父類(lèi)的影響,可以在子類(lèi)中定義一個(gè)與父類(lèi)相同的靜態(tài)變量,以屏蔽父類(lèi)的影響。這不會(huì)引起錯(cuò)誤,因?yàn)榫幾g器采用了 name-mangling 方法以生成唯一的標(biāo)志。

以上就是關(guān)于“C++ static的作用是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI