国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

c++ Static 成員:讓類(lèi)變量不再“孤單”

開(kāi)發(fā) 前端
靜態(tài)成員變量和靜態(tài)成員函數(shù)讓我們?cè)?C++ 中能更方便地管理共享數(shù)據(jù)和功能。它的一個(gè)關(guān)鍵特點(diǎn)是:它們屬于整個(gè)類(lèi),而不是某個(gè)具體的對(duì)象。

前言

如果說(shuō) static 變量讓函數(shù)“記住”上一次的狀態(tài),那么 static 成員變量就像是整個(gè)類(lèi)的“共享記憶”。這次,我們將從類(lèi)的角度來(lái)聊聊 static 成員變量和函數(shù),幫你徹底搞懂它們是什么,怎么用。

什么是 static 成員變量?

在 C++ 中,類(lèi)的成員變量通常是屬于某個(gè)具體對(duì)象的,每個(gè)對(duì)象都會(huì)有一份獨(dú)立的成員變量。而 static 成員變量 可不一樣,它是所有對(duì)象共享的一個(gè)變量。

舉個(gè)例子:

假設(shè)我們有一個(gè)類(lèi) Car,它有一個(gè)成員變量 carCount 用來(lái)統(tǒng)計(jì)車(chē)的數(shù)量。

如果每個(gè) Car 對(duì)象都單獨(dú)存儲(chǔ)這個(gè)數(shù)量,那就沒(méi)什么意義了。因?yàn)?nbsp;carCount 應(yīng)該是所有 Car 對(duì)象共享的,而不是每個(gè)對(duì)象都自有一份。這個(gè)時(shí)候,就可以用 static 來(lái)聲明 carCount。

#include <iostream>
using namespace std;

class Car {
public:
    static int carCount;  // 聲明靜態(tài)成員變量

    Car() {
        carCount++;
    }
};

// 靜態(tài)成員變量需要在類(lèi)外定義
int Car::carCount = 0;

int main() {
    Car car1;
    Car car2;

    cout << "Number of cars: " << Car::carCount << endl;  // 輸出:2
    return 0;
}

在這個(gè)例子中,carCount 變量是靜態(tài)的,所有 Car 對(duì)象共享同一個(gè) carCount,所以無(wú)論創(chuàng)建多少個(gè) Car 對(duì)象,它都會(huì)累加。

如何訪問(wèn) static 成員?

靜態(tài)成員的訪問(wèn)和普通成員稍微有些不同。普通成員變量需要通過(guò)對(duì)象來(lái)訪問(wèn),而靜態(tài)成員變量可以通過(guò) 類(lèi)名:: 來(lái)直接訪問(wèn),甚至不需要?jiǎng)?chuàng)建對(duì)象。

訪問(wèn)靜態(tài)成員:

class Car {
public:
    static int carCount;  // 靜態(tài)成員變量

    Car() {
        carCount++;
    }
};

// 在類(lèi)外定義靜態(tài)成員
int Car::carCount = 0;

int main() {
    // 直接通過(guò)類(lèi)名訪問(wèn)靜態(tài)成員
    cout << "Initial car count: " << Car::carCount << endl;  // 輸出:0

    Car car1;
    cout << "After one car: " << Car::carCount << endl;  // 輸出:1
    Car car2;
    cout << "After two cars: " << Car::carCount << endl;  // 輸出:2

    return 0;
}

你可以看到,靜態(tài)成員 carCount 通過(guò) Car::carCount 來(lái)訪問(wèn),不需要?jiǎng)?chuàng)建 Car 對(duì)象。這樣就避免了不必要的內(nèi)存浪費(fèi)。

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

什么是靜態(tài)成員函數(shù)?

靜態(tài)成員函數(shù) 是屬于類(lèi)的,而不是某個(gè)對(duì)象的。也就是說(shuō),你可以通過(guò)類(lèi)名來(lái)調(diào)用它,而不需要先創(chuàng)建對(duì)象。這一點(diǎn)與普通的成員函數(shù)不同,普通成員函數(shù)是通過(guò)對(duì)象來(lái)調(diào)用的。

它有什么特點(diǎn)?

1、類(lèi)級(jí)別的函數(shù):靜態(tài)成員函數(shù)屬于類(lèi)級(jí)別,不依賴(lài)于任何對(duì)象。你不需要?jiǎng)?chuàng)建類(lèi)的實(shí)例,就能通過(guò)類(lèi)名直接調(diào)用。

