您的位置:首页 > 编程语言 > C语言/C++

c++中const用法总结

2014-08-18 14:22 302 查看
const关键字在c++中的用法很普遍,总结了一下,大致有这些用法。

        1.阻止一个变量被改变,使用const修饰,变量成为常量,因为以后不能修改它,所以定义时必须初始化。比如const int number = 512。这和c语言中宏有点类似,都是定义常量的,但是它们也有不同之处:宏只是做简单的字符替换,在预处理阶段就被替换了,没有数据类型也不做类型检查,并且不会占用存储空间;const是在编译运行时使用,有数据类型,在编译期间做类型检查,并且会被分配存储空间。在c++程序中,应该使用const代替#define。

       

          2.用来修饰指针:①指向const对象的指针( 常量指针)比如const int *p;我们从右往左理解,p是一个指针变量,它保存是的是int类型的常量对象,说明指针p是可变的,它指向的对象不可变;②const指针(指针常量)比如int num = 0; int *const p = #还是一样,从右往左理解,p是一个const类型的指针,它指向的是一个int类型的对象,说明指针p不可变,它指向的对象是可变的;③指向const对象的const指针 比如const double pi
= 3.1415; const double *p = π 说明指针p是不可变的,它指向的对象也是不可变的。

         3.用来修饰函数形参和返回值。①const修饰形参,表明它是一个输入参数,在函数内部不容许改变它的值。ps:对于输入参数的指针形参应该尽量被声明为const,调用的时候可以传递指向const对象的指针也可以传递指向非const对象的指针。如下面的代码:

[cpp] view
plaincopy

#include <iostream>  

  

using namespace std;  

  

void test_const(const double*);  

  

int main() {  

      

    //pi1是非const对象  

    double pi1 = 3.1415;  

    test_const(&pi1);  

      

    //pi2是const对象  

    const double pi2 = 3.1415;  

    test_const(&pi2);  

  

    system("pause");  

  

    return 0;  

}  

  

void test_const(const double *d_ptr) {  

    cout << *d_ptr << endl;  

}  

输出结果:


结果表明使用指针形参时用const修饰(输入参数)能力要强一些,而且还能防止意外的改变该指针指向的内存单元。使用引用传递时(输入参数),应该使用const修饰,不产生临时对象,可以提高效率,当然使用const修饰后既可以接受const对象也可以接受非const对象。

②const修饰返回值。使其返回值不能为左值。看下面的代码说明

[cpp] view
plaincopy

#include <iostream>  

  

using namespace std;  

  

const int& test_const_return(int&, int);  

  

int main() {  

      

    int i = 9;  

    int &r_i = i;  

  

    //当我们用引用返回左值时,若不加const修饰,由于时左值,可以赋值,在此函数中会改变第一个引用形参的值,引起错误,为了防止这种情况,我们加上const就可以防止引用返回值被修改,防止函数作为左值  

    //test_const_return(r_i, 1) = 11;  

  

    cout << "max: " <<  test_const_return(r_i, 1);  

  

    system("pause");  

  

    return 0;  

}  

  

const int& test_const_return(int &i, int j) {  

    return i >= j ? i: j;  

}  

         4.const修饰成员函数。任何不会修改类中数据成员变量的成员函数都应该声明为const类型。也就是说const成员函数中是不能改变成员变量的值,那我们确实需要改变怎么办呢,c++中有个不常用的关键字mutable就可以帮我们实现,表明此数据成员变量是可变的。而且const成员函数不能调用非const成员函数。看看下面的代码

[cpp] view
plaincopy

#include <iostream>  

  

using namespace std;  

  

  

class A {  

public:  

    void set(int i);  

    int get();  

    int get_count() const;  

  

private:  

    int m;  

    mutable int v_m;            //可变的变量,这样就可以在const成员函数中修改此变量了    

};  

  

int A::get_count() const {  

  

    ++m;                        //编译错误,const成员函数中试图修改成员变量  

    get();                      //编译错误,const成员函数中试图调用非const成员函数  

  

    ++v_m;                      //编译通过,因为v_m变量类型是mutable  

  

    return m;  

}  

看看编译结果:



         从上面可以看出虽然const只是c++语法中的一个关键字,但是它的作用之广用处之大已经很明了,要想写出健壮高效的c++代码,const是必不可少的,对于const需要掌握。

        上面出现了一个词叫左值,这在c++中很常见,简单解释一下。左值可以出现在赋值语句的左边或者右边,也就说左值其实是可以作为右值使用的。而右值是只能出现的赋值的右边。列举了几个简单的例子:

[cpp] view
plaincopy

#include <iostream>  

  

using namespace std;  

  

int main() {  

  

    int a = 1;                      //a是左值,数字常量都是右值  

    char str[] = "hello, world";    //str[i]是左值,“hello, world”是右值  

  

    string("hello, world");         //是右值  

  

    return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: