話說const修飾符與static修飾符

2021-03-02 秘籍酷

出自:彭磊 編程小小屋

連結:http://mp.weixin.qq.com/s/t6kA6UqZnQTOA687CvKCUA

1 C中的const和static:

這也是面試和筆試中經常會考到的問題,特別是static我面試了四家就考了兩家,但是一般會放在前兩題,屬於特別基礎的題目了。

const

const在C中代表定義一種「只讀變量」,不可更改,譬如const int a = 10; 這時候a就不可以「直接」更改了。但是C由於類型的把控不是非常嚴格,我們依舊可以變相的去更改它,譬如:int *p = &a; *p = 20;

但是C++中類型的把控是非常嚴格的,無論如何,妄圖修改const修飾的變量都是無意義的。

關於const結合指針的一點用法,例如:const int *p = &a; 那麼此時就不可以利用指針p去修改a的值。還有int * const p = &a, 此時指針p就不可以修改指向,永久的只能指向a。這些都是基本的語法了。

static

static在c中的用法如下:

1、如果修飾的是局部變量,則他的生命周期會是整個程序運行開始到結束,並不會因為作用域等因素動態去釋放。

2、如果修飾的是全局變量、全局函數等,則表示內部連結類型,只能本文件可見,其他文件不可見。

2 C++中的const:

const類成員數據

和普通變量一樣,被const修飾之後為常量(只讀)不可修改。並且只能在初始化列表中賦值(某些平臺下可以支持類內賦值),可以被const和非const函數調用,但是一句話,絕不可修改!看例子:

class A

{

public:

       A( ) : _value(100) {}

private:

       const int _value;

};

const類成員函數

只需記住一句話,用const修飾的成員函數,承諾不會修改類內數據成員,那自然也不會在函數內部調用其他非const函數。看例子:

class A

{

public:

       A( ) : _value(100) {}

       void dis( ) const;

private:

       const int _value;

};

void A::dis( ) const  // 類外定義

{

       cout << _value << endl;

}

記住他的語法格式,const要放在函數接口的末尾處。在類外定義的const函數時,定義處和聲明出都要加上const。

const可以構成重載!直接看例子:

class A

{

public:

       A( int _y) : x(100), y(_y) { }

       void dis( ) const; // 對象調用時,優先調用

       {

               setY(5);  // 錯誤!調用了非const函數

               cout << "x: " << x << endl;

               cout << "y: " << y << endl;

               y = 50; // 錯誤!進行了寫操作

       }

       void dis( ) // 非const重載函數

       {

               y = 200;

               setY(100;

               cout << "x: " << x << endl;

               cout << "y: " << y << endl;

       }

       void setY(int data)

       {

               y = data;

       }


private:

       const int x;

       int y;

};

int main(void)

{

       A a(100);

       const A b(200);

       a.dis();  // 調用非const函數

       b.dis(); // 調用const函數

       return 0;

}

3 C++中的static:

在類內部把一個成員變量修飾為static,意味著這個變量屬於類。什麼意思呢?就是說這個類所實例化的所有對象,都共享著這一個static變量,他類似全局變量,但是比全局變量好的是,他並沒有破壞封裝的隱藏特性,只有本類的對象可以共享。類的靜態成員,屬於類,也屬於對象,但終究屬於類。

初始化:在類外初始化,語法規則是 數據類型 類名::靜態數據成員 = 初值;

調用:兩種方式

1) 類名::靜態成員

2) 對象.靜態成員

static類靜態成員函數

為了管理靜態成員,c++提供了靜態函數,以對外提供接口。並靜態函數只能訪問靜態成員。看例子:

class A

{

public:

       static void appenVal(string data)

       {

                 val += data;

       }

       static void show( )

       {

                cout << "val: " << val << endl;

       }

private:

       static string val;

};

string A::val = "My";

int main(void)

{

       A a, b;

       a.appendVal(" name ");

       b.appendVal( " is ");

       A::show( );

       return 0;

}

這就是static的用法,來個小結:

1、static 成員變量實現了同簇類對象間信息共享。

2、static 成員類外存儲,求類大小,並不包含在內。

