首页 > 代码库 > c++中const用法大全

c++中const用法大全



1、

const 修饰普通变量


const修饰一个变量,意思就是这个变量是一个常量,不能被改变
const int x;              //x是一个整形常量
const double x;        //x 是一个double型常量

const 修饰的是一个指针时:
const int *x;          //x 是一个指向常量整形的指针
int *const x;        //x 是一个常量指针。
const int *const x ;          //x 即是一个常量指针,也指向一个常量
x在*右边就表示是一个常量指针 , 在*左边就表示指向一个常量。


STL中的迭代器是以指针塑模出来的 , 所以迭代器的作用和T *差不多。
当我们用 const 去修饰一个迭代器时:
const vector<int>::iteator it;           //it是一个常量的迭代器,不能改变这个迭代器的指向,但能改变这个迭代器指向的值。

如果需要迭代器指向的东西不能被改动,如下:
vector<int>::const_iterator it;


2、

const修饰函数形参
 

<span style="font-size:14px;">int &fun(const int x);</span>
<span style="font-size:14px;"></span><span style="font-size:14px;">函数的形参是一个普通的const变量:    1、 如果函数返回值一个non-const引用 , 那么就不能返回 x;    2、 x 的值在函数中不能被改变 , 非常量指针不能指向它 , 非常量引用也不能引用该变量。</span>


<span style="font-size:14px;">int &fun(const int x)
{
    int *z = &x;    //错误的
    int *const z1 = &x;    //错误的,因为z1不是一个指向常量的指针
    const int *z2 = &x      //正确的
    int &z3 = x;        //错误的, 因为z3不是一个常量引用
    const int &z4 = x;       //正确的
    
    return x;  //错误的 , 不是一个常量引用
}</span>

如果形参是 const指针 或者 const引用 , 和上面的普通常量变量用法一样。

3、const修饰成员函数

    注意:只能成员函数才能被 const修饰 , 其他函数都不能被const修饰。
const修饰后的成员函数的注意点:
     1、 在const成员函数中 , 类中的所有变量都含有const属性 , 而指针的const属性 , 是指指针本身是一个常量指针。
     2、 因此在const成员函数中 , 不能non-const引用和non-const指向 ,类中的变量(除引用指针所指的值)
     3、 两个成员函数如果只是常量性不同,是可以被重载的。

<span style="font-size:14px;">class xy
{
public:
    xy():z(new char[10])  {}
    xy(char *new_z)
    {
        int n = strlen(new_z);
        z = new char[n+1];
        strcpy(z , new_z);
    }
    const char &operator [](int si) const;
    char &operator [](int si);

private:
    char *z;
    int x;
    double y[10];
};

const char &xy::operator[](int si) const
{

    cout<<"const"<<endl;
    return *(z+si);
}

char &xy::operator[](int si)
{
    cout<<"no-const"<<endl;
    return const_cast<char &>(
        static_cast<const xy&>(*this)[si]
    );
}
</span>


在类中 , 经常出现通过const属性重载的两个函数,如果这两个函数功能完全一样,那么我们为了避免代码重复,往往都会让non-const 版本的函数去调用 const版本的函数
如上面例子中的 operator[] 函数。

这个时候就要用到const_cast 和static_cast两个强制转行的类型

   const_cast:去除变量的const属性。
   const int x;
   int &y = const_cast<int &>(x);
   static_cast: 普通变量之间的强制转换、给一个变量添加上const 属性
   int x;
   double y = static_cast<double>(x);