下面主要对C++中关于成员函数的const属性进行讨论:
(1)形参为const
这里有的童鞋可能会产生疑问,print中为什么会返回了局部变量的引用类型,不是说函数中不能返回局部变量的引用或者指针吗?请参照 【C++引用】const 引用的几点用法一文,
其实const int&可以延长局部变量地址的生存时间。在这种情况下我们只能用const int&接收print的返回值。
(3)this指针为const的形式,形如:
就会编译不通过:
需要注意的是,这种this指针为const的形式的成员函数将和this指针不是const形式的成员函数构成重载,也就是说下面两种形式的成员函数是重载关系,是可以在同一个类中共存的:
int& print()const;
int& print();
(1)形参为const
这种情况和普通函数的形参为const的形式类似,形如:
void print(const int& val);
此时,在print函数的内部,不能修改val引用所指的值,当修改时编译器会报错误:
[Hyman@Hyman-PC const]$ g++ const.cpp
const.cpp: In member function ‘void Myobj::print(const int&)’:
const.cpp:14: 错误:increment只读引用‘val’
(2)返回值为const的形式,形如下面代码中的:
const int& print(const int& val);
#include<iostream>
using namespace std;
class Myobj
{
int m_i;
int m_j;
public:
Myobj(int i,int j):m_i(i),m_j(j)
{
}
const int& print(const int& val)
{
int k=400;
int &rk=k;
cout<<"val="<<val<<endl;
return rk;
}
};
int main()
{
Myobj mb(100,200);
int i=300;
const int& ri = mb.print(i);
cout<<"ri="<<ri<<endl;
return 0;
}
这里有的童鞋可能会产生疑问,print中为什么会返回了局部变量的引用类型,不是说函数中不能返回局部变量的引用或者指针吗?请参照 【C++引用】const 引用的几点用法一文,
其实const int&可以延长局部变量地址的生存时间。在这种情况下我们只能用const int&接收print的返回值。
(3)this指针为const的形式,形如:
int& print()const;
这种情况下是将print形参中包含的this指针声明为const的形式,this指针是const的,表示this指向的对象无法进行修改,也就是说改对象包含的字段无法进行修改,若修改
就会编译不通过:
[Hyman@Hyman-PC const]$ g++ const.cpp
const.cpp: In member function ‘void Myobj::print() const’:
const.cpp:14: 错误:increment of data-member ‘Myobj::m_i’ in read-only structure
需要注意的是,这种this指针为const的形式的成员函数将和this指针不是const形式的成员函数构成重载,也就是说下面两种形式的成员函数是重载关系,是可以在同一个类中共存的:
int& print()const;
int& print();
另外,如果实在需要在this指针为const的成员函数中修改成员变量,可以将需要修改的变量用mutable修饰,也就是:
mutable int m_i;