例1. 下列語句中,錯誤的是()
- const int buffer = 256;
- const int temp;
- const double* point;
- const double* rt = new double(5.5);
答案:B
解析:
- const是一個C++語言的關鍵字,它限定一個變量不允許被改變
- 使用const在一定程度上可以提高程序的安全性和可靠性
- 限定符聲明變量只能被讀,必須初始化
- B中沒有初始化
C++裡const和*的區分
規則:首先將const和旁邊的一個東西連起來(默認作用於左邊的東西,如果左邊沒有,則作用於右邊的東西),然後再從右往左讀
常量必須要初始化,但變量可以不用初始化
例如:
const int*
因為const只有右邊有東西,所以將const和int連起來,即(const int)*
故從右往左讀為a pointer to a constant integer
即對象為指向一個常量的指針
換言之,指針可以修改指向的地址,但不能修改指向地址的值。例如以下程序
#include <stdio.h>
int main() {
const int* p;
int a = 5;
int b = 10;
p = &a;
p = &b;
printf("%d\n", *p); // 輸出10
return 0;
}
但是不能用 *p = 5
這樣的語句修改指向地址的值,這種寫法會報錯
但是直接修改指向的那個變量的值不會報錯,例如下面的程序
#include <stdio.h>
int main() {
const int* p;
int a = 5;
p = &a;
a = 10;
printf("%d\n", *p); // 輸出10
return 0;
}
即可以用a改裡面的值,但不能用p改值
int const*
利用上面的規則,應為(int const)*
故從右往左讀為a pointer to a constant integer
和第一個相同含義
int* const
連起來為int(* const)
從右往左讀為a constant pointer to an integer
即指向的地址不能變,但是可以修改指向地址的值
例如下面的程序
#include <stdio.h>
int main() {
int a;
int* const p = &a;
*p = 5;
*p = 10;
printf("%d\n", *p);
return 0;
}
因為p是常指針,故必須在聲明時就要指向一塊地址
const int* const
連起來為(const int)(* const)
從右往左讀為a constant pointer to a constant integer
即地址和指向的值都不能變
int const* const*
連起來為(int const)(* const)*
從右往左讀為a pointer to a constant pointer to a constant integer
即指向前一個東西的指針
int const* const* const
連起來為(int const)(* const)(* const)
即前一題的指針為常指針
現在來看題目裡的C、D
const double* point
即point是一個指向double型常量的變指針,固是否初始化都沒有關係
例2 下列語句中,錯誤的是
- const int buffer = 256;
- const double* point;
- int const buffer = 256;
- double* const point;
答案:D
例3 由於常對象不能被更新,因此
- 通過常對象只能調用它的常成員函數
- 通過常對象只能調用靜態成員函數
- 常對象的成員都是常成員
- 通過常對象可以調用任何不改變對象值
答案:A
解析:
- 使用const關鍵字說明的成員函數稱為常成員函數,如下
-
常成員函數不能更新對象的數據成員,否則會報錯class node { int a; public: void func() const { printf("%d\n", a); } };
- 常對象只能調用它的常成員函數
- 常對象的成員函數不一定都是常成員函數
- 公有的靜態數據成員可以直接訪問,但私有的或保護的靜態數據成員卻必須通過公有的接口進行訪問,一般將這個公有的接口定義為靜態成員函數
- 使用static關鍵字聲明的成員函數就是靜態成員函數,靜態程艷函數也屬於整個類而不屬於類中的某個對象,它是該類的所有對象共享的成員函數
- 靜態程艷函數可以在類體類定義,也可以在類外定義。擋在類外定義時,要注意不能使用static關鍵字作為前綴
- 由於靜態成員函數在類中只有一個副本,因此它訪問對象的成員時要受到一些限制:靜態成員函數可以直接訪問類中說明的靜態成員,但不能直接訪問類中說明的非靜態成員。若要訪問非靜態成員,必須通過參數傳遞的方式得到相應的對象,在通過對象進行訪問