2、只能訪問(wèn)靜態(tài)成員:靜態(tài)成員函數(shù)只能訪問(wèn)類(lèi)中的靜態(tài)成員變量和其他靜態(tài)成員函數(shù),因?yàn)樗鼪](méi)有綁定到任何具體的對(duì)象,也就無(wú)法訪問(wèn)屬于對(duì)象的非靜態(tài)成員。

3、沒(méi)有 this 指針:普通成員函數(shù)有一個(gè)隱含的 this 指針,指向調(diào)用該函數(shù)的對(duì)象,而靜態(tài)成員函數(shù)沒(méi)有 this 指針。

與普通成員函數(shù)的區(qū)別是什么?

  • 普通成員函數(shù):普通成員函數(shù)是與對(duì)象關(guān)聯(lián)的,它可以訪問(wèn)類(lèi)的靜態(tài)和非靜態(tài)成員。訪問(wèn)非靜態(tài)成員時(shí),它依賴(lài)于對(duì)象的 this 指針。
  • 靜態(tài)成員函數(shù):靜態(tài)成員函數(shù)沒(méi)有 this 指針,它不能直接訪問(wèn)非靜態(tài)成員,只能訪問(wèn)靜態(tài)成員。

舉個(gè)例子:

#include <iostream>
using namespace std;

class Car {
public:
    static int carCount;  // 靜態(tài)成員變量

    Car() {
        carCount++;
    }

    // 靜態(tài)成員函數(shù)
    static void printCarCount() {
        cout << "Number of cars: " << carCount << endl;
    }
};

// 靜態(tài)成員變量需要在類(lèi)外定義
int Car::carCount = 0;

int main() {
    Car car1;
    Car car2;

    // 通過(guò)類(lèi)名調(diào)用靜態(tài)成員函數(shù)
    Car::printCarCount();  // 輸出:2
    return 0;
}

在上面的代碼中,printCarCount() 是一個(gè)靜態(tài)成員函數(shù),它只能訪問(wèn)靜態(tài)成員變量 carCount,不能直接訪問(wèn)非靜態(tài)成員變量。如果嘗試訪問(wèn)非靜態(tài)成員,編譯器會(huì)報(bào)錯(cuò)。

靜態(tài)成員函數(shù)不能訪問(wèn)非靜態(tài)成員:

class Car {
public:
    int speed;  // 非靜態(tài)成員變量
    static int carCount;  // 靜態(tài)成員變量

    static void printSpeed() {
        // 編譯錯(cuò)誤:靜態(tài)成員函數(shù)無(wú)法訪問(wèn)非靜態(tài)成員變量
        cout << "Speed: " << speed << endl;
    }
};

那為什么靜態(tài)成員函數(shù)不能訪問(wèn)非靜態(tài)成員?

這個(gè)問(wèn)題其實(shí)很好理解,關(guān)鍵在于靜態(tài)成員函數(shù)的“身份”問(wèn)題。

1、靜態(tài)成員函數(shù)屬于類(lèi),而不是對(duì)象:靜態(tài)成員函數(shù)是在類(lèi)層面上定義的,它沒(méi)有綁定到具體的對(duì)象。所以,當(dāng)你調(diào)用靜態(tài)成員函數(shù)時(shí),它是通過(guò)類(lèi)名來(lái)調(diào)用的,不依賴(lài)于任何特定的對(duì)象。

2、非靜態(tài)成員屬于對(duì)象:而非靜態(tài)成員變量和普通成員函數(shù)是屬于具體對(duì)象的。當(dāng)你創(chuàng)建一個(gè)對(duì)象時(shí),非靜態(tài)成員才會(huì)存在,并且只有通過(guò)這個(gè)對(duì)象才能訪問(wèn)這些成員。

靜態(tài)成員函數(shù)無(wú)法訪問(wèn)非靜態(tài)成員的原因就是,它不屬于任何特定的對(duì)象,所以無(wú)法知道該訪問(wèn)哪個(gè)對(duì)象的非靜態(tài)成員。換句話說(shuō),靜態(tài)成員函數(shù)沒(méi)有“this”指針,它無(wú)法指向具體的對(duì)象,也就不能訪問(wèn)屬于某個(gè)對(duì)象的成員。

舉個(gè)例子來(lái)說(shuō)明:

