const用法小议

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


测试题先行~~

1  int  i  =   5 ;
2  const   int   * ip  =   & i;
3  int   const   * ip  =   & i;
4  int *   const  ip  =   & i;
5  const   int *   const  ip  =   & i;

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

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

class  Vector2D{
    
float  x, y;
public :
    Vector2D( 
float  _x  =   0 float  _y  =   0  ) : x( _x ), y( _y )
    {}
    Vector2D( 
const  Vector2D  & vec ) : x( vec.x ), y( vec.y )   //  修饰参数
    {} 
    
float  GetX()  const  {  return  x; }      //  修饰整个函数     
     const  Vector2D  operator   +  (  const  Vector2D  & rval )  const              //  修饰参数,返回值和整个函数
    {  return  Vector2D( x  +  rval.x, y  +  rval.y );   }   
};

--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,vector,测试,float)