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

詳解c++中的 static 關(guān)鍵字及作用

 更新時(shí)間:2020年02月16日 09:01:39   作者:PRO_Z  
這篇文章主要介紹了c++中的 static 關(guān)鍵字,在我們?nèi)粘J褂眠^程中,static通常有兩個(gè)作用,具體內(nèi)容在文中給大家詳細(xì)介紹,需要的朋友可以參考下

注:若沒有特指是 靜態(tài)成員時(shí),默認(rèn)都是普通成員;

1 類中的普通成員

  類中的成員變量 和 成員函數(shù) 是分開存儲(chǔ)的。其中,

    1)每個(gè)對(duì)象都有獨(dú)立的成員變量;成員變量可以存儲(chǔ)在 ??臻g、堆空間、全局?jǐn)?shù)據(jù)區(qū);

    2)所有對(duì)象共享類的成員函數(shù);成員函數(shù) 只能存儲(chǔ)在 代碼段;

2 類中的靜態(tài)成員(static)

  類中的靜態(tài)成員

    1、用 static關(guān)鍵字 修飾;

    2、可以用 類名::成員名 訪問 靜態(tài)成員;

    3、靜態(tài)成員 屬于 整個(gè)類;

    4、靜態(tài)成員 是所屬類的成員,其它類不能訪問;

    5、靜態(tài)成員的內(nèi)存分配 是 唯一的;

  1) 靜態(tài)成員變量

    特征:1、靜態(tài)成員變量 屬于 整個(gè)類所有;

       2、靜態(tài)成員變量的生命周期不依賴任何對(duì)象;(靜態(tài)成員變量的生命周期在程序的運(yùn)行期)

       3、所有對(duì)象共享類的靜態(tài)成員變量;

       4、可以通過 類名 直接訪問公有的靜態(tài)成員變量;

       5、可以通過 對(duì)象名 訪問公有的靜態(tài)成員變量;

       6、靜態(tài)成員變量 需要在類外單獨(dú)分配空間;(類內(nèi)聲明、類外定義并初始化)

       7、靜態(tài)成員變量 在程序內(nèi)部位于全局?jǐn)?shù)據(jù)區(qū),不計(jì)入類的內(nèi)存計(jì)算。

    原因/好處:使用靜態(tài)成員變量實(shí)現(xiàn)多個(gè)對(duì)象之間的數(shù)據(jù)共享不會(huì)破壞隱藏的原則,保證了安全性還可以節(jié)省內(nèi)存。

    使用方法:

      1、在類的內(nèi)部,使用 static 修飾普通成員變量;

      2、在類的外部(全局作用域),使用 Type ClassName::VarName = value 初始化,并申請(qǐng)存儲(chǔ)空間;

        注:靜態(tài)成員變量不屬于類的任何對(duì)象,所以并不是對(duì)象建立時(shí)被定義的,所以它不能由類的構(gòu)造函數(shù)初始化,一般也不能在類內(nèi)初始化;

/*
 靜態(tài)成員變量 只能在類的內(nèi)部聲明,在類的外部(全局區(qū))定義和初始化;
*/

#include <iostream>

using namespace std;

class Test{
public:
 int GetA() const{return a;}
private:
 static int a; // 靜態(tài)成員變量
};
//int Test::a;如果這樣定義不賦予初值,則初值為零
int Test::a = 1;

int main(int argc, char *argv[])
{
 Test T;

 cout << T.GetA() << endl;

 return 0;
}

  靜態(tài)成員變量 被類的所有對(duì)象共享,包括派生類對(duì)象;

#include <iostream>
using namespace std;
class Base{
public:
 static int a; // 靜態(tài)成員變量
};
// int Test::a;如果這樣定義不賦予初值,則初值為零
int Base::a;
class Derived : public Base{
};
int main(int argc, char *argv[])
{
 Base B;
 Derived D;
 B.a++;
 cout << B.a << endl; // 1
 D.a++;
 cout << D.a << endl; // 2
 return 0;
}

  靜態(tài)成員變量可以作為普通成員函數(shù)的默認(rèn)形參,而普通成員變量則不可以;

