加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++常量成员函数

发布时间:2020-12-16 07:37:43 所属栏目:百科 来源:网络整理
导读:通过引用或通过指针传递给函数的形参可能会被该函数修改。但是如果在形参中使用 const 关键字,则可以防止调用的函数修改它。 例如,某个函数的声明如下: void fun (const string str); 该函数釆用了一个字符串对象的引用作为形参,但不能修改该对象。有一个
通过引用或通过指针传递给函数的形参可能会被该函数修改。但是如果在形参中使用 const 关键字,则可以防止调用的函数修改它。

例如,某个函数的声明如下:

void fun (const string &str);

该函数釆用了一个字符串对象的引用作为形参,但不能修改该对象。有一个类似的机制,可以用来保护隐含的形参 *this,使它不会被成员函数修改。当定义成员函数时,可以在形参列表后面放置 const 关键字,这实际上就是告诉编译器,该成员函数未被允许修改其对象。如果成员函数定义在类外面,则类内的声明和类外的定义都必须具有 const,示例如下:
class ConstExample
{
    int x;
    public:
        ConstExample(int a){ x = a;}
        void setValue(int);
        int getValue() const;
};
getValue 函数定义语句应如下:
int ConstExample::getValue() const
{
    return x;
}
具有常量形参 X 的函数无法转向,并将 X 作为非常量形参传递给另一个函数。换句话说,承诺不修改 X 的函数不能将X传递给另一个函数,除非第二个函数也承诺不修改 X。这种情况有时也可能会以不明显的方式发生。

以下程序使用带有常量形参的函数来打印数组的第一个元素,但是它不会编译,因为它在 const 的使用方面不一致:
#include <iostream>
using namespace std;

class K
{
    public:
        void output () // 丢矢了 const
        {
            cout << "Output of a K object" << endl;
        }
};
void outputFirst(const K arr[])
{
    arr[0] .output ();
}
int main(int argc,char** argv)
{
    K arr [] = { K() };
    outputFirst(arr);
    return 0;
}
该程序之所以不能编译,是因为编译器不能保证 const 数组的元素在作为隐含的 this 形参传递给 output 成员函数时不会被修改:

arr[0].output();

要让该程序可以编译,则可以使 output() 成员函数变成一个 const 成员函数,以表示它有一个作为常量的 this 形参,示例如下:
class K
{
    public:
        void output() const
        {
            cout << "Output of a K object" << endl;
        }
};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读