国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ -- 學習系列 static 關鍵字的使用

這篇具有很好參考價值的文章主要介紹了C++ -- 學習系列 static 關鍵字的使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

static 是 C++ 中常用的關鍵字,被 static 修飾的變量只會在 靜態(tài)存儲區(qū)(常量數據也存放在這里) 被分配一次內存,生命周期與整個程序一樣,隨著程序的消亡而消亡。

一? static 有以下幾種用法:

1. 在文件中定義的 靜態(tài)全局變量

2. 在函數中定義的靜態(tài)變量

3. 類的靜態(tài)成員變量

4. 靜態(tài)類對象

5. 類的靜態(tài)方法

1. 在文件中定義的 靜態(tài)全局變量

// main.cpp
#include<iostream>

int  xxx = 66; 

static int yyy = 888;

int main()
{
   std::cout << xxx << std::endl;
   std::cout << xxx << std::endl;
   
   return ;
}
  • 全局變量特點:

全局變量默認是有外部鏈接性的,作用域是整個工程,在一個文件內定義的全局變量,在另一個文件中,通過 extern 全局變量名的聲明,就可以使用全局變量。

  • 靜態(tài)全局變量特點:

全局靜態(tài)變量是顯式用 static 修飾的全局變量,作用域是聲明此變量所在的文件,其他的文件即使用 extern 聲明也不能使用。

2. 在函數中定義的靜態(tài)局部變量

在函數中定義的靜態(tài)變量僅僅初始化一次,且變量會存儲到靜態(tài)存儲區(qū),因此即便離開函數作用域也不會消失。

// c.h
#include<iostream>
#include<string>

class C
{
public:
    C(std::string n):name(n)
    {
        std::cout << "constructor C " << std::endl;
    }
    ~C(){
        std::cout << "destructor C " << std::endl;
    }

    std::string  getName()
    {
        return this->name;
    }

private:
    std::string name;
};


// main.cpp

#include<iostream>
#include"c.h"

void  testStatic()
{
   static  int  count = 0;  // 只會被初始化一次
   cout << "count: " << count++ << endl; // 每次調用該函數都會將上次存儲的值打印出來
}

C& getTestStaticC()
{
    static C c("I'm static object."); // 只初始化一次,生命周期與程序等長

    return c;
}


int main()
{

    testStatic();
    testStatic();
    testStatic();

    C& cc1 = getTestStaticC(); // 因為定義的靜態(tài)變量存儲在靜態(tài)存儲區(qū),不是在棧上,因此離開函數作用域以后,對靜態(tài)的引用仍然是可以訪問的
    C& cc2 = getTestStaticC(); // 因為定義的靜態(tài)變量存儲在靜態(tài)存儲區(qū),不是在棧上,因此離開函數作用域以后,對靜態(tài)的引用仍然是可以訪問的

    std::cout << "cc1: " << cc1.getName() << std::endl;
    std::cout << "cc2: " << cc2.getName() << std::endl;
    C  cc3("666888");

    return 0;
}


輸出:

C++ -- 學習系列 static 關鍵字的使用,c++,學習,開發(fā)語言

3. 類的靜態(tài)成員變量

類的靜態(tài)成員變量屬于類的所有對象,其存儲在靜態(tài)存儲區(qū),只有一個存儲空間;而其他的非靜態(tài)變量屬于每個對象,在每個對象中都有其副本。

靜態(tài)成員變量不在構造函數中初始化,因此靜態(tài)成員變量不依賴于對象。

靜態(tài)成員變量必須顯示的初始化,一般情況下,我們都在類的外部對靜態(tài)成員變量初始化,若是靜態(tài)成員變量未被初始化,編譯鏈接時,會報錯。

// c.h
#include<iostream>
#include<string>

class C
{
public:
    C(std::string n):name(n)
    {
        std::cout << "constructor C name: " << this->name << std::endl;
    }
    ~C(){
        std::cout << "destructor C name: " << this->name << std::endl;
    }

    std::string  getName()
    {
        return this->name;
    }


private:
public:
    std::string name;
    static int height;
};


// c.cpp
#include "c.h"

int C::height = 66; // 靜態(tài)成員變量需要顯示的定義在類的外部


// main.cpp
#include"c.h"
#include<iostream>

int& testStatic21()
{
    C c("static21 test");
    std::cout << "name: " << c.getName() << " , height: " << c.height << std::endl;

    return c.height;
}
std::string& testStatic22()
{
    C c("static22 test");
    std::cout << "name: " << c.getName() << " , height: " << c.height << std::endl;

    return c.name;
}

int main()
{
    int& abc = testStatic21();

    std::cout << "abc: " << abc << std::endl; // 因為存儲在靜態(tài)存儲區(qū),所以離開函數作用域后,變量仍然存在

    std::string& name = testStatic22();
    std::cout << "name: " << name << std::endl; // 非靜態(tài)成員變量實際存儲位置是函數的??臻g中,因此離開函數作用域后,就會被釋放掉,所以獲取結果未可知

  return 0;
}

輸出:

C++ -- 學習系列 static 關鍵字的使用,c++,學習,開發(fā)語言

