日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

头文件防卫式声明/引用/static/extern/

發(fā)布時(shí)間:2024/1/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 头文件防卫式声明/引用/static/extern/ 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 1.頭文件防衛(wèi)式聲明
  • 2.引用
    • 2.1 引用的本質(zhì)
    • 2.2 引用與指針的區(qū)別(特別的const指針?)
    • 2.3引用傳遞和引用返回
  • 3.static
      • 3.1 靜態(tài)局部變量
      • 3.2 全局變量
      • 3.3 靜態(tài)函數(shù)
          • 3.3.1靜態(tài)函數(shù)的訪問的方式有兩種
      • 3.4 靜態(tài)成員
  • 4.extern


1.頭文件防衛(wèi)式聲明


進(jìn)行程序編寫時(shí),經(jīng)常需要引用頭文件,眾所周知,頭文件引入的方式就是將代碼插入到cpp中,

文件間相互引用,難免出現(xiàn)同一頭文件引用多次的情況,
為了避免這種重復(fù),就有了頭文件防衛(wèi)式聲明。



格式如下(text1,text2為頭文件名)

#ifdef __text1__ #ifndef __text1__ int a=1; #endif#ifdef __text2__ #ifndef __text2__ int b=2; #endif

2.引用

2.1 引用的本質(zhì)

引用的底層使用指針時(shí)實(shí)現(xiàn)的
可以簡單理解引用為綽號。

格式 類型& 引用名=引用實(shí)體

2.2 引用與指針的區(qū)別(特別的const指針?)

  • 引用必須初始化
  • 同一變量可以有多個(gè)引用,但同個(gè)引用只能對應(yīng)一個(gè),不能改變。非常專一。

2.3引用傳遞和引用返回

數(shù)據(jù)傳遞過程中有傳值傳遞,地址傳遞,傳引用傳遞。
我們優(yōu)先考慮傳引用傳遞,因?yàn)槠湫矢摺?br /> 我們可以將取指針引用,以方便函數(shù)書寫


關(guān)于引用返回

首先所有的傳值返回都是返回的臨時(shí)變量而不是函數(shù)內(nèi)定義的變量,
因?yàn)槟莻€(gè)變量在函數(shù)結(jié)束時(shí)就已死。

引用也是這個(gè)問題,引用返回時(shí)所引用的那個(gè)變量不能已經(jīng)被摧毀,否則會造成非法訪問的問題

int& Add(int a, int b) {int c = a + b;return c;

如圖,c為局部變量,函數(shù)結(jié)束已被摧毀。

在類函數(shù)中一樣


值得注意的是對于數(shù)據(jù)類型帶指針的類,引用要多加小心
如string,會造成內(nèi)存多次釋放的問題
具體原因如下:
對于string類實(shí)例a實(shí)行拷貝構(gòu)造函數(shù),構(gòu)造出實(shí)例b,
此時(shí)a,b中的指針實(shí)際都指向同一片區(qū)域,當(dāng)函數(shù)結(jié)束時(shí),a,b調(diào)用析構(gòu)函數(shù),就會造成內(nèi)存二次釋放的問題
本質(zhì)上,這是指針的問題,所以引用指針時(shí)一定要慎重。


3.static

3.1 靜態(tài)局部變量

靜態(tài)局部變量使用static修飾符定義,即使在聲明時(shí)未賦初值,編譯器也會把它初始化為0。且靜態(tài)局部變量存儲于進(jìn)程的全局?jǐn)?shù)據(jù)區(qū),即使函數(shù)返回,它的值也會保持不變。

定義在函數(shù)內(nèi)部,初始化一次后之后,再運(yùn)行函數(shù)不再執(zhí)行初始化那一行。

#include <stdio.h> void fn_static(void) {static int n = 10;printf("static n=%d\n", n);n++;printf("n++=%d\n", n); }int main(void) {fn_static();printf("--------------------\n");fn_static();return 0; }

運(yùn)行結(jié)果如下:

static n=10 n++=11-------------------- static n=11 n++=12

可見,靜態(tài)局部變量的效果跟全局變量有一拼,但是位于函數(shù)體內(nèi)部,就極有利于程序的模塊化了。

3.2 全局變量

靜態(tài)全局變量僅對當(dāng)前文件可見,其他文件不可訪問,其他文件可以定義與其同名的變量,兩者互不影響。

在定義不需要與其他文件共享的全局變量時(shí),加上static關(guān)鍵字能夠有效地降低程序模塊之間的耦合,避免不同文件同名變量的沖突,且不會誤使用。

3.3 靜態(tài)函數(shù)

1.靜態(tài)函數(shù)只能在聲明它的文件中可見,其他文件不能引用該函數(shù)
2.不同的文件可以使用相同名字的靜態(tài)函數(shù),互不影響


如下所示:無static

/* file1.c */ #include <stdio.h>static void fun(void) {printf("hello from fun.\n"); }int main(void) {fun();fun1();return 0; }/* file1.h */ void fun(void);/* file2.c */ #include <stdio.h> #include"file1" static void fun1(void) {printf("hello from static fun1.\n"); }

結(jié)果可以正常運(yùn)行



加上static后
報(bào)錯(cuò)了

所以

在定義不需要與其他文件共享的全局變量時(shí),加上static關(guān)鍵字能夠有效地降低程序模塊之間的耦合,避免不同文件同名變量的沖突,且不會誤使用。


3.3.1靜態(tài)函數(shù)的訪問的方式有兩種

類名直接調(diào)用和對象調(diào)用

3.4 靜態(tài)成員

類與對象

1.用 static 修飾的成員變量,稱為靜態(tài)成員變量。
2.用 static 修飾的成員函數(shù),稱為靜態(tài)成員函數(shù),
3.靜態(tài)的成員變量一定要在類內(nèi)定義,類外進(jìn)行初始化。


問題: 為什么一定要類外初始化?


尋常變量是類實(shí)例化才占有內(nèi)存,因?yàn)殪o態(tài)成員變量是類所共有,在實(shí)例化之前就要初始化,所以在類為實(shí)例化的時(shí)候,我們就可以訪問靜態(tài)成員變量


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

可以通過類名直接調(diào)用靜態(tài)成員函數(shù)(public)


此外,靜態(tài)成員函數(shù)并沒有隱藏this指針,因?yàn)樗皇菍?shí)例有的,而是整個(gè)類共有的。

所以靜態(tài)函數(shù)變量不能直接訪問類中的非靜態(tài)成員變量。


4.extern


extern表明變量或者函數(shù)是定義在其他其他文件中的
需要是全局變量

extern int a;

顯式的說明了a的存儲空間是在程序的其他地方分配的,在文件中其他位置或者其他文件中尋找a這個(gè)變量。

總結(jié)

以上是生活随笔為你收集整理的头文件防卫式声明/引用/static/extern/的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。