還是上面 Car 類(lèi)的例子,speed 是一個(gè)非靜態(tài)成員變量,而 carCount 是一個(gè)靜態(tài)成員變量。

  • 當(dāng)你調(diào)用靜態(tài)成員函數(shù) printSpeed() 時(shí),它是通過(guò)類(lèi)名來(lái)調(diào)用的。這個(gè)函數(shù)沒(méi)有“this”指針,無(wú)法知道是哪個(gè) Car 對(duì)象的 speed 變量。
  • 但是,靜態(tài)成員函數(shù)可以訪問(wèn)類(lèi)中的靜態(tài)成員 carCount,因?yàn)殪o態(tài)成員是屬于類(lèi)的,不依賴(lài)于具體的對(duì)象。

所以,靜態(tài)成員函數(shù)只能訪問(wèn)靜態(tài)成員變量和其他靜態(tài)函數(shù),無(wú)法訪問(wèn)非靜態(tài)成員。

小結(jié):

靜態(tài)成員函數(shù)和對(duì)象沒(méi)關(guān)系,它不屬于某個(gè)具體對(duì)象,所以它不能直接操作對(duì)象的非靜態(tài)成員變量。

static 成員的應(yīng)用場(chǎng)景:

了解了靜態(tài)成員變量和靜態(tài)成員函數(shù)的基本概念,接下來(lái)我們來(lái)聊聊它們的實(shí)際應(yīng)用場(chǎng)景。雖然在很多情況下,我們的類(lèi)對(duì)象都有自己獨(dú)立的成員變量和成員函數(shù),但在某些特定場(chǎng)景下,靜態(tài)成員就能派上大用場(chǎng)。

1. 全局共享數(shù)據(jù)

假設(shè)我們有一個(gè)程序需要統(tǒng)計(jì)不同用戶的訪問(wèn)次數(shù),而這個(gè)次數(shù)應(yīng)該對(duì)所有用戶共享,而不是每個(gè)用戶都有一份。這時(shí),靜態(tài)成員變量就能幫助我們做到這一點(diǎn)。

例如,我們可以在用戶類(lèi)中創(chuàng)建一個(gè)靜態(tài)的訪問(wèn)計(jì)數(shù)器,所有用戶對(duì)象共享這個(gè)計(jì)數(shù)器,這樣每當(dāng)有用戶訪問(wèn)時(shí),計(jì)數(shù)器就會(huì)增加,而不需要每個(gè)對(duì)象都單獨(dú)保存一份。

class User {
public:
    static int visitCount;  // 所有用戶共享

    User() {
        visitCount++;
    }
};

// 在類(lèi)外定義靜態(tài)變量
int User::visitCount = 0;

int main() {
    User user1;
    User user2;
    cout << "Total visits: " << User::visitCount << endl;  // 輸出:2
    return 0;
}

在這個(gè)例子中,不管你創(chuàng)建多少個(gè) User 對(duì)象,它們都會(huì)共享同一個(gè) visitCount,這樣就避免了每個(gè)用戶對(duì)象都存儲(chǔ)計(jì)數(shù)的重復(fù)工作。

2. 工廠模式中的靜態(tài)成員

有些時(shí)候,類(lèi)中的靜態(tài)成員函數(shù)可以幫助你創(chuàng)建對(duì)象。工廠模式就是一個(gè)常見(jiàn)的例子,它允許你通過(guò)靜態(tài)成員函數(shù)來(lái)創(chuàng)建類(lèi)的實(shí)例,而不需要在外部直接調(diào)用構(gòu)造函數(shù)。

class Product {
public:
    static Product* createProduct() {
        return new Product();
    }
};

int main() {
    Product* product = Product::createProduct();
    // 使用 product
    delete product;
    return 0;
}

在這里,createProduct 是一個(gè)靜態(tài)成員函數(shù),用來(lái)創(chuàng)建 Product 對(duì)象。這種做法能夠封裝對(duì)象創(chuàng)建的細(xì)節(jié),提供更靈活的控制。

3. 配置類(lèi)中的靜態(tài)成員

在很多程序中,我們可能會(huì)有一個(gè)配置類(lèi),用來(lái)保存一些全局的配置數(shù)據(jù)(如程序的設(shè)置、資源路徑、日志級(jí)別等)。這些配置信息往往是固定的,不會(huì)因?yàn)閷?duì)象的創(chuàng)建而變化。此時(shí),靜態(tài)成員變量非常適合用來(lái)保存這些共享的數(shù)據(jù)。

例如,一個(gè)全局的日志配置類(lèi)可以用靜態(tài)成員來(lái)記錄當(dāng)前的日志級(jí)別:

class Logger {
public:
    static int logLevel;

    static void log(const string& message) {
        if (logLevel >= 2) {
            cout << "Log: " << message << endl;
        }
    }
};

// 在類(lèi)外定義靜態(tài)變量
int Logger::logLevel = 2;

