头文件防卫式声明/引用/static/extern/
文章目錄
- 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īng)常需要引用頭文件,眾所周知,頭文件引入的方式就是將代碼插入到cpp中,
文件間相互引用,難免出現(xiàn)同一頭文件引用多次的情況,
為了避免這種重復(fù),就有了頭文件防衛(wèi)式聲明。
格式如下(text1,text2為頭文件名)
2.引用
2.1 引用的本質(zhì)
引用的底層使用指針時實現(xiàn)的
可以簡單理解引用為綽號。
格式 類型& 引用名=引用實體
2.2 引用與指針的區(qū)別(特別的const指針?)
- 引用必須初始化
- 同一變量可以有多個引用,但同個引用只能對應(yīng)一個,不能改變。非常專一。
2.3引用傳遞和引用返回
數(shù)據(jù)傳遞過程中有傳值傳遞,地址傳遞,傳引用傳遞。
我們優(yōu)先考慮傳引用傳遞,因為其效率高。
我們可以將取指針引用,以方便函數(shù)書寫
關(guān)于引用返回
首先所有的傳值返回都是返回的臨時變量而不是函數(shù)內(nèi)定義的變量,
因為那個變量在函數(shù)結(jié)束時就已死。
引用也是這個問題,引用返回時所引用的那個變量不能已經(jīng)被摧毀,否則會造成非法訪問的問題
int& Add(int a, int b) {int c = a + b;return c;如圖,c為局部變量,函數(shù)結(jié)束已被摧毀。
在類函數(shù)中一樣
值得注意的是對于數(shù)據(jù)類型帶指針的類,引用要多加小心
如string,會造成內(nèi)存多次釋放的問題
具體原因如下:
對于string類實例a實行拷貝構(gòu)造函數(shù),構(gòu)造出實例b,
此時a,b中的指針實際都指向同一片區(qū)域,當函數(shù)結(jié)束時,a,b調(diào)用析構(gòu)函數(shù),就會造成內(nèi)存二次釋放的問題
本質(zhì)上,這是指針的問題,所以引用指針時一定要慎重。
3.static
3.1 靜態(tài)局部變量
靜態(tài)局部變量使用static修飾符定義,即使在聲明時未賦初值,編譯器也會把它初始化為0。且靜態(tài)局部變量存儲于進程的全局數(shù)據(jù)區(qū),即使函數(shù)返回,它的值也會保持不變。
定義在函數(shù)內(nèi)部,初始化一次后之后,再運行函數(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; }運行結(jié)果如下:
static n=10 n++=11-------------------- static n=11 n++=12可見,靜態(tài)局部變量的效果跟全局變量有一拼,但是位于函數(shù)體內(nèi)部,就極有利于程序的模塊化了。
3.2 全局變量
靜態(tài)全局變量僅對當前文件可見,其他文件不可訪問,其他文件可以定義與其同名的變量,兩者互不影響。
在定義不需要與其他文件共享的全局變量時,加上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é)果可以正常運行
加上static后
報錯了
所以
在定義不需要與其他文件共享的全局變量時,加上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)定義,類外進行初始化。
問題: 為什么一定要類外初始化?
尋常變量是類實例化才占有內(nèi)存,因為靜態(tài)成員變量是類所共有,在實例化之前就要初始化,所以在類為實例化的時候,我們就可以訪問靜態(tài)成員變量
靜態(tài)成員函數(shù)
可以通過類名直接調(diào)用靜態(tài)成員函數(shù)(public)
此外,靜態(tài)成員函數(shù)并沒有隱藏this指針,因為他不是實例有的,而是整個類共有的。
所以靜態(tài)函數(shù)變量不能直接訪問類中的非靜態(tài)成員變量。
4.extern
extern表明變量或者函數(shù)是定義在其他其他文件中的
需要是全局變量
顯式的說明了a的存儲空間是在程序的其他地方分配的,在文件中其他位置或者其他文件中尋找a這個變量。
總結(jié)
以上是生活随笔為你收集整理的头文件防卫式声明/引用/static/extern/的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab global rbfnet
- 下一篇: Java实现 蓝桥杯VIP 算法提高 扫