zoukankan      html  css  js  c++  java
  • const用法的解惑

    引用自:  http://www.cnblogs.com/csyisong/archive/2009/01/10/1373083.html

    虽然看过C++方面不少的资料,但我现在仍然是一个初学者,编过C++的一些程序,但不多。const修饰词做为C++一个重要的概念,务必要弄清楚才行,看到网上一个C++学习者的博客上归纳的很不错,很精炼。以下是参考的链结:

    htmlhttp://www.cppblog.com/seuauto/archive/2008/09/04/60941.html

    const是C++的关键字之一,与其他的关键字相比,C++初学者可能对于const的使用会一时摸不着头脑,若能正确的使用const,将使你的程序更加Robust!

    先看下面的一些代码:

     int i = 5;
     
    const int *ip = &i;
     
    int const *ip = &i;
     
    int* const ip = &i;
     
    const int* const ip = &i; 

       对于上面四个条语句,你能说出它们之间的区别吗?
    2)和3)中const修饰的是*ip, 这表明ip所指向的变量i是const的,类似*ip = 1的操作编译的时候都会报错;4)const修饰的是ip,说明指针本身是const,修改指针指向的变量是合法的,而类似++ip修改指针本身的操作是 违法的;5)指针本身和指向的变量都是const的。

    const的用法主要体现在函数声明中的应用,它既可以修饰函数参数,还可以修饰函数的返回值,此外对于类的成员函数,它还可以修饰整个函数。下面是一个简单简单的二维向量类:


     1class Vector2D{
     2    float x, y;
     3public:
     4    Vector2D( float _x = 0float _y = 0 ) : x( _x ), y( _y )
     5    {}
     6    Vector2D( const Vector2D &vec ) : x( vec.x ), y( vec.y )  // 修饰参数
     7    {} 
     8    float GetX() const return x; }     // 修饰整个函数     
     9    const Vector2D operator + ( const Vector2D &rval ) const  // 修饰参数,返回值和整个函数
    10    return Vector2D( x + rval.x, y + rval.y );   }   
    11}
    ;
    12

     --const修饰函数参数
    在copy构造函数中,const修饰的 是函数的参数,调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const Vector2D &vec,则不能对传递进来的引用对象的进行改变,从而保护了原对象的属性。
    [Tips]const通常用于修饰指针或引用类型的参数。

    --const修饰返回值
    在重载的向量加法运算符的函数中,返回值用const修饰,这样如下的赋值操作就非法的:
    Vector2D vec1, vec2, vec3;
    (vec1+vec2) = vec3;
    [Tips]一 般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于运算符的重载。通常,函数返回值为某个对象或对象的引用时,不用const来修 饰。因为,这样返回的实例只能访问public成员和const成员函数,并且赋值操作也是非法的,这样的用法是非常罕见的。

    --const修饰类的成员函数
    对于Vector2D::GetX()函数,因为它不会修改成员数据,若声明成const,如果函数实现中修改了成员变量,编译的时候将报错,这样程序会更加的Robust。

    [Tips]
    a.在你搞清楚const的用法之后,请大胆使用;
    b.在参数中使用const应该使用引用或指针,而不是一般的对象实例;
    c.不要轻易的将函数的返回值类型定为const;
    d.除了重载操作符外一般不要将返回值类型定为对某个对象的const引用。

    看完了这篇文章,很受感触,写的很好,作者肯定是在平时学习与工作中不断的积累才把这些经验总 结写下来的,才给予我们这些初学者一些借鉴与经验,让我们少走弯路。当然,这些还只是相对来说形式比较简单的情形,在复杂的情况下,我们更是要保持清醒的 大脑,写程序就是这样,一定要让自己的大脑清醒,思路流畅,这样才会少出错误。

         C++学习中,希望每天都有进步!

  • 相关阅读:
    Java 条件语句
    Java循环
    Java 变量
    Java 数据类型
    nginx+php发布网站
    安装MySQL5.7
    docker-compose参数
    部署
    dockerfile编写
    在VMware中安装CentOS7
  • 原文地址:https://www.cnblogs.com/langqi250/p/2772907.html
Copyright © 2011-2022 走看看