1. 程式人生 > >C++之作用域運算子::

C++之作用域運算子::

C++使用::運算子搞定很多東西,其中最基本的一個用處就是用來決議多繼承中的重名成員。::運算子的本質是:左運算元是一個scope,右運算元是這個scope內的名字,可以是 scope,class,member或者function,variable等等,從左運算元指定的scope中找到有運算元這個實體。看起來非常優雅,不是麼?可是,它有好幾個缺陷。一、現實的常見的缺陷。分散在程式碼中,一旦改變會引起很多地方同時都需要改。其實這就是決策不能集中作出的一個典型現象。二、理論上的缺陷一。它喪失了虛擬性也就是多型性。這個問題說小也小說大也大,如果你就想靜態呼叫,那麼ok,非常好。如果我們需要多型性,那麼對不起,不可能了。但是對於虛擬函式,我們一般期待的多型性。三、理論上的缺陷二。它主要體現在using語句中,我們知道,using可以引入一個名字,一個別的scope(主要是名稱空間)中的名字,當然,也可以在子類中引用父類的名字以改變訪問級別。這個行為的一個缺陷是引入了所有overload的名字,你不能引入部分實體。這在實踐中一般沒有問題,但是,一旦有了問題就非常難繞開。

 ::是C++裡的“作用域運算子”。
比如聲明瞭一個類A,類A裡聲明瞭一個成員函式void f(),但沒有在類的聲明裡給出f的定義,那麼在類外定義f時,就要寫成void A::f(),表示這個f()函式是類A的成員函式。
   :: 一般還有一種用法,就是直接用在全域性函式前,表示是全域性函式。當類的成員函式跟類外的一個全域性函式同名時,在類內定義的時候,打此函式名預設 呼叫的是本身的成員函式;如果要呼叫同名的全域性函式時,就必須打上::以示區別。比如在VC裡,你可以在呼叫API函式時,在API函式名前加::。
 
如果有兩個同名變數,一個是全域性的,一個是區域性的,那麼區域性的變數在其作用域擁有較高的優先權,全域性變數則被遮蔽。
    那如果我希望在區域性變數的作用域裡使用全域性變數怎麼辦,這時就要用到::作用域運算子了。比如: 
複製程式碼
1 #include<iostream>

3  usingnamespace std;

5  int x;

7  int main()

9 {
10 
11   int x;
12 
13   x=50;
14 
15   ::x=100;
16 
17   cout<<"區域性變數x="<<x<<endl;
18 
19   cout<<"全域性變數x="<<::x<<endl;
20 
21   return0;
22 
23 }

相關推薦

C++作用運算子::

C++使用::運算子搞定很多東西,其中最基本的一個用處就是用來決議多繼承中的重名成員。::運算子的本質是:左運算元是一個scope,右運算元是這個scope內的名字,可以是 scope,class,member或者function,variable等等,從左運算元指定的sc

大學C++課堂知識點(第四期作用運算子、強制型別轉換)

哈哈哈,終於想起來我的CDSN的密碼了(才不是為這些天沒更新找藉口,╭(╯^╰)╮) 一、作用域運算子     :: 就是後面那兩個冒號哈,對的,沒錯,就叫做作用域運算子。 這倆個冒號就厲害嘞,他可以把區域性變數變成全域性變數。 咳咳~,官方解釋就是:如果有兩個同

C++語言-作用運算子::的運用案例

作用域運算子:: #include<iostream> using namespace std; int g=3; int main() { int g=5; cout<<g<<endl; //輸出值為5

作用運算子 “::”(C++學習筆記 10)

  通常情況下,如果有兩個同名變數,一個是全域性的,另一個是區域性的,那麼區域性變數在其作用域內具有較高的優先權,它將遮蔽全域性變數。   如果希望在區域性變數的作用域內使用同名的全域性變數,可以在該變數前加上“::”,此時::avar代表全域性變數,“::”稱為作用域運算子。 例1: 全域

C++的運算子(一)—— ::(作用運算子

目錄文章:C++中運算子的優先順序   ::運算子,是作用域運算子,是C++語言中優先順序最高的運算子。 它有以下幾種用法: 1. 程式碼塊的作用域。在函式內如果有一個與全域性變數重名的變數,可以用 ::a 的形式訪問(a是全域性變數名)。例如: #include<

C++"::"作用運算子

::是C++裡的“作用域運算子”。比如聲明瞭一個類A,類A裡聲明瞭一個成員函式void f(),但沒有在類的聲明裡給出f的定義,那麼在類外定義f時,就要寫成void A::f(),表示這個f()函式是類A的成員函式。:: 一般還有一種用法,就是直接用在全域性函式前,表示是全

C++ 作用運算子

C++使用::運算子搞定很多東西,其中最基本的一個用處就是用來決議多繼承中的重名成員。::運算子的本質是:左運算元是一個scope,右運算元是這個scope內的名字,可以是 scope,class,member或者function,variable等等,從左運算元指定的sco

js補充作用

定義 生成 http -1 cti 例如 概念 演示 沒有 任何程序設計語言都有作用域的概念 簡單的說,作用域就是變量與函數的可訪問範圍,即作用域控制著變量與函數的可見性和生命周期。 在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。 1. 全局作用

C/C++中作用詳解(轉)

防止 局部作用域 gist 文件中 方式 為什麽不使用 形式參數 lan archive 作用域規則告訴我們一個變量的有效範圍,它在哪兒創建,在哪兒銷毀(也就是說超出了作用域)。變量的有效作用域從它的定義點開始,到和定義變量之前最鄰近的開括號配對的第一個閉括號。也就是說,作

Linux c括號作用【原創筆記】

地址 fine turn print key tdi def macro stdio.h 大師指點後,所做的筆記,很感謝一起願意研究技術的同事,以下不是本人原創,是他分析的成果#include <stdio.h> #include <time.h&g

c語言 作用、存儲期、鏈接屬性匯總

初始 執行 不存在 分配 標識符 num 賦值 inline bss 1、作用域   塊作用域:用{}闊起來的,從聲明開始到“}” 結束 函數作用域:goto(標識符) 的作用域為整個函數。 函數原型作用域:函數聲明開始,函數聲明結束而結束

JavaScript基礎概念----作用

使用 nbsp 關鍵字 同名 作用 argument rip class strong 1、在JS中,作用域就是指 執行代碼的上下文。 2、有三種類型的作用域: 全局作用域 局部作用域(也稱為“函數作用域”) eval作用域 3、在全局作用域中定義的變量,從任何地方都可

JavaScript基礎概念----作用

span tro 閉包 str clas 作用域鏈 function UNC 決定 也稱:詞法作用域 JavaScript查找變量關聯的值時,會遵循一個查找鏈,這個鏈是基於作用域的層次結構的。 var a = ‘hello‘; var func1 = function(

js作用

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body&g

C++變數作用,儲存區

在C++中,儲存區域可以分為:堆,棧,常數區,靜態區,程式碼區; 堆: 棧:區域性變數(定義它的函式內有效) 常數區: 靜態區:全域性變數(整個程式檔案中有效),靜態全域性變數(定義它的檔案中有效),靜態區域性變數(定義它的函式內有效,整個程式檔案存在) 程式碼區: &nbs

JavaScript作用和閉包

一、作用域 作用域共有兩種主要的工作模型:第一種是最為普遍的,被大多數程式語言所採用的詞法作用域,另外一種叫作動態作用域; JavaScript所採用的作用域模式是詞法作用域。 1.詞法作用域 詞法作用域意味著作用域是由書寫程式碼時函式宣告的位置來決定的。編譯的詞法分析階段基本能夠知

深入學習Java Scipt作用和閉包

引擎與作用域及編譯器 在傳統的編譯語言的流程中,程式的一段原始碼主要分成三步,統稱為“編譯”   分詞/詞法分析     它的主要作用是將字元組成的字串分解成有意義的程式碼塊,例如:var a=2;者會被分解成“var”,“a”,“=”,

javascript作用作用

在看js權威指南時,感覺上面講的不太詳細,沒看懂什麼意思,就找了有關的視訊,將視訊講解記錄下來並加以整理,防止自己遺忘,以下是正文。 在介紹作用域與作用域鏈之前,先要了解執行(執行)上下文的概念,執行期上下文的定義為:當函式執行時,會建立一個稱為執行期上下文的內部物件。一個執行期上下文定義了一個

前端入門18-JavaScript進階作用

宣告 本系列文章內容全部梳理自以下幾個來源: 《JavaScript權威指南》 MDN web docs Github:smyhvae/web Github:goddyZhao/Translation/JavaScript 作為一個前端小白,入門跟著這幾個來源學習,感謝作者的分享,

C++類作用的問題,在類定義中宣告常量與使用的問題

class Stock { private: std::string company; const int Month = 12; double costs[Month]; //報錯 long cost = Month; //正確 ... }; 上面是程式碼,