zoukankan      html  css  js  c++  java
  • C++ 成员函数前和函数后加const修饰符区别

    博客转载自: https://www.iteblog.com/archives/214.html

    分析以下一段程序,阐述成员函数后缀const 和 成员函数前const 的作用

    #include<iostream>
     
    using namespace std;
     
    class TestClass {
    public:
        size_t length() const;
        const char* getPContent();
        void setLengthValid(bool isLengthValid);
    private:
        char *pContent;
        size_t contentLength;       //A
        bool lengthIsValid;         //B
        size_t precontentLength;
    };
     
    size_t TestClass::length() const{ //函数名后加const
        if(!lengthIsValid){
            contentLength= strlen(pContent);    //C
            lengthIsValid = true;           //D
        }
     
        return contentLength;
    }
     
    const char* TestClass::getPContent(){//函数名前加const
        return pContent;
    }
     
    void TestClass::setLengthValid(bool isLengthValid){
        lengthIsValid = isLengthValid;
    }
     
    int main(void){
        TestClass *tc =new TestClass;
        tc->setLengthValid(false);
        tc->length();
        char * content = tc->getPContent();      //E
        return 0;
    }

    其中类TestClass中的length函数和getPContent函数分别在函数名后和前加了const修饰符,如果试图编译上面的代码,将会得到下面的错误:

    里面有三个错误,也就是代码C、D、E处的三个地方。为什么C和D处的代码会出错,原因如下
    length函数名的后面加了const修饰符,这样说明函数的成员对象是不允许修改的。我们都知道,在类的成员函数里面,默认是在成员函数的第一个位置是this指针,如果在成员函数(只能是成员函数,要是类的静态函数或者是非成员函数就不可以在函数名后面加上const)后面const,则说明this指针的值是不可以修改的,只能读取。而上面的length函数可能会修改里面的contentLength和lengthIsValid的值,这样编译器肯定是不允许的,所以这样是会出现错误的。
    解决方法是:在类的A、B处的成员前面加上mutable修饰符:

    mutable size_t contentLength;
    mutable bool lengthIsValid;

    从字面的意思知道,mutalbe是“可变的,易变的”,跟constant(既C++中的const)是反义词。在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。这样在C、D处将不会出错。
    那么,为什么E处出现了错误。这是因为在函数名getPContent前加了const修饰符,意味着该函数返回的值只能是读取,而不能被修改。而E处的content却为char *是可以被修改的,这与const正好相反了,所以出现了错误。解决方法是:在char *前面加上const修饰符,即:

    const char * content = tc->getPContent(); //E

    再去编译运行,这样就不会出现错误了。

  • 相关阅读:
    nginx面试题
    解决zabbix图形显示“方块”问题
    echo命令详解
    Ubantu1804更换阿里源
    arp命令
    /boot、/和/swap分区扩容
    windows server 2016 安装 .Net Framework失败解决方案
    报错kernel:NMI watchdog: BUG: soft lockup
    jenkins 常用插件源URL
    jenkins rpm包方式安装
  • 原文地址:https://www.cnblogs.com/flyinggod/p/7853082.html
Copyright © 2011-2022 走看看