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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ static与const用法详解

發布時間:2025/3/15 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ static与const用法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

static的作用:

對普通變量:

1.局部變量:

2.全局變量

對類中變量:

1.成員變量

2.成員函數

const的作用:


static的作用:


對普通變量:


1.局部變量:


在局部變量之前加上關鍵字static,局部變量就被定義成為一個局部靜態變量
? 1)內存中的位置:靜態存儲區
? 2)初始化:未經初始化的全局靜態變量會被程序自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)
? 3)作用域:作用域仍為局部作用域,當定義它的函數或者語句塊結束的時候,作用域隨之結束。
?注:當static用來修飾局部變量的時候,它就改變了局部變量的存儲位置(從原來的棧中存放改為靜態存儲區)及其生命周期(局部靜態變量在離開作用域之后,并沒有被銷毀,而是仍然駐留在內存當中,直到程序結束,只不過我們不能再對他進行訪問),但未改變其作用域。


2.全局變量


在全局變量之前加上關鍵字static,全局變量就被定義成為一個全局靜態變量
1)內存中的位置:靜態存儲區(靜態存儲區在整個程序運行期間都存在)
2)初始化:未經初始化的全局靜態變量會被程序自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)
3)作用域:全局靜態變量在聲明他的文件之外是不可見的。準確地講從定義之處開始到文件結尾。

這里面值得注意的是,不管是局部變量、全局變量還是普通函數,只要被static修飾了,其作用域只對自己的編譯單元有效(包含.h和.cpp文件),有static修飾變量的頭文件被其他文件包含,其他文件是不能使用該變量的。

注:static修飾全局變量,并未改變其存儲位置及生命周期,而是改變了其作用域,使當前文件外的源文件無法訪問該變量,好處如下:(1)不會被其他文件所訪問,修改;(2)其他文件中可以使用相同名字的變量,不會發生沖突。對全局函數也是有隱藏作用。而普通全局變量只要定義了,任何地方都能使用,使用前需要聲明所有的.c文件,只能定義一次普通全局變量,但是可以聲明多次(外部鏈接)。

注意:全局變量的作用域是全局范圍,但是在某個文件中使用時,必須先聲明,使用extern關鍵字或者包含全局變量聲明的頭文件

對類中變量:


1.成員變量


  用static修飾類的數據成員實際使其成為類的全局變量,會被類的所有對象共享,包括派生類的對象。因此,static成員必須在類外進行初始化(初始化格式: int base::var=10;),而不能在構造函數內進行初始化,不過也可以用const修飾static數據成員在類內初始化 。
  特點:
1)、不要試圖在頭文件中定義(初始化)靜態數據成員。在大多數的情況下,這樣做會引起重復定義這樣的錯誤。即使加上#ifndef #define #endif或者#pragma once也不行。?
2)、靜態數據成員可以成為成員函數的可選參數,而普通數據成員則不可以。
3)、靜態數據成員的類型可以是所屬類的類型,而普通數據成員則不可以。普通數據成員的只能聲明為 所屬類類型的指針或引用。


2.成員函數


用static修飾成員函數,使這個類只存在這一份函數,所有對象共享該函數,不含this指針。
靜態成員是可以獨立訪問的,也就是說,無須創建任何對象實例就可以訪問。base::func(5,3);當static成員函數在類外定義時不需要加static修飾符。
在靜態成員函數的實現中不能直接引用類中非靜態成員,可以引用類中說明的靜態成員。因為靜態成員函數不含this指針。?


不可以同時用const和static修飾成員函數。
C++編譯器在實現const的成員函數的時候為了確保該函數不能修改類的實例的狀態,會在函數中添加一個隱式的參數const this*。但當一個成員為static的時候,該函數是沒有this指針的。也就是說此時const的用法和static是沖突的。

總結:(1)對于數據成員和普通數據可以使用static和const修飾 (2)對于成員函數不可同時使用static和const修飾,因為靜態成員函數不屬于類,沒有this指針。

我們也可以這樣理解:兩者的語意是矛盾的。static的作用是表示該函數只作用在類型的靜態變量上,與類的實例沒有關系;而const的作用是確保函數不能修改類的實例的狀態,與類型的靜態變量沒有關系。因此不能同時用它們。

const的作用:


1.限定變量為不可修改。
2.限定成員函數不可以修改任何數據成員。

用法如下:int?GetCount(void)?const;----在函數末尾加const關鍵字
3.const與指針:
const char *p 和char const *p都表示 指向的內容不能改變。
char * const p,就是將P聲明為常指針,它的地址不能改變,是固定的,但是它的內容可以改變。

  • 阻止一個變量被改變,可以使用const關鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;???
  • 指針來說,可以指定指針本身為const,也可以指定指針所指的數據為const,或二者同時指定為const;???
  • 在一個函數聲明中,const可以修飾形參,表明它是一個輸入參數,在函數內部不能改變其值;???
  • 對于類的成員函數,若指定其為const類型,則表明其是一個常函數,不能修改類的成員變量,類的常對象只能訪問類的常成員函數;???
  • 對于類的成員函數,有時候必須指定其返回值為const類型,以使得其返回值不為“左值”。
  • const成員函數可以訪問非const對象的非const數據成員、const數據成員,也可以訪問const對象內的所有數據成員;
  • 非const成員函數可以訪問非const對象的非const數據成員、const數據成員,但不可以訪問const對象的任意數據成員;
  • 一個沒有明確聲明為const的成員函數被看作是將要修改對象中數據成員的函數,而且編譯器不允許它為一個const對象所調用。因此const對象只能調用const成員函數。
  • const類型變量可以通過類型轉換符const_cast將const類型轉換為非const類型;
  • const類型變量必須定義的時候進行初始化,因此也導致如果類的成員變量有const類型的變量,那么該變量必須在類的初始化列表中進行初始化;
  • 對于函數值傳遞的情況,因為參數傳遞是通過復制實參創建一個臨時變量傳遞進函數的,函數內只能改變臨時變量,但無法改變實參。則這個時候無論加不加const對實參不會產生任何影響。但是在引用或指針傳遞函數調用中,因為傳進去的是一個引用或指針,這樣函數內部可以改變引用或指針所指向的變量,這時const 才是實實在在地保護了實參所指向的變量。因為在編譯階段編譯器對調用函數的選擇是根據實參進行的,所以,只有引用傳遞和指針傳遞可以用是否加const來重載。一個擁有頂層const的形參無法和另一個沒有頂層const的形參區分開來。
  • 總結

    以上是生活随笔為你收集整理的C++ static与const用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。