關於C++中const的知識點總結

常量對象

在程序開發過程中,需要一些保持不變、無法被修改的量。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()
{
}

參考:
const、static和extern的正確使用方式
const關鍵字
指針常量和常量指針

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章