C++中const关键字的用法

最近在找工作,在这里总结一下自己遇到的问题,希望能对大家有所帮助!

欢迎讨论!如有错误,欢迎批评指正!

首先是const关键字,直接上代码!

/**
    这个工程主要实现const关键字的一些基本用法
*/
#include <iostream>
#include <vector>

using namespace std;

/**
    用于fun1的参数可以很大,使用引用传值可以避免参数复制,节省空间,提高速度;
    返回值使用引用是同样的道理,并且这时候的返回值是一个左值!
    参数使用const代表在函数内部不能改变这个vec,
    返回值使用const代表不能通过函数的返回值改变vec!
*/
const vector<int>& fun1(const vector<int> &vec)
{
    //不能修改vec中的值!
    //返回一个常引用!
    //不能将一个局部变量以引用的方式传出!
    return vec;
}

void fun2(const int *p)
{
    cout << "const" << endl;
}

void fun2(int *p)
{
    cout << "not const" << endl;
}

/** 以下重载方式是错误的!使用const为重载提供依据,参数必须是指针或引用!
void fun3(const int n)
{
    cout << "const" << endl;
}

void fun3(int n)
{
    cout << "not const" << endl;
}
*/

/**
    在类A中定义了两个成员函数fun,一个有const关键字,该const表明缺省传入的参数this指针是const的!
    A的不同实例中,普通实例将使用无const关键字的fun,const实例将使用有const关键字的fun!
    该性质也适用于普通函数,如上面的fun2。(是否只当函数的参数是指针或引用时有效?!)
*/
class A
{
public:
    void fun(int i) const { cout << i+1 << endl; }
    void fun(int i) { cout << i << endl; }
};

int main()
{
    /**1: 使用const声明一个变量,则这个变量不能被改变(最基本的用法),
          并且const的对象必须在定义的时候初始化! */
    //const int a; 错误,必须初始化!
    const int a = 0;  //等同于int const a = 0;
    //a = 1; 错误,不能改变const对象的值!

    /**2: 使用const修饰指针和引用的情况,指针有两种情况,引用有一种情况。*/
    int b = 0;
    const int *ptr1 = &b; //等同于int const *ptr1 = &b;
    ++ptr1; //可以进行这个操作,但注意ptr1指向了一个没有意义的地址!
    //*ptr1 = 1; 错误,不能改变ptr所指向的对象!这时候const是在类型前面。
    int* const ptr2 = &b;
    //++ptr2; 错误,不能改变ptr2本身的值!这时候const在*的后面。
    *ptr2 = 1;
    const int &ref1 = b;
    //ref1 = 1; 错误,不能改变ref1所绑定的值!
    //int& const ref2 = b; 错误,引用不存在与指针类似的方法,引用一旦绑定就是不可以改变的!

    /**3: 关于常引用作为函数的参数和返回值的一些用法(重点)*/
    const vector<int> vec1(1000);  //定义一个1000大小的int数组
    cout << fun1(vec1)[0] << endl; //正确,引用可以作为左值
    //fun1(vec1)[0] = 1; 错误,不能修改返回值

    /**4: const为函数的重载提供依据(重点)*/
    A class1;
    class1.fun(1); //输出1
    const A class2;
    class2.fun(1); //输出2
    fun2(ptr1);
    fun2(ptr2);
    //fun3(a);
    //fun3(b);

    /**5: 常引用(重点)*/
    const string &str = "abc";
    //string &str = "acb"; 错误,不能将普通引用绑定到一个常量上面!

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值