4. 靜態(tài)類對象

static?關鍵字對類對象的工作方式也相同。聲明為?static?的對象將分配到靜態(tài)存儲區(qū)中,并且一直作用到程序結束。

注:使用?static?關鍵字分配為零僅適用于原始數據類型,不適用于用戶定義的數據類型。

// c.h
#include<iostream>
#include<string>

class C
{
public:
    C(std::string n):name(n)
    {
        std::cout << "constructor C name: " << this->name << std::endl;
    }
    ~C(){
        std::cout << "destructor C name: " << this->name << std::endl;
    }

    std::string  getName()
    {
        return this->name;
    }


private:
public:
    std::string name;
};


// main.cpp
int main()
{
   C& cc = testStatic3();

   std::cout << "cc: " << cc.getName() << std::endl; // 靜態(tài)對象存儲在靜態(tài)存儲區(qū), 所以離開函數作用域后,仍然存在

  return 0.
}

輸出:

C++ -- 學習系列 static 關鍵字的使用,c++,學習,開發(fā)語言

5. 類的靜態(tài)方法

與類的靜態(tài)成員變量類似,類的靜態(tài)方法也屬于類,任何類的對象都可以調用此類方法。

既可以通過 對象名. 靜態(tài)方法 調用,也可以通過類名::靜態(tài)方法,后一種方法更常用。

// c.h
#include<iostream>
#include<string>

class C
{
public:
    C(std::string n):name(n)
    {
        std::cout << "constructor C name: " << this->name << std::endl;
    }
    ~C(){
        std::cout << "destructor C name: " << this->name << std::endl;
    }

    std::string  getName()
    {
        return this->name;
    }

    static void print()
    {
        std::cout << "print height: " << height << std::endl;
    }



private:
public:
    std::string name;

    static int height;
};

// c.cpp
#include "c.h"


int C::height = 66;


// main.cpp
#include"c.h"
#include<iostream>

void testStatic4()
{
    C::print();
    C c("888");
    c.print();
}

int main()
{
  testStatic4();

  return 0;
}

二? ? static 變量幾種初始化方式

C++中static變量的初始化_c++ static 重新初始化_LikeMarch的博客-CSDN博客

三種初始化:

1. 編譯時初始化

2. 程序加載時初始化

3. 運行時初始化

1. 編譯時初始化

若?靜態(tài)全局變量?是 基本數據類型(POD) ,且初始化值為常量,那么該變量會在編譯期初始化。

/ main.cpp

static int xx = 666;

int main()
{

   return 0;
}

2. 程序加載時初始化

程序被加載時立即初始化,該過程發(fā)生在main 函數執(zhí)行前。即使程序任何地方都沒訪問過該變量,仍然會進行初始化,因此形象地稱之為"餓漢式初始化"。

2.1? 靜態(tài)全局變量初始化(初始值不是常量時),此時變量初始化是在程序加載時初始化的。

// main.cpp

int x = 6;
int y = 8;
static int z = x + y;

int main()
{

  return 0;
}

2.2? 靜態(tài)全局變量不是基本類型,此時變量初始化是在程序加載時初始化的。

// d.h
#include<iostream>
#include<string>

class D
{
public:
    D(std::string n):name(n)
    {
        std::cout << "constructor D name: " << this->name << std::endl;
    }
    ~D()
    {
        std::cout << "destructor D name: " << this->name << std::endl;
    }

private:
    std::string name;
};

// c.h
class C
{
public:
    C(std::string n):name(n)
    {
        std::cout << "constructor C name: " << this->name << std::endl;
    }
    ~C(){
        std::cout << "destructor C name: " << this->name << std::endl;
    }

    std::string  getName()
    {
        return this->name;
    }

    static void print()
    {
        std::cout << "print height: " << height << std::endl;
    }



private:
public:
    std::string name;

    static int height;
    static D d;
};

// c.cpp
int C::height = 66;

D C::d = D("CD static");

// main.cpp
#include<string>
#include<iostream>
#include"c.h"

void testStatic5()
{
    C c("testStatic5 -- ");
    std::cout << "testStatic5 c name: " << c.getName() << std::endl;
}

static D d("before main inialiaze!");

int main()
{

  std::cout << "enter int main func!!" << std::endl;
  testStatic5();

  return 0;
}

C++ -- 學習系列 static 關鍵字的使用,c++,學習,開發(fā)語言

3. 運行時初始化

程序執(zhí)行到靜態(tài)變量的定義引用時,才會初始化,因此也被稱為“懶漢式初始化”。

比如靜態(tài)局部變量就是典型的?運行時初始化。

// d.h
class D
{
public:
    D(std::string n):name(n)
    {
        std::cout << "constructor D name: " << this->name << std::endl;
    }
    ~D()
    {
        std::cout << "destructor D name: " << this->name << std::endl;
    }

public:
    std::string name;
};


// main.cpp

#include<iostream>
#include"d.h"


void testStaticInitialize(){
    static D d("testStaticInitialize --- ");
}

int main()
{
  std::cout << "enter int main func!!" << std::endl;
  static D dd("dd --- ");
  testStaticInitialize();

  return 0;
}

