欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

const关键字(C++)

程序员文章站 2022-07-13 23:27:41
...

const是C++的一个关键字。
1.const修饰变量——常变量
变量的值在运行期间不能改变,在定义的同时必需初始化(指定其值)。

const  int a=10;//用const声明变量a,a的值始终为3。
//数据类型也可以是其他float,double,string,char等。
const  int a=5+5;//右边也可以是一个表达式。

在此变量的基础上加上一个限定;存储单元的值不允许变化,也被成为“只读变量”。
区别于#define指令定义的符号常量:
符号常量只是用一个符号表示一个字符串,在编译过程中把所有符号常量替换为指定的字符串,没有类型,在内存中不存在以符号常量命名的存储单元。而常变量具有变量的特征,是一种数据类型,在内存中存在以它命名的存储空间,可以用sizeof运算符测出其长度,它的值不能改变。

2.const修饰指针
(1).指向常量的指针变量:
定义:

const 类型名 * 指针变量名;

定义后不允许通过改变指针变量来改变它指向的对象的值。

int a=12,b=15;
const int *p=&a;//定义了p指针指向整型变量的a的const指针变量
*p=15;//非法,无法通过改变p改变它指向的a的值。
p=&b;//合法,p指向b。
a=15;//合法,直接改变a的值。

指向常变量的指针常用于作函数形参,防止指针形参所指向的对象的值改变影响实参。
例如:

void fun(const int *p)  //形参的指向整型变量的指针变量
{
    *p=5*(*p);//试图p所指的变量的值为原来的5倍,错误。
}

(2)常指针:指向指针变量的值使常量,即指针变量的指向不能改变。
定义形式:

类型名 * const 指针变量名;
int a=4,b=6;
int * const p1=&a;//定义整型常指针,p2指向a;
//定义的同时,必须进行初始化。
p2=&b;//试图改变p2的指向,错误
*p2=12;//合法,指针变量的指向变量的值可以改变。(即a=12)

(3)指向常量的常指针:指向常量的常指针变量。
指针变量指向一个固定的对象,该对象的值不能改变(指不能通过指针变量的改变该对象的值)
定义形式:

const 基本类型名 * const 指针变量名;
int a=10,b=20;
const int *const pt=&a;//指向常量的常指针,使用两个const;
pt=&b;//错误,试图改变pt的指向
*pt=30;//错误,试图通过pt改变a的值。
a=30;//合法

3.const修饰对象
定义一个类:

class Time
{
	public:
    //构造函数,用来初始化成员变量,名字与类名相同
	Time() 
	{
		hour = 0;
        minute = 0;
        sec = 0;
    } 
    //成员函数声明
    void set_time();
    void show_time();
    private:
       int hour;
       int minute;
       int sec;
 };

(1).常对象:定义对象时加关键字const。
定义形式:
类名 const 对象名 [(实参表)];
const 类名 对象名 [(实参表)];
二者等价,在定义常对象时,必须同时对之初始化,之后不能再改变。
一个对象为常对象,通过该对象只能调用它的常成员函数(除了构造函数和析构函数)。

Time const t1(12,34,46);//定义t1为常对象
t1.get_time();//试图调用常对象t1中的普通成员函数,非法
void get_time()const;//将函数定义成常成员函数

常成员函数可以访问常对象的数据成员,但不允许修改常对象中数据成员。
如果想要更改,可将该数据成员声明为mutable,如

mutable int count;//可变的数据成员,
//可以用声明const的成员函数来修改它的值

(2).常对象成员: const int hour;
(a).常数据成员:只能通过构造函数的参数初始化表对常数据成员进行初始化,任何其他函数都不能对常数据成员赋值。

Time::Time(int h)
{
	hour = h;
}
//错误,不能这样赋值

在类外定义构造函数,可以写成这样

Time::Time(int h):hour(h){}

(b)常成员函数:类型名 函数名(参数表) const
声明和定义时,必须加上const;调用时,可以不加const。
常成员函数可以引用const数据成员,也可以引用非const的数据成员
const关键字(C++)
常成员函数不能调用另一个非const成员函数。
(3)指向对象的常指针:类名 * const 指针变量名;
将指针变量声明成const,这样指针变量始终保持为初值,不能改变,即其指向不变。

Time t1(10,12,15),t2;
Time * const ptr1=&t1;//常指针变量,ptr1指向t1
ptr1=&t2;//错误,ptr1不能改变指向

(4).指向常对象的指针变量:const 类型名 * 指针变量名;

Time t1(10,12,15);//定义类对象
const Time *p=&t1;//p为指向常对象的指针变量,指向t1。
t1.hour=18;//合法,t1不是常变量
(*p1)->hour=18;//非法,不能通过p1来改变t1的值。

指向常对象的指针最常用函数的形参,保护形参指针所指向的对象。
const关键字(C++)
(5)对象的常引用
一个变量的引用就是变量的别名。

const Time &t1=t;//t1是Time类对象t的引用,二者指向同一存储空间,
//t的值不能改变