class Test{
public:
 static int a; //靜態(tài)成員變量
 int b;
 void fun_1(int i = a); //正確
 //void fun_2(int i = b); //報(bào)錯(cuò)
};

  靜態(tài)成員變量的類型 可以是所屬類的類型,而普通成員變量則不可以。普通成員變量只能聲明為 所屬類類型的 指針或引用;

class Test{
public:
 static Test a; //正確
 Test b; //報(bào)錯(cuò)
 Test *pTest; //正確
 Test &m_Test; //正確
 static Test *pStaticObject; //正確
};

  靜態(tài)成員變量在const函數(shù)中可以修改,而普通的成員變量是萬(wàn)萬(wàn)不能修改的;

/*
  const修飾的是當(dāng)前this指針?biāo)赶虻膶?duì)象是const,但是靜態(tài)成員變量不屬于任何類的對(duì)象,它被類的所有對(duì)象修改,所以this指針不修飾靜態(tài)的成員變量,所以可以更改。
*/
class Test{
public:
 static int a;
 int b;
public:
 Test():b(0){}
 void test() const
 {
 a++;
 //b++; // err // const指的是不能修改當(dāng)前調(diào)用該函數(shù)對(duì)象的成員變量
 }
};

int Test::a;

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

    特征:1、靜態(tài)成員函數(shù) 屬于 整個(gè)類所有;

       2、所有對(duì)象共享類的靜態(tài)成員函數(shù);

       2、可以通過 類名 直接訪問公有的靜態(tài)成員函數(shù);

       3、可以通過 對(duì)象名 訪問公有的靜態(tài)成員函數(shù);

       4、靜態(tài)成員函數(shù) 只能 訪問靜態(tài)成員,不能訪問 非靜態(tài)成員;

       5、靜態(tài)成員函數(shù)沒有this指針,也就是說(shuō)靜態(tài)成員函數(shù)不能使用修飾符(也就是函數(shù)后面的const關(guān)鍵字);

    原因:處理靜態(tài)成員變量; 

    使用方法:直接用 static 修飾 普通成員函數(shù)(類內(nèi)聲明時(shí)),不需要 static 修飾(類外定義時(shí));

    總結(jié):

    案例分析:

