C++中类成员函数参数前const,返回值前加const 以及 函数声明后面加const作用及区别

在看公司C++的source code时,我们发现在一个类class里面的成员函数,有3个地方都有可能加const关键字

1. 第1个地方是函数内的形参前面加const

    int fun(const int a)  =>  这个是表示参数a在函数fun内部不能被修改, 如果在函数内的语句试图修改a,编译器就会报错

2. 第2个地方是函数的返回值前面加const

const int* fun()  => 函数返回的指针或者引用,加const规定返回值不能修改

eg:

  int& GetNum();  => 返回的是一个左值,它引用的内容可以修改 , 比如可以这样写 GetNum() = 6; GetNum()在等号的左边,所以说返回一个左值. 这点和C#很不一样,C#中肯定不能这样写

  const int& GetNumConst(); => 返回的是一个右值,  它引用的内容不可以被修改. 你不能写 GetNumConst() = 8, 否则编译器会报错

#include <iostream>
using namespace std;

class NumberHandle {
public:
    int& GetNum() {
        return m_num;
    }

    const int& GetNumConst() {
        return m_num;
    }

    void ShowNum() {
        cout << "Number: " << m_num << endl;
    }

private:
    int m_num = 0;
};

int main()
{
    NumberHandle stu;
    stu.ShowNum();

    stu.GetNum() = 5; // 会修改成员变量的值
    stu.ShowNum();

    stu.GetNumConst() = 6; // 编译器会报错
    stu.ShowNum();

    return 0;
}

 

 所以,很多时候,在C++代码编写中, 为了安全起见,在函数的返回值加上 const,使得函数体不能作为左值。

 

3. 第3个地方是函数后面加上const   => const 修饰函数体时,放到函数体的行尾处,表明在该函数体内,不能修改对象的数据成员,且不能调用非 const 成员函数。

   int fun() const => 这个表明这是个只读函数,在这个只读函数内部,是不能够去改变这个函数所在的类中的成员变量的, 也不能够去调用这个函数所在的类中的其他非const成员函数. 

#include <iostream>
using namespace std;

class NumberHandle {
public:
    void SetNum(int num) {
        m_num = num;
    }

    void SetNumConst(int num) const {
        m_num = num;
    }

    void ShowNum() {
        cout << "Number: " << m_num << endl;
    }

private:
    int m_num = 0;
};

int main()
{
    NumberHandle stu;
    stu.ShowNum();

    stu.SetNum(6); // 正确
    stu.ShowNum();

    stu.SetNumConst(8); // 编译器会报错
    stu.ShowNum();

    return 0;
}

 

 

 

在C++中,const强大的地方就是在于这里,它不像C#中那样,只是用来定义常量。而是在C++中可以用来修饰函数参数,函数返回值,函数体

被const修饰的东西都会受到强制保护,可以防止意外改动,提供了程序的健壮性. 所以通常都建议:  use const whenever you need.

 

posted on 2023-05-12 16:36  新西兰程序员  阅读(564)  评论(0编辑  收藏  举报