const有哪些作用

常类型也称为const类型,是指使用类型修饰符const说明的类型。const是C和C++中常见的关键字,在C语言中,它主要用于定义变量为常类型以及修饰函数参数作为返回值,而在C++中还可以修饰函数的定义,定义类的成员函数。常类型的变量或对象的值是不能被更新的。
一般而言,const有一下几个方面的作用:
(1)定义const常量,具有不可变性。例如:
const int MAX=100int array[MAX];
(2)进行类型检查,使编译器对处理内容有更多的了解,消除了一些隐患。例如:void f(const int i){}编译器机会知道i是一个常量,不允许修改。
(3)避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。同宏定义一样,可以做到不变则已,一变都变。如(1)中,如果想修改MAX的内容,只需要定义const int MAX=期望值即可。
(4)保护被修饰的东西,防止被意外的修改,增强了程序的健壮性。在上例中,如果在函数内修改了变量i的值,那么编译器就会报错。例如:
    void f(const int i)
        {
            i=10;
        }

上述代码对i赋值会导致编译错误。
(5)为函数重载提供参考。

    class A
        {
            void f(int i){}//定义一个函数
            void f(int i)const{}//上一个函数的重载
        }

(6)节省空间,避免不必要的内存分配。例如:

    #define PI 3.14159 //该宏用来定义常量
    const double Pi=3.14159//此时并未将Pi放入只读存储器中
    double i=Pi;//此时为Pi分配内存,以后不在分配
    double I=PI;//编译期间替换宏,分配内存
    double j=Pi;//没有内存分配
    double I=PI;//再次今次那个宏替换,又一次分配内存
    const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是像

define一样给出的是立即数,所以const定义的常量在程序运行过程中只有一份复制品,而#define定义的常量在内存中有若干个复制品。

(7)提高了程序的效率。编译器通常不为普通 const常量分配存储空间,而是将他们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

引申1:什么情况下需要使用const关键字?

  1. 修饰一般常量。一般常量是指简单类型的常量。这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后。例如:int
    const x=2或const int x=2.
  2. 修饰常量组。定义或说明一个常量数组可以采用如下格式: int const a[8]={1,2,3,4,5,6,7,8}; const
    int a[8]={1,2,3,4,5,6,7,8};
  3. 修饰常对象。常对象是指对象常量,定义格式如下:
 class A;
 const A a;
 A const a;
定义常对象时,同样需要初始化,并且该对象不能再被更新,修饰符const可以放在类名后面,也可以放在类名前面。

4. 修饰常指针
const int *A;//const修饰指向的对象,A可变,A指向的对象不可变
int const *A;//const修饰指向的对象,A可变,A指向的对象不可变
int *const A ;//const指针A,A不可变,A指向的对象可变
const int * const A;//修饰指针A,A不可变,A指向的对象可变
5. 修饰常引用
使用const修饰符也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被更新。其定义格式如下:
const double &v;
6. 修饰函数的常参数
const修饰符也可以修饰函数的传递参数,格式如下:

     void Fun(const int Var);

告诉编译器Var在函数体中的无法改变,从而防止了使用者一些无意的或错误的修改。
7. 修饰函数的返回值
const修饰符也可以修饰函数的返回值,返回值不可被改变,格式如下:

        const int Funl();
        const Myclass Fun2();
  1. 修饰函数的成员函数
    修饰类的成员函数。const修饰符也可以修饰类的成员函数,格式如下:
        class ClassName
        {
        public:
            int Fun()const;
        }
这样,在调用函数Fun()时就不能修改类或对象的属性。
在另一连接文件中引用const常量。使用方式有:
    extern const int i;
    extern const int j=10;
第一种用法是正确的,而第二种用法是错误的,常量不可以被再次赋值。另外,还要注意,常量必须初始化,如const int i=0;         

引申2:什么是常引用?

常引用也称为const引用。之所以引入常引用,是为了避免在使用变量的引用时,在毫不知情的情况下改变了变量的值,从而引起程序错误。常引用主要用在定义一个普通变量的只读属性的别名,作为函数的传人形参,避免实参在调用函数中被意外的改变。
const引用的意思是指向const对象的引用,非const引用表示指向非const类型的引用。如果既要利用引用提高程序的效率,有要保护传递给函数的数据不在函数中被改变,就应该使用常引用。常引用的声明方式:
const 类型标识符 & 引用名=目标变量名
  1. 常引用的主要用途如下: 用做普通变量的只读属性的别名,通常确保在函数内不会改变实参的值,而不能改变这个变量的值
  2. 用于函数的形参,常引用做形参,可以确保在函数内不会改变实参的值,所以参数传递是尽量使用常引用类型
    如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该变量的值置入临时变量中,对该引用的操作就是对该临时变量的操作,对常量的引用可以用其他任何引用来初始化,但不能改变。
    关于的初始化,一般需要注意一下几个问题:当初始化值是一个左值(可以取得地址)时,没有任何问题。而当初始值是一个右值时,则智能对一个常引用赋值,而且这个赋值是有一个过程的,首先江值隐式转换到类型T,然后将这个转换结果存放在一个临时对象里,最后用这个临时对象来初始化这个引用变量,例如如下二种使用方式:
1double &dr=1;
        (2const double &cdr;
    第(1)种方法错误,初始化不是左值,而第(2)中方法正确,气对应的执行过程如下:
    const double &cdr=temp;
    如果对第(1)中使用方法得到相应的改造,也可以变为合法,例如:
        const int var=1024;
        (1const int *reval=var;
        (2int &ref=val;

在使用const引用进行函数调用的时候,需要注意一个问题,例如如下函数声明:

var conststring &s)

那么下面的表达式将是合法的:

bar("hello world");

程序实例如下所示:

#include<iostream>
#include<string>
using namespace std;
void bar(string &s)
{
cout<<s<<endl;
}
int main()
{
bar("hello world");
return 0;
}

上面的代码会出错,如下原因:
原因在于“hello world”串会产生一个临时变量,而在C++中,临时变量是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。引用型参数应该在能被定义为const的情况下,尽量定义为const。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值