常量对象
在程序开发过程中,需要一些保持不变、无法被修改的量。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()
{
}