int main() {
    Logger::log("Program started");
    Logger::logLevel = 1;
    Logger::log("Another log");
    return 0;
}

在這個(gè)例子中,logLevel 是一個(gè)靜態(tài)成員,所有日志都根據(jù)這個(gè)靜態(tài)設(shè)置來(lái)決定是否輸出。

總結(jié):

靜態(tài)成員變量和靜態(tài)成員函數(shù)讓我們?cè)?C++ 中能更方便地管理共享數(shù)據(jù)和功能。它的一個(gè)關(guān)鍵特點(diǎn)是:它們屬于整個(gè)類(lèi),而不是某個(gè)具體的對(duì)象。所以,多個(gè)對(duì)象之間能共享同一份數(shù)據(jù),避免了每個(gè)對(duì)象都要獨(dú)占一份的情況。這不僅節(jié)省內(nèi)存,也讓代碼更加簡(jiǎn)潔高效。

今天我們了解了靜態(tài)成員變量和靜態(tài)成員函數(shù)的基本用法,知道了如何共享數(shù)據(jù)、訪問(wèn)靜態(tài)成員,還明白了為什么靜態(tài)成員函數(shù)不能訪問(wèn)非靜態(tài)的成員。

責(zé)任編輯:武曉燕 來(lái)源: 跟著小康學(xué)編程
相關(guān)推薦

2010-01-18 18:04:28

靜態(tài)成員

2023-03-21 15:21:52

開(kāi)發(fā)程序設(shè)計(jì)static

2010-01-18 16:42:13

C++類(lèi)

2010-02-01 17:31:06

C++類(lèi)成員

2024-02-22 18:07:17

C++靜態(tài)成員代碼

2010-01-19 18:35:12

靜態(tài)成員

2011-07-20 16:09:08

C++

2023-10-07 15:53:05

C/C++靜態(tài)變量內(nèi)存

2009-05-26 09:31:00

C++重載覆蓋

2021-06-18 12:30:36

C++函數(shù)指針編程語(yǔ)言

2024-04-08 11:35:34

C++static關(guān)鍵字

2010-02-03 11:01:18

C++類(lèi)靜態(tài)成員初始化

2023-12-04 10:57:52

函數(shù)C++

2010-01-21 14:19:44

C++靜態(tài)成員

2024-02-26 10:36:59

C++開(kāi)發(fā)關(guān)鍵字

2011-08-10 17:16:01

Objective-C靜態(tài)變量

2010-01-13 17:28:32

SOHO交換機(jī)

2010-02-03 15:27:26

C++ static

2011-04-07 16:34:05

staticC++

2010-01-26 15:51:06

C++變量
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

