C++ const 修饰function

C++ const 修饰function,第1张

const 除了可以修饰变量之外还可以修饰函数, 主要有以下三种用法: 修饰返回值, 修饰形参,修饰成员函数.

1.修饰返回值 const int& fun(int& a)

这种多是修饰返回值是引用类型的情况下,为了避免返回值被修改的情况。返回值是引用的函数, 可以肯定的是这个引用必然不是临时对象的引用, 因此一定是成员变量或者是函数参数, 所以在返回的时候为了避免其成为左值被修改,就需要加上const关键字来修饰。
函数开头的 const 用来修饰函数的返回值,表示返回值是 const 类型,也就是不能被修改,例如const char * getname()。

#include
using namespace std;
class A
{
private:
    int data;
public:
    A(int num):data(num){}
    ~A(){};
    // const int& get_data()
    int& get_data()
    {
        return data;
    }
};

int main()
{
    A a(1);
    a.get_data()=3;
    cout<<a.get_data()<<endl; //data=3
    return 0;
}
上面这个例子中如果写成`const int& get_data()`, main函数就会报错, 因为对一个const的返回值进行了赋值.
2.修饰形参 int& fun(const int&a)
多数情况下,我们都会选择 pass by reference,这样可以节省内存,并且可以起到改变实参的目的。不过有的时候我们并不希望改变实参的值,就要加上const关键字。在构造接口之前一定要思考函数是否会修改参数,如果不会修改的话一定要加上const,这个是代码写的是否大气的一个标准。
Note: 如果函数不传入const的值就意味着这个值要被改变, 这种情况下可以通过传指针&或者return的形式, 比较清晰.
3.修饰成员函数 inti& fun(inti& a) const{}

const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。
函数头部的结尾加上 const 表示常成员函数,这种函数只能读取成员变量的值,而不能修改成员变量的值,例如char * getname() const。

#include 

using namespace std;

class Student {
 public:
  Student(char *name, int age, float score);
  void show();
  //声明常成员函数
  char *getname() const;
  int getage() const;
  float getscore() const;

 private:
  char *m_name;
  int m_age;
  float m_score;
};

Student::Student(char *name, int age, float score)
    : m_name(name), m_age(age), m_score(score) {}
void Student::show() {
  cout << m_name << "的年龄是" << m_age << ",成绩是" << m_score << endl;
}
//定义常成员函数
char *Student::getname() const { return m_name; }
int Student::getage() const { return m_age; }
float Student::getscore() const { return m_score; }

int main() {
  Student student("Finn", 25, 98);
  student.show();
  return 0;
}

getname()、getage()、getscore() 三个函数的功能都很简单,仅仅是为了获取成员变量的值,没有任何修改成员变量的企图,所以我们加了 const 限制,这是一种保险的做法,同时也使得语义更加明显。

Reference:
https://zhuanlan.zhihu.com/p/110159656
http://c.biancheng.net/view/2230.html

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/874919.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存