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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

c++ const static

發布時間:2024/1/17 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ const static 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

const作用:

1.定義常量,可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。? ??

  const int Max = 100;?

  void f(const int i) { i=10;//error! }
??????//如果在函數體內修改了i,編譯器就會報錯

const int a = 7; int b = a; //it's right a = 8; // it's wrong,

?

2.便于進行類型檢查

  const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換時可能會產生意料不到的錯誤。

3.可以很方便地進行參數的調整和修改,同宏定義一樣,一變都變

4.可以節省空間,避免不必要的內存分配

  const定義常量從匯編的角度來看,只是給出了對應的內存地址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量

  在內存中有若干個拷貝。

  define PI 3.14159?????????//常量宏
  const doulbe??Pi=3.14159;??//此時并未將Pi放入ROM中
??????????????......
  double i=Pi;???//此時為Pi分配內存,以后不再分配!
  double I=PI;??//編譯期間進行宏替換,分配內存
  double j=Pi;??//沒有內存分配
  double J=PI;??//再進行宏替換,又一次分配內存!

5.提高了效率。編譯器通常不為普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高

?

?

const使用:

1.定義常量:const修飾變量,以下兩種定義形式在本質上是一樣的。它的含義是:const修飾的類型為TYPE的變量value是不可變的。

     ? TYPE const ValueName = value;?
?????    const TYPE ValueName = value;

2.指針使用const

  char* const pContent;??指針本身是常量不可變

  const char *pContent;??指針所指向的內容是常量不可變

3.函數中使用const:

  const修飾函數參數

  a.傳遞過來的參數在函數內不可以改變(無意義,因為Var本身就是形參)

      void function(const int Var);

  b.參數指針所指內容為常量不可變

      void function(const char* Var);

  c.參數指針本身為常量不可變(也無意義,因為char* Var也是形參)

      void function(char* const Var);

  d.參數為引用,為了增加效率同時防止修改。修飾引用參數時:

      void fun(A a);

      void fun(A const &a);

      第一個函數效率低。函數體內產生A類型的臨時對象用于復制參數a,臨時對象的構造、復制、析構過程都將消耗時間。而第二個函數直接傳遞地址,“引用傳遞”不需要

      產生臨時對象,節省了臨時對象的構造、復制、析構過程消耗的時間,提高了效率。但光用引用有可能改變a,所以加上const。  

?4.類相關const:

(1)const修飾成員變量
const修飾類的成員函數,表示成員常量,不能被修改,同時它只能在初始化列表中賦值。
????class A
????{?
? ??????…
? ??????const int nValue; ? ? ? ??//成員常量不能被修改
? ??????…
? ??????A(int x): nValue(x) { } ;?//只能在初始化列表中賦值
?????}?

(2)const修飾成員函數
const修飾類的成員函數,則該成員函數不能修改類中任何非const成員函數。一般寫在函數的最后來修飾。
????class A
????{?
? ??????…
???????void function()const;?//常成員函數,?它不改變對象的成員變量.????????????????????????

//也不能調用類中任何非const成員函數。
}

對于const類對象/指針/引用,只能調用類的const成員函數,因此,const修飾成員函數的最重要作用就是限制對于const對象的使用。

a. const成員函數不被允許修改它所在對象的任何一個數據成員。

b. const成員函數能夠訪問對象的const成員,而其他成員函數不可以。

?

(3)const修飾類對象/對象指針/對象引用

const修飾類對象表示該對象為常量對象,其中的任何成員都不能被修改。對于對象指針和對象引用也是一樣。

const修飾的對象,該對象的任何非const成員函數都不能被調用,因為任何非const成員函數會有修改成員變量的企圖。
例如:
class AAA
{?
? ? void func1();?
void func2() const;?
}?
const AAA aObj;?
aObj.func1();?×
aObj.func2();?正確
?

https://www.cnblogs.com/JiFfeiYu/p/6697195.html

?

?

static:

1.為什么設計static?

      考慮下面的需求:在程序運行過程中,在一個范圍內,有一個對象大家共享,而且可以多次使用,狀態能夠保持,對象的生命周期一直持續到程序運行結束。函數內部定義的變量,在程序執行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函數在棧上分配的空間在此函數執行結束時會釋放掉,這樣就產生了一個問題:?如果想將函數中此變量的值保存至下一次調用時,如何實現? 最容易想到的方法是定義一個全局的變量,但定義為一個全局變量有許多缺點,最明顯的缺點是破壞了此變量的訪問范圍(使得在此函數中定義的變量,不僅僅受此函數控制)。

2.什么時候用static? 需要一個數據對象為整個類而非某個對象服務,同時又力求不破壞類的封裝性,即要求此成員隱藏在類的內部,對外不可見。

3.作用:

    a.作用域隱藏。當一個工程有多個文件的時候,用static修飾的函數或變量只能夠在本文件中可見,文件外不可見

    b.全局生命周期。用static修飾的變量或函數生命周期是全局的。被static修飾的變量存儲在靜態數據區(全局數據區),程序運行期間,不能釋放,一直到程序終止。

    c.static修飾的變量默認初始化為0且只初始化一次

    d.可以節省內存。static修飾的變量或函數是屬于類的,所有對象公有,只有一份拷貝

因此,不能夠將靜態函數設置為虛函數

注意:1.靜態數據成員的值對每個對象都是一樣,但它的值是可以更新的。某個類的實例只要對靜態數據成員的值更新一次,所有對象存取更新后的相同的值,這樣可以提高時間效率

   2.在類中的static成員函數屬于整個類所擁有,這個函數不接收this指針,因而只能訪問類的static成員,也就是靜態變量和靜態函數

   3.static類對象必須要在類外進行初始化

class Text {public:static int count; };int Text::count=0;//用static成員變量必須要初始化 int main() {Text t1;cout<<t1.count<<endl; return 0; }

   4.靜態成員之間可以相互訪問,包括靜態成員函數訪問靜態數據成員和訪問靜態成員函數;非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員;?靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;?

const static:

class A { public:A():m(10) //const成員必須在構造函數的初始化構造列表中初始化 {q = 40;}void fun1()const{m++; //錯誤。const成員是常量,不能改變其值。n++; //正確。static變量n屬于類,但是每個對象的函數都可以訪問和改變它。q++; //錯誤。const成員函數不能改變數據成員的值。 }static void fun2(){m++; //錯誤。const成員是常量,不能改變其值。n++; //正確。static成員函數可以訪問和改變static變量的值。q++; //錯誤。static成員函數不能訪問和改變非static數據成員的值。 }const int m;static int n;static const int p;int q; };int A::n = 5; //static 成員必須在類外初始化,此時不用加關鍵字static,但是要指定類作用域 A:: const int A::p = 30; //static const 成員跟static成員一樣在類外初始化(而不是在構造函數初始化列表中),記得加上關鍵字const

1.C++中,const成員不能在類定義處初始化,只能通過構造函數初始化列表進行,并且必須有構造函數

2.static 成員必須在類外初始化

3.static const 成員跟static成員一樣在類外初始化(而不是在構造函數初始化列表中),記得加上關鍵字const

4.static表示的是靜態的。類的靜態成員函數、靜態成員變量是和類相關的,而不是和類的具體對象相關的。

轉載于:https://www.cnblogs.com/ymjyqsx/p/9728789.html

總結

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

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