亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C/C++?extern和static的使用詳解

 更新時間:2022年06月27日 10:51:19   作者:honky-tonk_man  
這篇文章主要介紹了C/C++?extern和static的使用,在講到extern和static的時候先了解一下定義和聲明的基本概念,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下

前言

在講到extern和static的時候先了解一下定義和聲明的基本概念

定義(define):

A variable is defined when the compiler allocates the storage for the variable,就是我們的變量個其存儲的具體值相關(guān)聯(lián)

聲明(declared)

編譯器聲明這個變量的存在,宣告其類型但是并不關(guān)聯(lián)某個存儲的具體值

你可以聲明一個變量多次,但是你只能定義其一次并且給一個范圍,我們定義一個變量也是聲明,但不是所有的聲明都是定義

extern

我們在全局聲明/定義一個變量最好的一個方法是在頭文件中用關(guān)鍵字extern聲明一個變量
在我們工程中,一般用一個頭文件聲明全部所需的全局變量(當(dāng)然用extern),然后在所有其他的.c文件中include這個頭文件,假設(shè)我們有三個文件分別是file3.h,file1.c,file2.c
內(nèi)容分別如下
var.h

extern int global_var;

var.c

#include "var.h"
#include "prog1.h" //function declarations,我們示例中沒有將函數(shù)原型頭文件寫出來

int global_var = 33;

int increment(void) { return global_variable++ }

main.c

#include "var.h"
#include "prog1.h"
#include <stdio.h>
//注意我們沒有include file1.c

void use_it(void){
	printf("global var : %d\n",global_var++);
}

然后我們編譯 (記住不編譯頭文件)

gcc main.c var.c -o out.c

為什么我們的main不include var.c就知道global_var的具體值呢?因為我們說過一個全局變量只能定義一次,但是可以聲明多次,global_var分別在main,c和var.c中聲明了,但是只在var.c中定義,換個角度,global_var的生命周期是全局也就是整個軟件的生命周期,整個軟件的生命周期包含三個文件,且global_var不定義在堆棧中,而是聲明在bss中,定義在initialed data區(qū)域中

static

static也是全局但是其作用域不是全局而是本文件中,所以其他的文件include一個含有static的頭文件,且試圖定義他會報錯,因為static變量的作用域只在聲明他的頭文件中

還是上述的程序但是我們把extern改為static了
var.h

static int global_var;

var.c

#include "var.h"
#include "prog1.h" //function declarations,我們示例中沒有將函數(shù)原型頭文件寫出來

int global_var = 33;

int increment(void) { return global_variable++ }

main.c

#include "var.h"
#include "prog1.h"
#include <stdio.h>
//注意我們沒有include file1.c

void use_it(void){
	printf("global var : %d\n",global_var++);
}

開始編譯發(fā)現(xiàn)錯誤

c++ static members in class

簡而言之就是我們的class里面搞一個static的成員,我們知道static的作用域雖然是全局只存在于本文件,那么將一個static放在一個class中間是什么意思呢?
在Cpp的類中使用static就不再和C一樣局限于定義的文件中了,在Cpp的class中用static修飾成員有以下的特點

  • 當(dāng)這個class建立的時候,此class內(nèi)的static成員在只有一份,無論創(chuàng)建多少個class對象,且每個對象都是共享這個static成員的,換句話說無論多少個對象創(chuàng)建,class的static成員都是第一無二的,且內(nèi)存中只有一份
  • static成員的初始化發(fā)生在此class所有對象創(chuàng)建前
  • 他的聲明周期是全程序

我們寫一個程序,寫一個class,在其public中搞一個static member,且在class的構(gòu)造函數(shù)中對這個static member + 1,意味著此static成員作用是統(tǒng)計有多少個class對象成員

static_mamber.h

using namespace std;
class Box{
public:
        static int objcount;
        Box(double l,double b, double h);
        double volume();
private:
        double length;
        double breadth;
        double height;
};

static_member.cpp

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

using namespace std;


int Box::objcount = 0; //static成員的初始化在創(chuàng)建所有的class對象之前
//構(gòu)造函數(shù)
Box::Box(double l, double b, double h)
        :length(l),breadth(b),height(h){
                cout << "construct is called," << endl;
                objcount++;
        }

double
Box::volume(){
        return length * breadth * height;
}

main.cpp

