首页 > 试题广场 >

什么是常函数,有什么作用

[问答题]

什么是常函数,有什么作用

推荐

得分点

声明方式、特点、常对象

参考答案

标准回答

  1. 常函数的声明方式

    普通成员函数后面加上 const 修饰,就是常函数

    返回值    函数名(形参列表) const    {
        函数体
    }

    注意:const 必须放到形参列表后面才是常函数,不能放到前面,放到前面修饰的是返回值。

  2. 特点

    • 常函数中的 this 指针是常指针,不能在常函数中对成员变量进行修改,只能读取
    • 如果想要在常函数中对成员变量进行修改,可以在成员变量前加上 mutable 关键字进行修饰
    • 常函数可以被普通对象或者常对象调用,但是常对象只能调用常函数,常对象只能读成员

加分回答

  1. 只有普通成员函数才可以是常函数
  2. 构造函数不能是常函数,因为构造函数的用途是对成员进行初始化,如果构造函数变成常函数,就不能对成员进行修改,就失去了其作为构造函数的意义
  3. 析构函数不能是常函数,同理构造函数
  4. 全局函数和静态成员函数,因为它们函数体中没有 this 指针,所以也不能是常函数

延伸阅读

常函数示例代码:

class Person {
public:
    int m_Age;
    mutable int m_Height;
    Person(int age) {
        this->m_Age = age;
    }
    // this指针的本质  指针常量   Person* const this;
    // 如果想让this指针指向的对象的内容不能被修改,const Person* const this;
    void show() const{        // 常函数
        // this->m_Age = 200;    // 常函数中,不能对成员进行修改
        this->m_Height = 180;    // 常函数中,可以修改mutable修饰的成员
        cout << this->m_Age << endl;
    }

    void show1() {}
};

int main() {

    Person p1(20);
    p1.show();

    // 常对象
    const Person p2(30);    // 常对象
    // p2.m_Age = 20;    // 常对象不能修改内容

    p2.m_Height = 190;    // 常对象可以修改mutable修饰的成员变量

    p2.show();    // 常对象可以调用常函数
    // p2.show1();    // 常对象不能调用普通函数

    return 0;
}
编辑于 2021-09-15 11:20:31 回复(0)