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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)