1. 程式人生 > >C++學習筆記(初級篇)——作用域與“extern”關鍵字

C++學習筆記(初級篇)——作用域與“extern”關鍵字

作用域,顧名思義,就是指某個識別符號在程式中的有效區域。

在C++中,按作用域的大小,一般可分為區域性作用域和全域性作用域。

1.區域性作用域

區域性作用域用大括號,即{},來定義,大括號括起來的範圍就是一個區域性作用域。區域性作用域內,一個變數或者函式的有效位置是從其宣告開始一直到該區域性作用域結束。

區域性作用域裡面還可以繼續巢狀更小的區域性作用域,可稱之為子作用域。子作用域比父作用域擁有更高的優先順序,也就是說父作用域中的變數在子作用域中任然是有效的,但是子作用域的變數就沒法在父作用域裡用了。

常見的區域性作用域有函式體、if-else、while、for、switch等,仔細回想一下,這些複合語句後面是不是都跟著一個{},這就是它們的區域性作用域啦~

當然,我們並不只有在以上說的這些複合語句後才能用{}定義區域性作用域,我們可以任性地在程式中任何你想要的地方定義,舉個例子:

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

int _tmain(int argc, _TCHAR* argv[])
{
        int nInt = 0;
	//在此定義一個區域性作用域
	{      
		int nInt = 1;  //該變數只在區域性作用域中才有效
		cout << "在區域性作用域裡,nInt = " << nInt << endl;
	}
	cout << "在區域性作用域外,nInt = " << nInt << endl;        
        return 0;
}


執行得到的結果如下:


2.全域性作用域

如果變數或函式不在任何區域性作用域內,那麼就說它在全域性作用域內,也就是我們常說的全域性變數或全域性函式。

全域性作用域的範圍,從變數或函式宣告的位置開始,一直到整個原始檔結束,一定要注意是整個當前的原始檔哦。比如下面這段程式碼:

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

using namespace std;

int nGlobal;    //全域性變數

//全域性函式
int Add(int a, int b)  
{
	return a + b;
}

int _tmain(int argc, _TCHAR* argv[])
{
        nGlobal = Add(1, 2);
	cout << "全域性變數nGlobal = " << nGlobal<<endl;
        return 0;
}

執行結果為:

3.extern關鍵字

由於全域性作用域的範圍只在當前的原始檔中,由於C++程式往往會有多個原始檔組成,那麼如果我們想要引用一個其他原始檔中的變數或函式又該怎麼辦呢?這就要用到extern關鍵字了。

用“extern”關鍵字可以找到定義在其他原始檔中的全域性變數,只要在當前原始檔中宣告該變數或函式時,加上extern關鍵字修飾就行了。當加上了extern關鍵字後,就表示這是一個擴充套件的宣告,編譯器就會在其他的原始檔中查詢這個變數或者函式的具體定義了。如下例所示:

首先在另外的原始檔,如stdafx.cpp中定義了一個全域性變數nGlobal和函式Add:

int Add(int a, int b)
{
	return a + b;
}

int nGlobal;

然後在當前的原始檔main.cpp中用如下的方式引用在stdafx.app中定義的全域性變數,如下所示:
#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        extern int Add(int a, int b);
	extern int nGlobal;
	nGlobal = Add(1, 2);
	cout << "在main中引用nGlobal結果為"<<nGlobal << endl;
	return 0;
}
執行得到結果:



由此,我們就可以實現多個原始檔之間共享全域性變數和全域性函數了~

相關推薦

C++學習筆記初級——作用extern關鍵字

作用域,顧名思義,就是指某個識別符號在程式中的有效區域。 在C++中,按作用域的大小,一般可分為區域性作用域和全域性作用域。 1.區域性作用域 區域性作用域用大括號,即{},來定義,大括號括起來的範圍就是一個區域性作用域。區域性作用域內,一個變數或者函式的有效位置是從其宣告

C++學習筆記第一

