【C++面向对象】C++中成员函数的const属性

来源:互联网 发布:淘宝宝贝描述图片像素 编辑:程序博客网 时间:2024/05/21 09:07
      下面主要对C++中关于成员函数的const属性进行讨论:
(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;

0 0
原创粉丝点击