2018-11-27 类成员函数后面加const

c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义。今天来讲讲const加在函数前和函数后面的区别。比如:

#include<iostream>
 
using namespace std;
 
// Ahthor:  过往记忆
// E-mail:  wyphao.2007@163.com
// Blog:    https://www.iteblog.com
// 转载请注明出处
 
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修饰符,如果试图编译上面的代码,将会得到下面的错误:

--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------
检查文件依赖性...
正在编译 C:\Users\wyp\Desktop\未命名1.cpp...
[Error] C:\Users\wyp\Desktop\未命名1.cpp:24: error: assignment of data-member `TestClass::contentLength' in read-only structure
[Error] C:\Users\wyp\Desktop\未命名1.cpp:25: error: assignment of data-member `TestClass::lengthIsValid' in read-only structure
[Error] C:\Users\wyp\Desktop\未命名1.cpp:43: error: invalid conversion from `const char*' to `char*'
[Warning] C:\Users\wyp\Desktop\未命名1.cpp:45:2: warning: no newline at end of file
 
构建中止 未命名1: 3 个错误, 1 个警告

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.C和C++的区别?C++的特性?面向对象编程的好处? 答:c++在c的基础上增添类,C是一个结构化语言,它的重...
    杰伦哎呦哎呦阅读 9,659评论 0 45
  • 1.我感恩自己早起做早餐 2.我感恩自己早上读英语 3.我感恩早上可以听新闻早班车 4.我感恩每晚可以听夜读 5....
    秋果日记阅读 158评论 0 0
  • 明日重阳节,微风携着细雨,打落满地红叶,京城最美的秋天眼看就要过去了。兀的不闷杀人也么哥,故而填词阙而。 苏幕遮•...
    明烛高照阅读 180评论 0 1
  • 定义:从索引1开始,与前面的元素逐个比较,若比前面的元素小,则交换位置。由于前面的序列是有序的,若当前元素大于前一...
    孟圆的笔记阅读 213评论 0 0
  • 微情者,小事也。 7月20日天津普降暴雨的时候,我正和母亲还有年幼的女儿L结束三天短暂的假期从北戴河站返津。当地也...
    王小雨1983阅读 244评论 0 0