第1章 C++基本知識 1.1 宣告類和物件 三種方式 /********************************************** 第一種方式:宣告類的同時定義物件 **************************

Angular學習筆記工具----Angular CLI

進入 詳情 基礎 rate 9.png cnpm 基本用法 版本問題 問題 Angular CLI 的作用 首先安裝npm 和node 詳情:http://www.cnblogs.com/gorgeous/p/8074180.html 在安裝 npm in

C#】C#學習筆記持續更新

本章比較雜亂,是本人在學習C#中的一些筆記,並不全面,只是一些隨筆。 1.一個 C# 程式主要包括以下部分: 名稱空間宣告(Namespace declaration) 一個 class Class 方法 Class 屬性 一個 Main 方法 語句(Stat

HTML教程學習筆記第一

學習資料:www.w3cschool.cc   學習日期:2014-11-03 1.DOCTYPE宣告文件型別: HTML5:<!DOCTYPE html> HTML4.01:<!DOCTYPE HTML PUBLIC "-//W3C//DTD H

C++學習筆記十一

基類與派生類、多型公有繼承、虛擬函式的過載與重寫、protected、抽象基類(ABC) 1.派生類與基類:      派生類物件儲存了基類的資料成員和方法(即繼承了基類的實現和介面),派生類需要自己新增新的構造和額外的資料成員即成員函式。     派生類的建構函式必須

Opengl es2.0 學習筆記API所有API的翻譯

包含了 gl2.h 和egl.h兩個標頭檔案 gl2.h gl2資料結構 /*------------------------------------------------------------------------- * Data type defi

C++學習筆記更新中

C和C++的區別 a. C是結構化的語言,面向過程,重點在於資料結構和演算法 b. C語言的API比較簡潔 c. C++包含了絕大部分C語言的功能,並且提供OOP(面向物件程式設計)和GP

深度學習筆記基礎——線性單元和梯度下降

        在上一篇文章中,我們已經學會了編寫一個簡單的感知器,並用它來實現一個線性分類器。你應該還記得用來訓練感知器的『感知器規則』。然而,我們並沒有關心這個規則是怎麼得到的。本文通過介紹另外一種『感知器』,也就是『線性單元

深度學習筆記基礎——機器學習深度學習簡介

  機器學習是最基礎的(當下初創公司和研究實驗室的熱點領域之一)。深度學習是非常嶄新和有影響力的前沿領域。 一、定義 1、機器學習    從樣本中學習的智慧程式。是資料驅動的。90年代初提出。強調的是給計算機程式(或者機器)輸入一些資料後,它學習這些資料,而

《深入分散式快取:從原理到實踐》學習筆記最終

第十四章 典型電商應用與快取 及時響應性的使用者需求 資料準確行需求 平臺海量請求的訴求 高可用訴求 14.1 電商類一個你用的挑戰及特點 穩定性決定服務能力 高併發場景(Scale Out 加機器、Scale Up 提

南郵攻防平臺學習筆記web

1、MD5 collision <?php $md51 = md5('QNKCDZO'); $a = @$_GET['a']; $md52 = @md5($a); if(isset($a)){ if ($a != 'QNKCDZO' &&am

Git 學習筆記基礎

1. 命令初識 檢視GIT版本 git --version 在Global級別設定UserName(推薦使用) git config --global user.name ’Freud Kang‘ 在當前目錄界別設定UserName(優先順序高)git config us

C++學習筆記十五:vector物件在記憶體空間中是如何增長的

vector物件在記憶體空間中是如何增長的 我們都知道vector物件是動態儲存的,從這一點看有點像連結串列,可以動態的增加或減少元素。我們也知道連結串列中是有指標變數,專門用於儲存上一個和下一個元

XSS學習筆記入門

最近的學習速度挺快的,對於寒假的計劃是對於各種知識點都瞭解大概並且基本懂得原理,在開學之後對相關書籍深入研究! 這裡我就先總結下幾個XSS應用的例子吧。 一.利用< >標記注射html / javascript 如果可以隨心所欲引入< >標記,那麼

C#學習筆記十六:索引器和重載運算符

instance cit png form mage 創建 return position args 二維數組如何映射到一維數組 重載運算符 1、算術運算符 2、關系運算符, < 和 > 成對重載 using System; using Sy

C#學習筆記十五:抽象方法、抽象類、多態和接口

具體實現 烏龜 ima 索引器 over protect ret 需要 技術 using System; using System.Collections.Generic; using System.Linq; using System.Text;

C#學習筆記十八:數據結構和泛型

eric 訪問 空間 cap 添加數據 mes 出錯 雙向 添加 數據結構 只有這四種 a、集合:數據之間沒有特定的關系 b、線性結構:數據之間有一對一的前後聯系 c、樹形結構:數據之間有一對多的關系,一個父節點有多個子節點,一個子節點只能有一個父節點 d

uip-學習筆記移植

UIP 1、 uip_input(); 當網絡卡驅動收到一個包時,將包存放於全域性緩衝區uip_buf中,包的大小由全域性變數uip_len約束;同時將呼叫uip_input();該函式會根據包首部的協議處理這個包將該包傳送給需要該包的應用程式;當該函

Java工程師學習指南初級

Java工程師學習指南 初級篇 最近有很多小夥伴來問我,Java小白如何入門,如何安排學習路線,每一步應該怎麼走比較好。原本我以為之前的幾篇文章已經可以解決大家的問題了,其實不然,因為我之前寫的文章都是站在Java後端的全域性上進行思考和總結的,忽略了很多小白們的感受,而很多朋友都需要更加基礎,更加詳細的學習