輸出:

C++ -- 學習系列 static 關鍵字的使用,c++,學習,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-705797.html

到了這里,關于C++ -- 學習系列 static 關鍵字的使用的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【C++】static 關鍵字的特性 與 問題

    聲明為 static的類成員 稱為 類的靜態(tài)成員 用 static 修飾的成員變量 ,稱之為 靜態(tài)成員變量 ; 用 static 修飾的成員函數 ,稱之為 靜態(tài)成員函數 。 靜態(tài)成員變量 一定要在 類外進行初始化 。 下面一段代碼證明 上述定義: 輸出結果: 從代碼可以看出,靜態(tài)成員變量需要在 類

    2024年02月14日
    瀏覽(60)
  • 在C++和C中static關鍵字的用法,在C++和C中const關鍵字的用法

    1、在C++和C中static的用法 答:static表示存儲類型,修飾數據類型。在C語言中,static修飾局部變量,內存分配在靜態(tài)區(qū),生命周期延長,作用域不變。static修飾全局變量,內存分配在靜態(tài)區(qū),作用域被局限于本文件,不能被extern引用。static修飾函數,不能被exter

    2024年02月10日
    瀏覽(21)
  • C++——初始化列表 | explicit關鍵字 | static成員

    C++——初始化列表 | explicit關鍵字 | static成員

    ??作者簡介: 花想云 ,在讀本科生一枚,致力于 C/C++、Linux 學習。 ?? 本文收錄于 C++系列 ,本專欄主要內容為 C++ 初階、C++ 進階、STL 詳解等,專為大學生打造全套 C++ 學習教程,持續(xù)更新! ?? 相關專欄推薦: C語言初階系列 、 C語言進階系列 、 數據結構與算法 本章我們

    2023年04月11日
    瀏覽(22)
  • 【C++】const、static關鍵字和構造函數初始化

    【C++】const、static關鍵字和構造函數初始化

    ??個人主頁?? ?個人專欄——C++學習? ??點擊關注??一起學習C語言???? 目錄 1. const修飾成員函數 1.1 語法格式 1.2 權限放大縮小 1.3 思考 1.4 解答 2. 再談構造函數 2.1 構造函數體賦值 2.2 初始化列表 2.3 explicit 3. static成員 3.1 靜態(tài)變量 3.2 靜態(tài)函數 3.3?靜態(tài)成員變量

    2024年02月19日
    瀏覽(21)
  • 深入理解C++中的靜態(tài)(Static)關鍵字及其應用場景

    在C++中,靜態(tài)(Static)是一個常見且重要的概念,用于描述變量、函數和類成員。它具有獨特的特性和作用域,可以在不同的應用場景中發(fā)揮重要作用。本文將詳細討論C++中的靜態(tài),包括靜態(tài)變量、靜態(tài)函數和靜態(tài)類成員,并對其與全局變量之間的區(qū)別進行分析

    2024年02月09日
    瀏覽(31)
  • C++面試八股文:static和const的關鍵字有哪些用法?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第7面: 面試官:C++中, static 和 const 的有哪些用法? 二師兄: satic 主要用在以下三個方面:1.用在全局作用域,修飾的變量或者函數為靜態(tài)的,限制在本文件內使用。2.方法內修飾修飾靜態(tài)局部變量,在第一次訪問

    2024年02月08日
    瀏覽(22)
  • 面向對象(八)-- static 與 final 關鍵字 的使用

    目錄 1.??static 1.1??static 的概述 1.2??static 修飾的特點 1.3??static 使用時的注意事項:

    2023年04月25日
    瀏覽(91)
  • 第1關:學習-Java類和對象之static關鍵字之求圓環(huán)面積和周長

    本關任務:已知圓環(huán)的大圓半徑 R 和 小圓半徑 r 的長度分別為 32.0 和 10.0,求該圓環(huán)的面積和周長。 圓環(huán)面積公式為:S=π(R 2?r 2 ); 圓環(huán)周長公式為:C=2π(R+r)。 /** 任務:已知圓環(huán)的大圓半徑 R 和 小圓半徑 r 的長度分別為 32.0 和 10.0,求該圓環(huán)的面積和周長。 類名為:Ri

    2023年04月08日
    瀏覽(96)
  • C/C++ static關鍵字詳解(最全解析,static是什么,static如何使用,static的??济嬖囶})

    C/C++ static關鍵字詳解(最全解析,static是什么,static如何使用,static的??济嬖囶})

    目錄 一、前言 ?二、static是什么? 三、static修飾的對象是什么?? ?四、C 語言中的 static ???static的C用法 ???static的重點概念 ???static修飾局部變量 ???static在修飾局部變量和函數的作用 ???static修飾全局變量和函數 ??static在修飾全局變量和函數的作用

    2024年02月05日
    瀏覽(20)
  • static關鍵字和final關鍵字

    在java的中,static和final是兩個必須掌握的。static和final用法多樣,且在一定環(huán)境下使用,可以提高程序的運行性能,優(yōu)化程序的結構。下面將依次介紹static和final。注意,某些場景下,staic和final可以聯合使用

    2024年02月09日
    瀏覽(98)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包