3、static 成員是命名空間屬於類的全局變量,存儲在 data 區 rw 段。

4、static 成員使用時必須實始化,且只能類外初始化。

5、可以通過類名訪問(無對象生成時亦可),也可以通過對象訪問。

6、靜態成員函數的意義,不在於信息共享,數據溝通,而在於管理靜態數據成員,完成對靜態數據成員的封裝。

作者:彭磊,廣西師大學生。

點擊「閱讀原文」近距離跟前搖滾吉他手兼主唱聊聊天。

相關焦點

  • java修飾符
    Java 修飾符Java語言提供了很多修飾符,主要分為以下兩類:訪問修飾符非訪問修飾符修飾符用來定義類、方法或者變量,通常放在語句的最前端。我們通過下面的例子來說明:public class ClassName {// ...
  • 程式設計師的術與道:道——Java修飾符之非訪問控制修飾符
    Java提供了很多修飾符,主要分為訪問控制修飾符和非訪問控制修飾符。通常放在語句的最前端,用來定義類、方法、變量。下面介紹一下Java提供的非訪問控制修飾符。static 修飾符:修飾類方法和類變量。final 修飾符:修飾類、方法和變量修飾的變量為常量,是不可修改的,修飾的類不能被繼承,修飾的方法不能被繼承的類重寫。abstract 修飾符:創建抽象類和抽象方法。
  • 一起學JAVA——修飾符
    java修飾符的作用就是對類或類成員進行修飾或限制。訪問修飾符訪問修飾符作用是控制類成員的可見度。 類的訪問控制符有兩種:public關鍵字修飾:可以被所有的類訪問預設為default:只能被同一包中的類訪問static(靜態修飾符)
  • 入門教程:C++中的const限定修飾符
    const修飾符可以把對象轉變成常數對象,什麼意思呢?   意思就是說利用const進行修飾的變量的值在程序的任意位置將不能再被修改,就如同常數一樣使用!  使用方法是:const int a=1;//這裡定義了一個int類型的const常數變量a;   但就於指針來說const仍然是起作用的,以下有兩點要十分注意,因為下面的兩個問題很容易混淆!
  • 「Java」基礎19:修飾符有哪些?
    這就得學到一個新的修飾符了。一、final修飾符final,翻譯成中文就是「不可更改的 」。顧名思義,它是一個修飾符,用於修改不可更改的內容。被final修飾的類:不能被繼承。二、權限修飾符public這個關鍵字太常見了,它就是一個權限修飾符。在Java語言裡面有四種權限修飾符。其實看字面意思也蠻好理解的:①public:公共的。
  • C++之Static與const
    靜態成員小結1.2、Static函數1.3、static靜態函數小結二、Const2.1、Const變量2.2、const變量初始化小結2.2、Const函數三、Const對象一、Static定義1、Static意為靜態成員,若Static修飾的成員位於C++類中,那麼Static就實現了同一個類
  • Pattern Modifiers - 規則表達式的修飾符
    Pattern Modifiers - 規則表達式的修飾符 PatternModifiers-規則表達式的修飾符下面是當前規則表達式裡可用的修飾.括號內的名字是那些修飾符的內部
  • 標準C+的類型轉換符:static_cast等
    二、 C++類型轉換 使用標準C++的類型轉換符,主要有四種類型: static_cast、dynamic_cast、reinterdivt_cast 、 const_cast 1 static_cast 用法:static_cast( exdivssion ) 該運算符把exdivssion轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性
  • Java基礎教程:Java包和權限修飾符
    權限修飾符在Java中提供了四種訪問權限,使用不同的訪問權限修飾符修飾時,被修飾的內容會有不同的訪問權限,我們之前已經學習過了public 和 private,接下來我們研究一下protected和預設(default默認)修飾符的作用。
  • 通過「訪問修飾符」java想告訴我們什麼?
    在平時編寫代碼的時候我們一定會用到public、private這些「java訪問修飾符「,可是你知道java為什麼要設計這些「訪問修飾符」嗎?今天我們就一起來看看廢話少說,先看定義!01定義java有四個訪問修飾符public:被public修飾的成員可以被所有類訪問到protected:所修飾的成員會被位於同一包中所有類可以訪問到。
  • 在.NET中,C#訪問修飾符決定類和成員的訪問權限,常見的有哪些?
    -訪問修飾符1.訪問修飾符在C#中,訪問修飾符用於控制接口/類/方法/屬性等訪問權限。常用的訪問修飾符有public/private/protected/internal等。1.1.,且該類內的Cure()方法的訪問修飾符也使用了public訪問修飾符。
  • Java修飾符關鍵詞大全
    它們可分為兩組:1、訪問控制修飾符2、非訪問修飾符讓我們先來看看訪問控制修飾符,以及如何使用它們的一些代碼示例。修飾符說明public公共可見private類可見protected包和所有的子類可見那麼如何使用這三種訪問控制修飾符呢?請看下面兩個類。請忽略此處代碼的低效,因為這是教程。
  • 面試官:Vue常用的修飾符有哪些?有什麼應用場景?
    一、修飾符是什麼在程序世界裡,修飾符是用於限定類型以及類型成員的聲明的一種符號在Vue中,修飾符處理了許多DOM事件的細節,讓我們不再需要花大量的時間去處理這些煩惱的事情,而能有更多的精力專注於程序的邏輯處理
  • JavaScript-正則表達式中的修飾符和對象有哪些?
    二、正則表達式進階2.1 修飾符修飾符是正則表達式進行字符串檢索時【檢索規則】的制定者之一。修飾符規定了正則應按照何種方式進行檢索。常見的修飾符類型有兩種:i 、gi修飾符,表示正則檢索內容時不區分大小寫例如:使用i修飾符,在str中檢索frank出現的第一次下標var str = 'Hello Frank!
  • Vue.js巧妙運用修飾符,幫你後期維護代碼省下大量的時間
    Vue.js為我們提供了很多不同種類的修飾符,例如事件修飾符 、按鍵修飾符 、滑鼠按鍵修飾符,我們就對這三種修飾符進行詳細的介紹。首先,來看一下Vue.js為我們提供的事件修飾符有哪些吧。.stop 相當於 stopPropagation()的作用,阻止了事件繼續向上傳遞.prevent該修飾符就不多做掩飾了,相當於 preventDefault() 的作用.capture該修飾符是將事件觸發順序提前,來繼續看上面那個例子,我們用了該修飾符後,是怎麼樣一個情況
  • Java訪問權限修飾符總結-Java基礎教程系列-11
    大家好,我是你的老師父,這次講講剩下的兩個權限修飾符一個是public,其實之前講過,另外一個是什麼都不寫那其實是default或者稱作friendly修飾符。public:這個修飾符權限完全公開,所有類和包都可以訪問的到作用:一般用作公開的方法、常量、靜態變量、靜態常量等地方注意:屬性上很少用public,
  • JavaScript中RegExp對象的基本語法、修飾符、量詞、元字符的應用
    使用RegExp對象可以更加靈活的操作正則表達式,基本語法如下:new RegExp(正則表達式,修飾符);基本語法說明如下:(1).RegExp()對象的第2個參數是修飾符標誌i,表示不區分大小寫匹配。(4). 在RegExp()對象上,可以使用test()方法測試是否匹配成功。
  • C語言中auto register static const volatile 區別
    (3)static常見的兩種用途:1>統計函數被調用的次數;2>減少局部數組建立和賦值的開銷.變量的建立和賦值是需要一定的處理器開銷的,特別是數組等含有較多元素的存儲類型。在一些含有較多的變量並且被經常調用的函數中,可以將一些數組聲明為static類型,以減少建立或者初始化這些變量的開銷.
  • 「002期」JavaSE面試題(二):基本數據類型與訪問修飾符
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫開篇導讀大家好,我是Java面試題庫的提褲姐,今天這篇是JavaSE系列的第二篇,主要總結了Java基礎語法中訪問修飾符會出現的相關面試題
  • 面試官:聊聊 C++ static 和 const
    _hi << endl; // cout << A::_si << endl; // ERROR _si 不可訪問}注意 :如果 _hi 的類型為 static const 那麼可以直接在類內初始化static const int _hi = 10;