/**
 * 統(tǒng)計(jì)某班選修課考試的平均成績(jī)
*/
#include <iostream>
#include <string>
using namespace std;
class Student
{
private:
 string name; // 姓名
 string gender; // 性別
 float score; // 分?jǐn)?shù)
 string subject; // 課程
 static int total_counts; // 總?cè)藬?shù)
 static float chinese_scores; // 語(yǔ)文分?jǐn)?shù)
 static int chinese_counts; // 語(yǔ)文課人數(shù)
 static float math_scores; // 數(shù)學(xué)分?jǐn)?shù)
 static int math_counts;  // 數(shù)學(xué)課人數(shù)
public:
 Student(string name, string gender, float score, string subject);
 ~Student();
 static float aveScores(string subject);
 void printStudentInfo();
 void printAveScores();
};
int Student::total_counts = 0;
float Student::chinese_scores = 0;
int Student::chinese_counts = 0;
float Student::math_scores = 0;
int Student::math_counts = 0;
Student::Student(string name, string gender, float score, string subject)
{
 this->name = name;
 this->gender = gender;
 this->score = score;
 this->subject = subject;
 if(subject == "chinese" || subject == "語(yǔ)文")
 {
 chinese_scores += score;
 chinese_counts++;
 }
 else if(subject == "math" || subject == "數(shù)學(xué)")
 {
 math_scores += score;
 math_counts++;
 }
 else
 {
 cout << "this is no the subect:" << subject << endl;
 }
 total_counts += (chinese_counts + math_counts);
}
Student::~Student()
{
 total_counts--;
 chinese_counts--;
 math_counts--;
}
float Student::aveScores(string subject)
{
 float ave_score = 0;
 if(chinese_counts > 0 && subject == "chinese" || subject == "語(yǔ)文")
 {
 ave_score = (chinese_scores / chinese_counts);
 //cout << subject << "\t" << chinese_counts << "\t" << chinese_scores << endl;
 }
 else if(math_counts > 0 && subject == "math" || subject == "數(shù)學(xué)")
 {
 ave_score = (math_scores / math_counts);
 //cout << subject << "\t" <<math_counts << "\t" << math_scores << endl;
 }
 return ave_score;
}
void Student::printStudentInfo()
{
 cout << name << "\t" << gender << "\t" << score << "\t" << subject << endl;
}
void Student::printAveScores()
{
 cout <<subject << " average score: " << aveScores(subject) << endl;
}
int main(int argc, char const *argv[])
{
 const int SIZE = 5;
 Student stu[SIZE] = 
 {
  Student("10001", "male", 92, "語(yǔ)文"),
  Student("10002", "male", 91, "數(shù)學(xué)"),
  Student("10003", "male", 91, "數(shù)學(xué)"),
  Student("10004", "male", 93, "語(yǔ)文"),
  Student("10005", "male", 92, "語(yǔ)文"),
 };
 for(int i = 0; i < SIZE; i++)
 {
 stu[i].printStudentInfo();
 }
 stu[0].printAveScores();
 stu[1].printAveScores();
 cout << "語(yǔ)文" << " average score: " << Student::aveScores("語(yǔ)文") << endl;
 cout << "數(shù)學(xué)" << " average score: " << Student::aveScores("數(shù)學(xué)") << endl;
 return 0;
}
靜態(tài)成員的案例分析

下面看下c語(yǔ)言中的static關(guān)鍵字的作用

在我們?nèi)粘J褂眠^程中,static通常有兩個(gè)作用:

1、修飾變量

靜態(tài)全局變量:全局變量前加static修飾,該變量就成為了靜態(tài)全局變量。我們知道,全部變量在整個(gè)工程都可以被訪問(一個(gè)文件中定義,其它文件使用的時(shí)候添加extern關(guān)鍵字聲明 ),而在添加了static關(guān)鍵字之后,這個(gè)變量就只能在本文件內(nèi)被訪問了。因此,在這里,static的作用就是限定作用域。

靜態(tài)局部變量:局不變量添加了static修飾之后,該變量就成為了靜態(tài)局部變量。我們知道局部變量在離開了被定義的函數(shù)后,就會(huì)被銷毀,而當(dāng)使用static修飾之后,它的作用域就一直到整個(gè)程序結(jié)束。因此,在這里static的作用就是限定生命周期。

2、修飾函數(shù)

修飾函數(shù)則該函數(shù)成為靜態(tài)函數(shù),函數(shù)的作用域僅限于本文件,而不能被其它文件調(diào)用。

總結(jié)

以上所述是小編給大家介紹的c++中的 static 關(guān)鍵字及作用,希望對(duì)大家有所幫助!

