常量對象
在程序開發過程中,需要一些保持不變、無法被修改的量。c++中可以用const進行修飾。
注意事項:
- 使用const定義常量,定義時需要完成初始化(簡單來講就是變量定義和初始化在一行代碼中)。
const int buffer_size; //錯誤,聲明時沒有進行初始化
- const常量一旦定義完成,任何地方無法修改。
const int buffer_size = 512;
buffer_size = 20; //錯誤
- 針對類中用const修飾的成員變量,必須通過初始化列表進行初始化。
class DemoClass
{
public:
DemoClass(int,int);
~DemoClass();
private:
const int a;
};
DemoClass::DemoClass(int m, int n) :a(m) //使用初始化列表初始化const常量
{
}
DemoClass::~DemoClass()
{
}
- 在多個文件中經常使用的同一個字符串常量,可以使用extern與const組合。關於作用域:在全局作用域聲明的非const變量,全局可以訪問。(一個文件中定義,只需要合適的聲明,就可以在其他文件中使用,非const變量默認extern。)。在全局作用域聲明的const常量屬於該文件的局部變量,只存在當前文件中,無法在其他文件中使用。如果非要使用,需要用extern關鍵字修飾。
//文件1
const int my_size = 512;
//文件2
#include <iostream>
#include "DemoClass.h"
using namespace std;
extern const int my_size;
//使用exern聲明常量已經在其他文件中完成定義
//參看上面只聲明,不初始化的報錯信息
int main()
{
std::cout << my_size<<endl;
}
常量引用
- 指向const對象的引用必須用const修飾,表示這個引用指向的是一個常量,無法被修改。
const double pi = 3.14;
const double &Pi = pi; //正確寫法
double &Pi = pi; //錯誤,報錯信息如下,非const修飾的引用不能指向const對象
int main()
{
/*普通引用*/
//正確,引用綁定到int 變量i上
int i = 3;
int& ri = i;
//錯誤, 引用類型爲 int ,所綁定對象類型爲 double,類型不一致
double d = 3.1415;
int &rd = d;
//錯誤, 普通引用必須綁定到對象,不能綁定至常量
int& rm = 3;
/*const引用*/
//正確,整型字面值常量綁定到 const引用
const int& ci = 3;
//正確,非常量對象綁定到 const引用
int i = 1;
const int& cj = i;
//正確,常量對象綁定到 const引用
const int i = 4;
const int& ck = i;
//錯誤,常量對象綁定到非const引用
const int i = 5;
int& r = i;
}
指針常量 和 常量指針
指針常量:指針指向一個固定的地址,無法被修改(標誌:const關鍵字出現在* 右側)指針自身的值是一個常量,不可改變,始終指向同一個地址。在定義的同時必須初始化。
int a = 10, b = 20;
int * const p = &a;
*p = 30; // p指向的地址是一定的,但其內容可以修改
常量指針:指向一個常量的指針,指針可以指向不同的常量,但是不可以通過指針修改常量的值。(標誌:const關鍵字出現在 *號左側)
int a = 10, b = 20;
const int *p = &a;
p = &b; // 指針可以指向其他地址,但是內容不可以改變
如果*號左右兩側均有const 關鍵字,表明:這是一個指向固定地址的指針,同時這個地址存儲的值不允許被改變,具有兩者的特性。
const int * const ptr6 = &m; // 指向“常量”的指針常量,具有常量指針和指針常量的特點,指針內容不能改變,也不能指向其他地方,定義同時要進行初始化
*ptr6 = 5; // 錯誤,不能改變指針內容
ptr6 = &n; // 錯誤,不能指向其他地方
const與函數
- 類中不會修改數據成員的函數都應該被定義爲const類型。
- const重載
關於初始化方式:
#include <iostream>
using namespace std;
class A
{
public:
A(int a);
~A();
static void Print();//靜態成員函數
private:
static int aa;//靜態數據成員聲明
static const int count;//常量靜態數據成員,可以在構造函數中初始化
const int bb;//常量數據成員,只能使用初始化列表的方式初始化
};
int A::aa = 20; //靜態成員變量定義並初始化
const int A::count = 25;
A::A(int a):bb(a)
{
}
A::~A()
{
}