#include "static_member.h"
#include <iostream>
using namespace std;
int main(void){
        Box Box1(3.3,1.2,1.5);
        Box Box2(8.5,6.0,2.0);

        cout << "total Box object is "<< Box::objcount << endl;

        return 0;
}

編譯

g++ static_member.cpp main.cpp  -o static_member.o

得到結(jié)果

construct is called,
construct is called,
total Box object is 2

注意class是全局的也就是extern的因為在所有block({})外部的變量或者class或者函數(shù)如果不加static都默認(rèn)是extern

總結(jié)

在C語言中extern修飾后的變量或者函數(shù),可以在其他的文件中進(jìn)行使用(需要include定義extern變量或者函數(shù)的頭文件),但是static則不行,static和extern的作用域都是全局但是,static只允許本文件內(nèi)對其修飾的變量更改,而extern允許在任何文件中更改

在C++中static修飾的是某個class的一個成員,和C中的static完全不一樣,首先C++中如果在頭文件中聲明某個class的某個成員是static,那么我們在其他文件中可以定義他(前提include對于的頭文件),這是在C中是不行的,且C++ static member in clss意思是為此class創(chuàng)建一個獨一無二的成員,不論你的class實例化多少次,static成員就一個,其他的class對象都是其copy,并且我們可以隨時隨地修改這個static成員

到此這篇關(guān)于C/C++ extern和static的使用的文章就介紹到這了,更多相關(guān)C++ extern和static使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++與Lua交互原理實例詳解

    C++與Lua交互原理實例詳解

    這篇文章主要介紹了C++與Lua交互原理實例詳解,有感興趣的同學(xué)可以研究下
    2021-02-02
  • C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)循環(huán)順序隊列

    C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)循環(huán)順序隊列

    這篇文章主要介紹了 C++數(shù)據(jù)結(jié)構(gòu)之實現(xiàn)循環(huán)順序隊列的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Java?C++?算法題解leetcode652尋找重復(fù)子樹

    Java?C++?算法題解leetcode652尋找重復(fù)子樹

    這篇文章主要為大家介紹了Java?C++?算法題解leetcode652尋找重復(fù)子樹示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • C++實戰(zhàn)之二進(jìn)制數(shù)據(jù)處理與封裝

    C++實戰(zhàn)之二進(jìn)制數(shù)據(jù)處理與封裝

    在電腦上一切數(shù)據(jù)都是通過二進(jìn)制(0或1)進(jìn)行存儲的,通過多位二進(jìn)制數(shù)據(jù)可以進(jìn)而表示整形、浮點型、字符、字符串等各種基礎(chǔ)類型數(shù)據(jù)或者一些更復(fù)雜的數(shù)據(jù)格式。本文將為大家詳細(xì)講講二進(jìn)制數(shù)據(jù)處理與封裝,需要的可以參考一下
    2022-08-08
  • C++中雙冒號::用法案例詳解

    C++中雙冒號::用法案例詳解

    這篇文章主要介紹了C++中雙冒號::用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Qt實現(xiàn)編輯數(shù)據(jù)庫數(shù)據(jù)的方法詳解

    Qt實現(xiàn)編輯數(shù)據(jù)庫數(shù)據(jù)的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Qt是如何實現(xiàn)編輯數(shù)據(jù)庫數(shù)據(jù)的,文中的示例代碼簡潔易懂,對我們深入了解QT有一定的幫助,感興趣的小伙伴可以了解一下
    2023-02-02
  • Qt自定義控件實現(xiàn)線條型加載條

    Qt自定義控件實現(xiàn)線條型加載條

    這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實現(xiàn)線條型加載條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 漫畫講解C語言中最近公共祖先的三種類型

    漫畫講解C語言中最近公共祖先的三種類型

    這篇文章主要總結(jié)了使用C語言查找最近公共祖先的三種方法類型,用漫畫的方式講解原理定義,看上去更生動形象,幫助你更好的理解透徹,快來跟著本文往下看吧
    2021-11-11
  • 淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用

    淺談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用

    下面小編就為大家?guī)硪黄獪\談返回函數(shù)內(nèi)部new分配的內(nèi)存的引用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++?二進(jìn)制文件讀寫方式及示例詳解

    C++?二進(jìn)制文件讀寫方式及示例詳解

    這篇文章主要為大家介紹了C++?二進(jìn)制文件讀寫實現(xiàn)方式及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04

最新評論