相關(guān)文章

  • C++深入探究繼承的概念與使用

    C++深入探究繼承的概念與使用

    繼承是C++面向?qū)ο缶幊讨械囊婚T。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對(duì)父類的允許訪問的方法實(shí)行的過程進(jìn)行重新編寫,返回值和形參都不能改變。就是對(duì)原本的父類進(jìn)行重新編寫,但是外部接口不能被重寫
    2022-05-05
  • C語(yǔ)言入門篇--變量[定義,初始化賦值,外部聲明]

    C語(yǔ)言入門篇--變量[定義,初始化賦值,外部聲明]

    本篇文章是c語(yǔ)言基礎(chǔ)篇,本文對(duì)初識(shí)c語(yǔ)言的變量、變量的定義、初始化與賦值、變量的分類、含義、外部聲明做了簡(jiǎn)要的描述,幫助大家快速入門c語(yǔ)言的世界,更好的理解c語(yǔ)言
    2021-08-08
  • C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊源代碼

    C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊源代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)俄羅斯方塊的源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 關(guān)于c語(yǔ)言中回調(diào)函數(shù)的理解

    關(guān)于c語(yǔ)言中回調(diào)函數(shù)的理解

    這篇文章主要給大家介紹了關(guān)于c語(yǔ)言中回調(diào)函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++中指針和引用的區(qū)別分析

    C++中指針和引用的區(qū)別分析

    這篇文章主要介紹了C++中指針和引用的區(qū)別,有需要的朋友可以參考一下
    2014-01-01
  • C++使用回溯法解決黃金礦工問題

    C++使用回溯法解決黃金礦工問題

    在矩陣中考察回溯算法,分為任意起點(diǎn)、左上角開始等情況。從而有不同的模板,其實(shí)區(qū)別就是直接開始還是每個(gè)坐標(biāo)都去嘗試,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-10-10
  • C++全排列中遞歸交換法實(shí)例詳解

    C++全排列中遞歸交換法實(shí)例詳解

    在本篇文章里小編給各位整理的是關(guān)于C++全排列中遞歸交換法實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • C++中隊(duì)列的建立與操作詳細(xì)解析

    C++中隊(duì)列的建立與操作詳細(xì)解析

    隊(duì)列結(jié)構(gòu)是從數(shù)據(jù)運(yùn)算來(lái)分類的,也就是說(shuō)隊(duì)列結(jié)構(gòu)具有特殊的運(yùn)算規(guī)則。而從數(shù)據(jù)的邏輯結(jié)構(gòu)來(lái)看,隊(duì)列結(jié)構(gòu)其實(shí)就是一種線性結(jié)構(gòu)。如果從數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)來(lái)進(jìn)一步劃分,隊(duì)列結(jié)構(gòu)可以分成兩類
    2013-10-10
  • 詳解C++循環(huán)創(chuàng)建多級(jí)目錄及判斷目錄是否存在的方法

    詳解C++循環(huán)創(chuàng)建多級(jí)目錄及判斷目錄是否存在的方法

    這篇文章主要介紹了C++循環(huán)創(chuàng)建多級(jí)目錄及判斷目錄是否存在的方法,文中代碼有一個(gè)針對(duì)各種系統(tǒng)進(jìn)行判斷來(lái)加載不同頭文件的方法,需要的朋友可以參考下
    2016-03-03
  • C++標(biāo)準(zhǔn)模板庫(kù)STL深入講解

    C++標(biāo)準(zhǔn)模板庫(kù)STL深入講解

    STL提供了一組表示容器、迭代器、函數(shù)對(duì)象和算法的模板。容器是一個(gè)與數(shù)組類似的單元,可以存儲(chǔ)若干個(gè)值。STL容器是同質(zhì)的,即存儲(chǔ)的值的類型相同:算法是完成特定任務(wù)(如對(duì)數(shù)組進(jìn)行排序或在鏈表中查找特定值)的處方
    2022-12-12

最新評(píng)論

眉山市| 晋江市| 琼中| 浠水县| 东兰县| 雷山县| 潍坊市| 太仓市| 罗田县| 宣城市| 仁寿县| 马鞍山市| 郑州市| 红安县| 西峡县| 伊通| 水城县| 潜山县| 宁国市| 石渠县| 陆川县| 普兰店市| 易门县| 安义县| 富蕴县| 霍邱县| 贵溪市| 浦北县| 花垣县| 金平| 宁陕县| 舒兰市| 怀来县| 合阳县| 凉山| 永德县| 马公市| 新平| 开远市| 含山县| 金塔县|