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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C / C++ const 的区别和使用

發布時間:2023/12/15 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C / C++ const 的区别和使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C中的const,功能比較單一,較容易理解:
作用:被修飾的內容不可更改。
使用場合: 修飾變量,函數參數,返回值等。(c++中應用場合要豐富的多)
特點: 是運行時const,因此不能取代#define用于成為數組長度等需要編譯時常量的情況。同時因為是運行時const,可以只定義而不初始化,而在運行時初始化。如 const int iConst;。 另外,在c中,const變量默認是外部鏈接,因此在不同的編譯單元中如果有同名const變量,會引發命名沖突,編譯時報錯。
c++中的const:跟c中比較,內容要豐富很多,當然,作用也更大了
1:非類成員const
*在c++中,const變量(在這里涉及的const都不是類中的const,類中的const專門提出來記錄)默認是內部連接的,因此在不同的編譯單元中可以有同名的const 變量定義。
*是編譯時常量,因此可以像#define一樣使用,而且因為上面一點,可以在頭文件中定義const變量,包含的不同的cpp文件(編譯單元)中使用而不引起命名沖突。
*編譯器默認不為const變量分配內存,除非:1. 使用 extern 申明, 2:程序中有引用const 變量的地址。
* 可以使用下面的類型轉換(不安全的): 1: int * = (int *)pConst 2: int * = const_cast<int*>pConst(c++解const屬性cast)
* 函數參數或者返回值能使用 const & or const * 時,盡量使用const屬性,增強程序健全性。
*c++中臨時對象/內置變量默認具有const屬性
2:類中的const
*類中的const與c語言中的const一樣,只是運行時常量,不能作為數組維數使用,即不能取代#define。在類中使用下面兩種方式取代#define: 1:static const... 2: enum{....}//enum 不占存儲空間
*類中的const 變量占用存儲空間
*類中的const成員變量需要在構造函數初始化列表中初始化
*const 對象:在該對象生命周期內,必須保證沒有任何成員變量被改變。const對象只能調用const成員函數。
*const成員函數: void fun() const ... 不僅能被const對象調用,也能被非const對象調用,因此,如果確認一個任何成員函數不改變任何成員變量,應該習慣性將該函數定義成const類型。 如果const成員函數需要改變成員變量,有兩種實現方式: 1 ,const_cast<class*> this強制取消this指針的const屬性。 2:將被改變的成員變量定義成mutable:mutable int i; //應永遠只使用第二種方法,讓任何閱讀程序的人都知道該變量可能被const函數改變。

? ? *如果一個對象被定義成const,那么該const對象“可能”會被放入到ROM當中,這在嵌入式開發當中有時非常重要。。。。(不能有任何自定義的constructor 和destructor。它的基類或者成員對象不能有自定義的constructor和destructor,不能有任何mutable成員變量)


C++中的const正常情況下是看成編譯期的常量,編譯器并不為const分配空間,只是在編譯的時候將期值保存在名字表中,并在適當的時候折合在代碼中.所以,以下代碼:
#include
using namespace std;
int main()
{
const int a = 1;
const int b = 2;
int array[ a + b ] = {0};
for (int i = 0; i < sizeof array / sizeof *array; i++)
{
cout << array << endl;
}
}
在可以通過編譯,并且正常運行.但稍加修改后,放在C編譯器中,便會出現錯誤:
#include
int main()
{
int i;
const int a = 1;
const int b = 2;
int array[ a + b ] = {0};
for (i = 0; i < sizeof array / sizeof *array; i++)
{
printf("%d",array);
}
}
錯誤消息:
c:\test1\te.c(8): error C2057: 應輸入常數表達式
c:\test1\te.c(8): error C2466: 不能分配常數大小為 0 的數組
出現這種情況的原因是:
在C中,const是一個不能被改變的普通變量,既然是變量,就要占用存儲空間,所以編譯器不知道編譯時的值.而且,數組定義時的下標必須為常量.
在C語言中:
const int size;
這個語句是正確的,因為它被C編譯器看作一個聲明,指明在別的地方分配存儲空間.但在C++中這樣寫是不正確的.C++中const默認是內部連接,如果想在C++中達到以上的效果,必須要用extern關鍵字.
C++中,const默認使用內部連接.而C中使用外部連接.
內連接:編譯器只對正被編譯的文件創建存儲空間,別的文件可以使用相同的表示符
或全局變量.C/C++中內連接使用static關鍵字指定.
外連接:所有被編譯過的文件創建一片單獨存儲空間.一旦空間被創建,連接器必須解
決對這片存儲空間的引用.全局變量和函數使用外部連接.通過extern關鍵
字聲明,可以從其他文件訪問相應的變量和函數.
************************C++代碼******************************
header.h
const int test = 1;
test1.cpp
#include
#include "header.h"
using namespace std;
int main()
{
cout << "in test1 :" << test << endl;
}
test2.cpp
#include
#include "header.h"
using namespace std;
void print()
{
cout << "in test2:" << test << endl;
}
以上代碼編譯連接完全不會出問題,但如果把header.h改為:
extern const int test = 1;
在連接的時候,便會出現以下錯誤信息:
test2 error LNK2005: "int const test" (?test@@3HB) 已經在 test1.obj 中定義
因為extern關鍵字告訴C++編譯器test會在其他地方引用,所以,C++編譯器就會為test創建存儲空間,不再是簡單的存儲在名字表里面.所以,當兩個文件同時包含header.h的時候,會發生名字上的沖突.
此種情況和C中const含義相似:
header.h
const int test = 1;
test1.c
#include
#include "header.h"
int main()
{
printf("in test1:%d\n",test);
}
test2.c
#include
#include "header.h"
void print()
{
printf("in test2:%d\n",test);
}
錯誤消息:
test3 fatal error LNK1169: 找到一個或多個多重定義的符號
test3 error LNK2005: _test 已經在 test1.obj 中定義
C++中,是否為const分配空間要看具體情況.
如果加上關鍵字extern或者取const變量地址,則編譯器就要為const分配存儲空間.
C++中定義常量的時候不再采用define,因為define只做簡單的宏替換,并不提供類型檢查.


轉載于:https://blog.51cto.com/boyishachang/1272947

總結

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

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