91视频网页| 国产精品一区不卡| 国产精品涩涩涩视频网站| 亚洲免费伊人电影在线观看av| 夜夜精品视频| 蜜桃视频网站在线观看| 99久久精品久久久久久ai换脸| 精品国产91久久久| 一区二区三区网站| 韩国中文免费在线视频| 99久久一区三区四区免费| 精品视频免费看| 日韩亚洲精品在线| 日本三级韩国三级欧美三级| 日本三级中国三级99人妇网站| 欧美在线色视频| 久久久成人网| 超碰在线caoporn| 亚洲图色在线| xxxxxxxxx欧美| 日韩一区在线播放| 亚洲国产精品久久久久蝴蝶传媒| 国产精品刘玥久久一区| 蜜臀av无码一区二区三区| 国模私拍视频一区| 色婷婷综合久色| 99麻豆久久久国产精品免费| 亚洲资源网站| 制服丝袜在线播放| 天堂网在线免费观看| 国产欧美一区二区三区不卡高清| 日韩高清有码在线| 亚洲欧美日韩中文字幕一区二区三区| 亚洲激情网址| 亚洲成人看片| 欧美18一12sex性处hd| a级黄色小视频| 91久久在线观看| 一区二区三区视频在线| 亚洲国产cao| 成人激情动漫在线观看| 国产无套粉嫩白浆在线2022年| 黄色一级在线视频| 成人免费看片网站| 日韩在线播放一区| 欧美精品高清视频| 一区二区成人在线| 成人精品在线视频观看| 亚洲免费播放| 在线看成人短视频| 91p九色成人| 91欧美在线视频| 午夜影院韩国伦理在线| 国产一区一区三区| 亚洲精品在线电影| 色婷婷综合久久久中文字幕| 日本一区二区三区久久久久久久久不 | 亚洲精品一区av在线播放| 日韩欧美亚洲国产一区| 亚洲色图在线播放| 国产一区二区三区四| 欧美久久久久| 国产精品美女久久久久久不卡| 欧美大片高清| 狂野欧美性猛交xxxxx视频| 毛片网站在线| 香蕉视频色版| 91传媒在线观看| 三年中国国语在线播放免费| 人妻激情另类乱人伦人妻| 欧美一区国产一区| 国产一区二区无遮挡| 91久久精品美女高潮| 日韩av手机在线看| 韩国精品久久久999| 日韩色av导航| 国产亚洲精品美女久久久久| 亚洲精品v天堂中文字幕| 欧美日韩国产高清一区| 欧美性猛交xxxx久久久| 欧美日韩亚洲天堂| 亚洲国产一区二区a毛片| 亚洲欧美另类小说| 亚洲免费av观看| 亚洲国产视频在线| 岛国av一区二区在线在线观看| 亚洲女性喷水在线观看一区| 亚洲免费电影在线| 天天影视涩香欲综合网| 色诱视频网站一区| 欧美日韩一卡二卡| 欧美一区二区福利视频| 亚洲精品一区二区三区蜜桃下载| 欧美一级理论性理论a| 亚洲国产美女久久久久 | 欧美日韩激情美女| 欧美日本一道本在线视频| 91 com成人网| 91精品国产综合久久久久| 精品欧美一区二区三区精品久久| 欧美一级欧美一级在线播放| 亚洲乱亚洲乱妇无码| 成人xxxxx| 日韩av在线高清| 国产精品婷婷| 欧美va在线观看| 在线观看av网站永久| 杨幂一区欧美专区| 波多野结衣成人在线| 在线免费观看日本欧美| 秋霞午夜鲁丝一区二区老狼| 丁香综合av| 黄网视频在线观看| 91九色蝌蚪成人| 欧日韩精品视频| 日韩精品电影一区亚洲| 性欧美高清come| √8天堂资源地址中文在线| 成人在线黄色| 亚洲精品中文字幕乱码| 精品一区二区三区视频在线观看 | 中国china体内裑精亚洲片| 欧洲成人性视频| 亚洲欧美一区二区原创| 婷婷亚洲天堂| 日本在线视频站| 日韩国产在线不卡视频| 亚洲看片一区| 国产精品久久久久一区二区三区共| 欧美性xxxxxxxx| 欧美高清视频免费观看| 日韩欧美一区二区三区四区| 女人被爽到呻吟gif动态图下载| 国产色播av在线| 国产一区亚洲| 亚洲国产综合人成综合网站| 在线观看日韩欧美| 久久综合九色综合久99| 中文字幕在线观| 国产精品99久久免费观看| 日本人妖一区二区| 在线观看日韩电影| 日本精品久久中文字幕佐佐木| 最新黄色av网站| 国产高清一区二区三区视频| 亚洲v天堂v手机在线| 久久老女人爱爱| 亚洲热线99精品视频| 免费看污久久久| 91ph在线| 亚洲美女色禁图| 午夜激情一区二区三区| 国产成人极品视频| 超级污的网站| 成人在线精品| 国产精品亚洲四区在线观看| 欧美日韩二三区| 香蒸焦蕉伊在线| 国产福利一区二区| 欧美一区二区三区精品电影| 国产视频网址在线| 成人综合婷婷国产精品久久免费| 欧美激情综合亚洲一二区| 大胆av不用播放器在线播放 | 麻豆系列在线观看| 亚洲国产高清在线| 视频二区一区| 中文一区一区三区免费在线观看| 永久免费看mv网站入口亚洲| 国产中文字幕在线| 中文字幕在线免费不卡| 麻豆传媒网站在线观看| 国内精品久久久久久久影视麻豆| 另类专区欧美制服同性| 波多野结衣精品| 亚洲超碰精品一区二区| 成人3d动漫一区二区三区| 狠狠色狠狠色综合| 亚洲影院色无极综合| 好吊妞视频这里有精品| 夜夜躁日日躁狠狠久久88av| av成人手机在线| 亚州成人在线电影| 国产精品少妇在线视频| 懂色一区二区三区免费观看| 精品亚洲第一| 在线国产日韩| caoporen国产精品| 午夜性色一区二区三区免费视频| 国产精品成人播放| 免费日韩一区二区三区| 久久久久日韩精品久久久男男| 日本阿v视频在线观看| 91精品秘密在线观看| 欧美精品成人在线| 国外成人福利视频| 亚洲精品久久在线| 成人影音在线| 日韩精品免费看| 日韩免费影院|