c++基础:const

const修饰的类型其变量或对象的值是无法被更改。

const作用

1.定义常量

const int a=1;

2.类型检查

const常量具有类型,编译器可以进行检查;#define
宏定义没有数据类型,简单的字符串替换。

3.防止修改,起保护作用

const int 1=1;
i++;//error

const对象默认为文件局部变量
未被const修饰的变量不需要extern显式声明;const常量需要显式声明,定义后无法被修改,所以定义时必须初始化。

定义常量

const int a=10;
b=0;//error:assignment of read-only variable 'b'
const int i,j=0;//error:uninitialized const 'i'

第一个错误:b为常量,不能更改。
第二个错误:i为常量,必须初始化

指针与const

const char *a;
char const *a;

char* const a;

const char* const a;

看const左侧是什么就修饰什么,左侧没有就看右侧。
(1)指向常量的指针

ptr是一个指向int类型const对象的指针,ptr不用赋初值。

const int *ptr
*ptr=10;//error

必须使用const void* 类型的指针保存const对象的地址

const int p=10;
const void *a=&p;
void *a=&p;//error

允许把非const对象的地址赋值给const对象的指针,不能通过ptr修改a的值

const int *ptr;
int a=10;
ptr=&a;

(2)常指针
const指针必须初始化,且const指针的值不能修改,下面修改const指针的值,时通过非cosnt指针修改的。

int a=10;
int *const ptr=&a;
int *x=&a;
*x=1;
cout<<*ptr<<endl;//*ptr=1

当一个const常量的地址赋值给const指针时,因为ptr指向一个变量,而不是cosnt常量,会报错。

const int a=0;
int *const ptr=&a;//error:const int* ->int*

指向常量的常指针

const int a=3;
const int* const ptr=&a;

函数中使用const
const修饰函数返回值

//指针本身不可变
int *const fun()
//无意义,参数返回本身就是一个变量
const int fun()
//指针指向的内容不可变
const int* fun()

cosnt修饰函数参数

void fun(const int a);//传递的参数不可变
void fun(int* const a);//指针不可变
void fun(char *r,const char *a)//a不可变

参数为引用,增加效率同时防止修改

void fun(const A &a)

对于非内部数据类型的参数而言,象void func(A a) 这样声明的函数注定效率比较低。因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。为了提高效率,可以将函数声明改为void func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。但是函数void func(A &a) 存在一个缺点:“引用传递”有可能改变参数a,这是我们不期望的。解决这个问题很容易,加const修饰即可,因此函数最终成为void func(const A &a)。

以此类推,是否应将void func(int x) 改写为void func(const int &x),以便提高效率?完全没有必要,因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。

对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将void func(A a) 改为void func(const A &a)。
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void func(int x) 不应该改为void func(const int &x)

类中使用const
再在类中,不会修改数据成员的函数都应该声明为const类型。使用const关键字声明的成员函数,称为常成员函数,只有常成员函数才能操作常量或者常对象。
const对象只能访问const成员函数;非const对象可以访问任意成员函数,包括const成员函数。const对默认调用const成员函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值