C++中函数后⾯跟const是什么意思
问题:c++:void display( ) const 中的const是什么意思?
简答:
意思是除了表明了mutable的成员变量以外
该类的其他的成员变量在这个函数内⼀律不能修改。
详细:
加const表明,该函数只能是只读的,不能修改私有变量的值。加强安全性。
给隐含的this指针加const,表⽰这个this指向的东西是const的,也就是说这个函数中⽆法改动数据成员了。const是⼀种保证,告诉你这个成员不会改变对象的状态。
类的成员函数后⾯加 const,表明这个函数不会对这个类对象的数据成员(准确地说是⾮静态数据成员)作任何改变。
在设计类的时候,⼀个原则就是对于不改变数据成员的成员函数都要在后⾯加 const,⽽对于改变数据成
员的成员函数不能加 const。所以const 关键字对成员函数的⾏为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后⾯,⽽不是在函数前⾯或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。
除此之外,在类的成员函数后⾯加 const 还有什么好处呢?那就是常量(即 const)对象可以调⽤ const 成员函数,⽽不能调⽤⾮const修饰的函数。正如⾮const类型的数据可以给const类型的变量赋值⼀样,反之则不成⽴。
请看下⾯⼀个完整的例⼦,然后我再作⼀些说明。
CODE:
#include
#include
using namespace std;
class Student {
public:
Student() {}
Student( const string& nm, int sc = 0 )
: name( nm ), score( sc ) {}
void set_student( const string& nm, int sc = 0 )
{
name = nm;
score = sc;
}
const string& get_name() const
{
return name;
}
int get_score() const
{
return score;
}
private:
string name;
int score;
};
// output student's name and score
void output_student( const Student& student )
{
cout << _name() << "/t";
cout << _score() << endl;
}
int main()
{
Student stu( "Wang", 85 );
output_student( stu );
}
设计了⼀个类 Student,数据成员有 name 和 score,有两个构造函数,有⼀个设置成员数据函数 set_student(),各有⼀个取得 name 和score 的函数 get_name() 和 get_score()。请注意 get_name() 和 get_score() 后⾯都加了 const,⽽ set_student() 后⾯没有(也不能有const)。
⾸先说⼀点题外话,为什么 get_name() 前⾯也加 const。如果没有前后两个 const 的话,get_name() 返回的是对私有数据成员 name 的引⽤,所以通过这个引⽤可以改变私有成员 name 的值,如
CODE:
Student stu( "Wang", 85 );
<_name() = "Li";
即把 name 由原来的 "Wang" 变成了 "Li",⽽这不是我们希望的发⽣的。所以在 get_name() 前⾯加 const 避免这种情况的发⽣。
那么,get_name() 和 get_score() 这两个后⾯应该加 const的成员函数,如果没有 const 修饰的话可不可以呢?回答是可以!但是这样做的代价是:const对象将不能再调⽤这两个⾮const成员函数了。如
CODE:
const string& get_name(); // 这两个函数都应该设成 const 型
int get_score();
void output_student( const Student& student )
{
cout << _name() << "/t"; // 如果 get_name() 和 get_score() 是⾮const成员函数,这⼀句和下⼀句调⽤是错误的
cout << _score() << endl;
}
int函数啥意思由于参数student表⽰的是⼀个对const Student型对象的引⽤,所以 student 不能调⽤⾮const成员函数如 set_student()。如果 get_name() 和get_score() 成员函数也变成⾮const型,那么上⾯的 _name() 和 _score() 的使⽤就是⾮法的,这样就会给我们处理问题造成困难。
因此,我们没有理由反对使⽤const,该加const时就应该加上const,这样使成员函数除了⾮const的对象之外,const对象也能够调⽤它。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。