常量是一種識別符號,它的值在執行期間恆定不變。
c語言用
#define
來定義常量(稱為巨集常量)。
c++語言除了
#define
外還能夠用
const
來定義常量(稱為
const
常量)。
假設不使用常量,直接在程式中填寫數字或字串。將會有什麼麻煩?
(1).
程式的可讀性(可理解性)變差。程式猿自己會忘記那些數字或字串是什麼意思。使用者則更加不知它們從何處來、表示什麼。
(2).
在程式的非常多地方輸入相同的數字或字串,難保不發生書寫錯誤。
(3).
假設要修改數字或字串,則會在非常多地方修改,既麻煩又easy出錯。
l【規則1】盡量使用含義直觀的常量來表示那些將在程式中多次出現的數字或字串。
比如:#define max 100 // c語言的巨集常量
const
int max = 100;// c++ 語言的const常量
const
float pi = 3.14159;// c++ 語言的const常量
c++語言能夠用
const
來定義常量。也能夠用
#define
來定義常量。
可是前者比後者有很多其他的長處:
(1).
const
常量有資料型別。而巨集常量沒有資料型別。
編譯器能夠對前者進行型別安全檢查。而對後者僅僅進行字元替換,沒有型別安全檢查。而且在字元替換可能會產生意料不到的錯誤(邊際效應)。
(2).
有些整合化的除錯工具能夠對
const
常量進行除錯,可是不能對巨集常量進行除錯。
l【規則1】在
c++程式中僅僅使用
const
常量而不使用巨集常量,即
const常量可
全然代替巨集常量。
l【規則1】須要
對外公開的常量放在標頭檔案裡,不須要對外公開的常量放在定義檔案的頭部。為便於管理。能夠把不同模組的常量集中存放在乙個公共的標頭檔案裡。
l【規則2】假設某一常量與其他常量密切相關。應在定義中包括這樣的關係,而不應給出一些孤立的值。
比如:const
float radius = 100;
const
float diameter = radius * 2;
有時我們希望某些常量僅僅在類中有效。
由於#define
定義的巨集常量是全域性的,不能達到目的,於是想當然地認為應該用
const
修飾資料成員來實現。
const
資料成員的確是存在的,但其含義卻不是我們所期望的。
const
資料成員僅僅在某個物件生存期內是常量。而對於整個類而言卻是可變的,由於類能夠建立多個物件。不同的物件其
const
資料成員的值能夠不同。
不能在類宣告中初始化
const
資料成員。
下面使用方法是錯誤的,由於類的物件未被建立時,編譯器不知道size
的值是什麼。
class a
;
const
資料成員的初始化僅僅能在類建構函式的初始化表中進行。比如
class a
;a::a(int size) : size(size) // 建構函式的初始化表
a a(100);
// 物件a 的
size
值為100
a b(200);
// 物件b 的
size值為2
00
如何才幹建立在整個類中都恆定的常量呢?
有兩種方法,一是用類中的列舉常量來實現;二是將const定義為static型別。
比如方法一:
class a
; // 列舉常量
int array1[size1];
int array2[size2];
};
方法二:
class a
;
列舉常量不會占用物件的儲存空間,它們在編譯時被所有求值。列舉常量的缺點是:它的隱含資料型別是整數,其最大值有限,且不能表示浮點數(如
pi=3.14159
)。
從C到C const關鍵字和常量
目錄通常用 define或const關鍵字定義常量,與define相比,const有資料型別,在一定程度上可以防止出錯。const int max val 23 const double pi 3.14 const char school name ucas int m,n const int p ...
C語言從0到1(03) 常量 輸入與輸出
一 什麼是常量常量是固定值,在程式執行期間不會改變。又叫做字面量。比如 1就是1,a 就是 a 1不會變成2,而 a 也不會變成 b 常量可以是任何的基本資料型別,比如整數常量 浮點常量 字元常量,或字串字面值,也有列舉常量。整數常量可以是十進位制 八進位制或十六進製制的常量。如 66 十進位制 0...
從C到C 的公升級
c 的語言型別 c 是靜態的強型別語言。靜態語言 資料型別在編譯期間檢查,因此在寫程式時需要宣告變數的型別 強型別語言 強調資料型別,不同的資料型別間的轉換需要進行強制型別轉換 1.c 繼承所有c的特性 2.c 在c的基礎上提供的更多的語法和特性 型別加強,函式加強,異常處理 3.c 在c的基礎上增...