const的用法

const在C++中是用来修饰内置类型变量、自定义对象、成员函数、返回值以及函数参数

const作用:

修饰变量,说明该变量不可以被修改

修饰指针,分为指向常量的指针和指针常量

常量引用,经常用于形参类型,既避免了拷贝,又避免了函数对值的修改

修饰成员函数,说明该成员函数内不能修改成员变量

1.const修饰普通类型的变量

(1)const定义常量时,要进行初始化

(2)数据类型对于const而言是透明的

const int a;//错误,没有进行初始化
const int a = 7; 等同于 int const a = 7;

(3)常量可以将值赋给其他,但不能给变量再次赋值。

const int a = 7;
int b = a;
a = 8;//错误,不能更改常量的值
int *p = (int *)&a;
*p = 8;
//对于const变量a,我们取变量地址并转换赋值给指向int的指针,然后利用*p = 8重新随变量地址内的值赋值,按输出结果仍然会是7;所以不要轻易对const变量设法赋值。

若要改变常量的值,可以在const前面加上volatile关键字

2.const修饰指针变量

(1)const修饰指针指向内容

         const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据,指针本身是变量可以指向其他的内存单元

const int * p = 8;
*p = 9;//错误

(2)const修饰指针

const位于*右侧,表示指针本身是变量,不能指向其他内存地址,指针所指数据可以通过解引用修改

int * const p = 8;
*p = 9;//正确

(3)const修饰指针和指针指向的内容

*左右各有一个const,表示指针和指针所指数据都不能修改

int a = 8;
const int * const p = &a;

3.const参数传递

(1)值传递的const修饰传递,一般这种情况不需要const修饰,因为函数会自动产生,临时变量赋值实参值

void Cpf(const int a)
{
    cout<<a;
}
int main()
{
    Cpf(8);
}

(2)当const参数为指针时,可以预防指针被意外篡改

void Cpf(int * const a)
{
    cout<<*a<<endl;
    *a = 9;
}

(3)自定义类型的参数转换,需要临时对象复制参数,对于临时对象的构造,比较浪费时间,因此我们采取const外加引用传递的方法,并且对于一般的int,double等内置类型,我们不采用引用的传递方法

class Test
{
  public:
         int get() const{}
};
void Cmf(const Test & _tt){}
int main()
{
   Test t(8);
   Cmf(t);
}

4.const修饰函数返回值

(1)const修饰内置类型的返回值,修饰与不修饰返回值一样

(2)const修饰自定义类型作为返回值,此时返回的值不能作为左值使用,及不能被赋值,也不能被修改

(3)const修饰返回的指针或引用,是否返回一个指向const的指针,取决于我们想让用户干什么

5.const修饰类成员函数

const修饰类成员函数,其目的时防止成员函数修改被调用对象的值

注:const关键字不能与static关键字同时使用,因为static关键字修饰静态成员函数。静态成员函数不含有this指针,即不能实例化,const成员函数必须具体到某一实例。const成员函数不能调用非const成员函数,因为非const成员函数可以修改成员变量

void testConstFunction(int _x)const
{
    x = _x;//错误,在const成员函数中,不能修改任何类成员变量
    modify _x(_x);//错误,const成员函数不能调用非const成员函数
}

6.const用于封锁直接修饰的内容,该内容变为只读,该变量不能作为左值

const int a = 10;//const封锁a
a = 100;//错误。a作为左值,使用a的写权限,非法
int b = a;//正确。使用a的读权限,合法

const int *p1 = &a;//const修饰指向的内容
p1 = &b//正确。将p1作为左值合法
*p1 = 200;//错误。const修饰指向内容时不能用解引用修改,*p1作为左值非法

int * const p2 = &a;//const修饰指针p2
p2 = &b;//p2不能作为左值,非法
*p2 = 100;//可以通过解引用修改

const int a * const p3 = &a;//const既修饰指针又修饰指向的内容
p3 = &b;//p3不能作为左值,非法
*ps = 100;//p3也不能通过解引用修改

7.权限只能同等传递或缩小传递

int a = 10;
int b = 20;
const int ca = 10;
const int cb = 20;
int *p = &a;//正确 同等权限
p = &ca;//错误  小权限-> 大权限
const int *cp1 = &a;
cp1 = &b;//正确 大权限->小权限
cp1 = &ca;//正确 同等权限
const int * cp2 = &ca; //正确 同等权限
int * const cp3 = &a;//正确
int * const cp4 = &ca;//错误
const int * const cp5 = &a;//正确
const int * const cp6 = &ca;//正确

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值