zoukankan      html  css  js  c++  java
  • c++中const用法

    1 使用const修饰变量

    有时候我们需要定义这样一种变量,它的值不能被更改。为了满足这一要求,可以通过关键字const对变量的类型加以限定。
    1.1 const 修饰普通的变量

    const int bufSize=512;


    这里将bufSize定义成了一个常量。任何试图为bufSize赋值的行为都将引发错误。
    注意:const对象必须初始化,因为const对象一旦创建后其值就不能再改变。
    如:

    const int j=42; //正确,编译时初始化
    const int i=get_size();//正确,运行时初始化
    const int k;  //错误,未初始化
    int i=42;
    const int ci=i;//正确,


    1.2 const的引用

    对常量的引用(reference to const),将引用绑定到const对象上。与普通引用不同的是:
    (1)对常量的引用不能用于修改它所绑定的对象。
    (2)不能将非常量引用指向一个常量对象值。
    (1)对常量的引用不能用于修改它所绑定的对象。

    int i=42;
    int &r1=i;
    const int &r2=i;//r2也绑定了对象i,但不允许通过r2修改i的值
    r1=0;           //正确
    r2=0;           //错误,r2是一个常量引用

    (2)不能将非常量引用指向一个常量对象。

    const int ci=1024;
    int &r2=ci;         //错误,试图让一个非常量引用指向一个常量对象

    1.3 const与指针

    const修饰指针变量有3种情况:
    (1)指向常量的指针(pointer to const)不能用于改变其所指对象的值。
    (2)常量指针(const pointer),指针本身定义为常量。
    (3)const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。

    (1)指向常量的指针(pointer to const),不能通过该指针改变其所指对象的值。

    const double pi=3.14;
    double *ptr=π            //错误:ptr是一个普通的指针。
    const double *cptr=π //正确:
    *cptr=42;                        //错误:不能给*cptr赋值

    指向常量的指针也可以指向一个非常量对象。

    double val=3.14;
    *cptr=&val;         //正确,但不能通过cptr改变val的值。

     

    注意:指向常量的指针仅仅不能通过该指针改变所指对象的值。
    (2)常量指针(const pointer),指针本身定义为常量。
    常量指针必须被初始化,一旦初始化完成,它的值(也就是存放在指针中的那个地址)将不能被改变。
    把*放在const关键字之前用以说明指针是一个常量。

    int errorNumb=0;
    int *const curErr=&errorNumb;            //正确:curErr将一直指向errorNumb

    (3)将上述两种结合,指向常量对象的常量指针

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


    const的用法及c与c++ 中的不同

    (1)可以定义const常量。

    (2)Const可以修饰函数的参数和返回值,甚至定义体。被const修饰的东西都受到强制保护。

    (3)Const修饰成员函数时,用于成员函数前面,则返回值不能作为左值。用在后面,则该成员函数的数据成员不能改变。

    (4)Const修饰数据成员时,必须使用冒号语法。

    在C程序中,const主要有定义变量、修饰函数参数、修饰函数返回值。

    在C++程序中,还可以修饰函数的定义体,定义类中成员函数为恒态函数,既不改变类中的数据成员。

    在数组定义维数N时,只能用const和define来定义N:

    1.const和指针:

    如果const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。

    int* p

    [const intr* p

    int const * p] //(p是一个指向常整型数的指针,整型数不可修改,但指针可以修改,所指向的值是常量。

    char* const p (p是一个指向整型数的常指针,指向的数可以修改,但指针不可修改,地址值是常量的指针。)

    const char* const p  (p是一个指向常整型数的常指针,指针和其所指向的数都不可修改)

    2.const和STL的迭代器:

    STL迭代器是以指针为根据创建出来的,可以视迭代器为T*指针。

    ①声明迭代器为const。与声明指针为const一样(声明一个T* const指针),表明该迭代器不能指向其他的东西(容器),但是所指向的东西的值是可以改变的。

    ②声明迭代器指向东西的值为const,但指向的东西(容器)可以换成其他的,需要const_iterator。

    例如:

    std::vector<int> vec;

    const std::vector<int>::iterator it1 = vec.begin(); //类似于T* const

    *it1 = 10; //正确,指向东西的值可以改变

    it1++;//错误,不能改变指向的东西。

    std::vector<int>::const_iterator it2 = vec.begin();//类似于const T*

    *it2 = 10;//错误,指向的东西的值不能改变

    it2++;//正确,指向的东西可以改变

    3.函数与const

    ①函数后加const:const是对函数的一个限定,使其无法修改类内的数据成员。const告诉别人这个函数不会改变对象的状态。

    声明一个函数用 const 关键字来说明这个函数是一个只读函数(read only method),即不会修改任何的数据成员也就是不会改变该对象的状态。该类函数的声明和定义时都要加上 const 关键字。

    不能调用非const函数:如果我们在编写 const 函数时不小心修改了数据成员,或者调用了其他非 const 成员函数(即会修改数据成员的函数),编译器将会报错。这无疑让代码更加的健壮。

    如 void action(A a) const;

    ②const修饰函数返回值

    用const来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改,也常用于运算符重载。归根究底就是使得函数调用表达式不能作为左值。

    如:const A& action (A a);

    ③形式参数加const:防止传入的实参被改变。

    如:void action(const A& a);

  • 相关阅读:
    Druid 介绍及配置
    LoadRunner性能测试入门教程
    Java 程序员必须收藏的资源大全
    JProfiler 入门教程
    Web网站的性能测试工具
    职场中必须知道的8条规则
    作为测试人员需要的技能和工作要求
    web性能监控与分析
    Java应用常用性能分析工具
    mockito简单教程
  • 原文地址:https://www.cnblogs.com/tanshengjiang/p/11808814.html
Copyright © 2011-2022 走看看