C++ 成员函数前和函数后加const修饰符区别-程序员宅基地

技术标签: python  c/c++  

分析以下一段程序,阐述成员函数后缀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

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

转载于:https://my.oschina.net/u/920274/blog/3003587

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34029680/article/details/92024056

智能推荐

光标变成下横线,变回竖线方法_光标怎么变成竖线-程序员宅基地

文章浏览阅读1.1w次,点赞16次,收藏8次。#光标变成下横线,变回竖线方法_光标怎么变成竖线

hadoop2.6.0本地编译,仅作学习记录-程序员宅基地

文章浏览阅读61次。  官网下载hadoop二进制文件,安装部署,可以成功,但是每次运行命令之前均会报错Unable to load native-hadooplibrary for your platformhadoop,经查明为官网提供的是32位,但实际生产环境中一般均需要64位,下面就结合网上资料,整理编译64位hadoop2.6.0 的步骤。  编辑环境为:redhat6.6 +jdk1.7+had..._hadoop2.6.0编译

运行deeplabv3plus-程序员宅基地

文章浏览阅读3k次。1、 参考博客网址:利用deeplab v3+开源代码训练PASCAL VOC 2012数据集https://blog.csdn.net/lfs666666/article/details/83042119论文笔记: DeepLab v3+https://delnasay.github.io/2018/10/14/%E8%AE%BA%E6%96%87%E7%AC%94%E8%AE..._deeplabv3plus

java基础知识-程序员宅基地

文章浏览阅读160次。文章目录基础知识泛型可变参基础知识泛型常用的通配符有T,E,K,V分别表示类型、元素、键、值E 未知的数据类型,在集合中使用T - Type(Java 类) 方法前等等使用可变参* 前提:方法的参数数据类型确定,参数的个数任意* 可变参的语法个数:数据类型…变量名* 可变参数本质上就是一个数组...

[转载]常用CASE工具介绍-程序员宅基地

文章浏览阅读484次。[转载]常用CASE工具介绍 转载自:http://www.cnblogs.com/powerlc/archive/2006/01/12/315959.html ..._case tools都有什么

多线程环境下的单例模式_多线程中使用单例模式-程序员宅基地

文章浏览阅读199次。package com.yunding.concurrent;/** * 多线程环境下的单例模式: doubleChecked + volatile (双重检测 + 避免happenBefore) * * 实例化对象的三个步骤: 1. 开辟空间 2. 初始化对象 3. 把对象的地址赋给引用变量 * * @author beOkWithAnything * */public..._多线程中使用单例模式

随便推点

曲线积分与曲面积分总结_geogebra进阶21:妙用曲面指令进行涂色-程序员宅基地

文章浏览阅读1.3k次。geogegebra进阶20:非常实用的ggb课件中文本放大的方法涂色在笔者文章中写了2篇:如下geogebra进阶13:(多边形、积分)涂色和计算面积geogebra基础入门27:简单的涂色方法和涂色旋转在geoegebra多种涂色方案中,曲面指令是一个作用神奇的方法。要了解曲面指令,首先看看曲线指令。一、相关指令学习先参考唐家军老师的指令汇编:Curve(CurveCartesian..._封闭曲面ggb

python PIL.Image使用-程序员宅基地

文章浏览阅读617次。一、 基本概念通道每张图片由一个或多个通道构成RGB图像为例,每张图片由3个通道构成,即R通道,G通道,B通道。对于灰度图像,则只有一个通道。获取图像的通道数量和名称,可以由方法PIL.Image.getbands()获取,此方法返回一个字符串元组,包含每一个通道的名称模式图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:1:1位像素,表示黑和白,但是存储的时候每个像素存储为8..._pil.image 通道

python比较两张图片是否一样_使用PIL(Python成像库)按像素比较两个图像-程序员宅基地

文章浏览阅读293次。I need a function which compares two PIL images of the same size. Let's call them A and B. The result is supposed to be a new image of the same size. If a pixels is the same in both A and B it's suppo..._python diff.convert("rgb")

Android开发点滴 - 实现层级式导航(API 16+)_android studio层级式导航父页面自左至右出现-程序员宅基地

文章浏览阅读439次。在Jelly Bean(API 16)以前,为了实现顶部的导航菜单,程序员们不得不手工写代码,神马在OnCreate啊,神马onOptionsItemSelected啊,但是,现在一切都是浮云了。你需要做的只是在AndroidManifest中增加那么一小句话,指定父Activity就好了。我们来看下代码:...

react打包项目的时候页面空白_react打包为空白 vite.svg为空-程序员宅基地

文章浏览阅读781次。样式图并且控制台报错解决方法和问题原因路径错误,在weback.json里面添加成功图例个人github:https://github.com/webxingkong如有不正确的地方请指教联系修改,后期将不断更新,谢谢你们的支持..._react打包为空白 vite.svg为空

请查收!顶会AAAI 2020录用论文之知识图谱篇_知识图谱论文好发吗-程序员宅基地

文章浏览阅读5.2k次,点赞4次,收藏29次。2020年人工智能顶级会议AAAI录用的知识图谱领域的研究论文已为您准备就绪,请查收!_知识图谱论文好发吗

推荐文章

热门文章

相关标签