关于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关键字
指针常量和常量指针

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值