C++中常函数内部的this指针也是const类型的
代码中碰到一个奇怪的现象,在同样的函数中调用this指针,结果却有一个无法通过编译
// 读取连接信息
void ThirdWizardPage::ReadConnection()
{
QFile file("oracle.passwd");
if(!file.open(QIODevice::ReadOnly))
{
QMessageBox::information(this, tr("打开文件失败"),
tr("错误原因:%1").arg(file.errorString()));
return;
}
QDataStream in(&file);
Connection con;
int i = ;
while(!in.atEnd())
{
in >> con;
ui->comboBox->insertItem(i, con.strDatabase);
m_mapConnections.insert(i, con);
}
file.close();
} // 写入连接信息
void ThirdWizardPage::WriteConnection() const
{
QFile file("oracle.passwd");
if(!file.open(QIODevice::WriteOnly))
{
QMessageBox::information(const_cast<ThirdWizardPage*>(this),tr("打开文件失败"),
tr("失败原因:%1").arg(file.errorString()));
return;
}
QDataStream out(&file); for(int i = ;i < m_mapConnections.size();++i)
{
out << m_mapConnections[i];
}
file.close();
}
编译的错误提示是:

上面两个函数实现的功能是一个读取文件,一个写入文件,在两个函数中都使用到了QMessageBox::information函数,但是第二个函数中却必须将this指针强制转换成非const才能通过编译,仔细思考这个问题发现,是因为写入文件的函数定义为了常函数,即在函数体的大括号之前使用const修饰该函数。
以前学习C++primer的使用只知道定义为常函数是为了避免该函数修改类对象的成员变量。只是知道如果在常函数中修改了类的成员变量,那么编译时是通不过呢,至于为什么,怎么实现这样的控制的,却是不知道,只记住了怎么用。
下面说一下我自己的分析,众所周知,C++的所有成员函数都会有一个看不见的指针参数传入函数,该指针指向该对象(静态函数除外),那么可以推测,类的成员函数访问成员还是通过指针来访问的,即使有时候我们没有显示的使用this指针,系统也可能为我们默认填上,因为想要操作内存,归根结底还是要知道它存储在哪个位置,所以即便是那些没有指针的语言,我想,也是它的平台为它屏蔽了这些东西,而并不是这些东西不存在(这些东西是指指针)。
如此是否可以得出这样的结论:在常函数中,系统默认传入函数的this指针是const类型的。
那么,这样就可以解释的通了,如果在常函数中修改成员变量(即使不显示使用this指针,系统也会加上,因为要访问内存,必须使用指针),而现在的this指针又是const类型的,那么就会报错了,因此就可以实现限制在常函数中修改成员变量的功能了。
当然,以上全是凭借自己看到的现象以及对编程的一些悟性、理解做出的推测,不知道对不对。不过我的想法是,既然大师能想的出来,而大师也是人,只不过经验多些,所以自己如果思考的多了,也可能会成为大师的,嘿嘿,愿望。
最近开始看深入探索C++对象模型,就是讲C++的对象模型是如何实现的,希望在本书能将自己得出的这个结论验证一下。
C++中常函数内部的this指针也是const类型的的更多相关文章
- python中修改函数内部的变量会发生什么
最近写python遇到个函数内部变量使用外部变量的问题,现在总结下吧 #!/usr/bin/env python a = 100def su(): a = a + 1 print(a) s = su( ...
- C语言中的函数、数组与指针
1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念: 函 ...
- c++函数内部可以返回函数内部定义的指针 但是不能返回函数内部定义的数组
1.返回数组 // demo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> char *m ...
- Javascript中的函数(三)
一:概述 函数是进行模块化程序设计的基础,编写复杂的Ajax应用程序,必须对函数有更深入的了解.JavaScript中的函数不同于其他的语言,每个函数都是作为一个对象被维护和运行的.通过函数对象的性质 ...
- JS OOP -02 深入认识JS中的函数
深入认识JS中的函数: 1.概述,认识函数对象 2.函数对象和其他内部对象的关系 3.将函数作为参数传递 4.传递给函数的隐含参数:arguments 5.函数的apply,call方法和length ...
- 一些C/C++中的函数
项目中使用到的C/C++中的一些函数,记录下来加以理解和掌握. 1.memset( ) memset是计算机中C/C++语言函数.将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASC ...
- c++ 动态判断基类指针指向的子类类型(typeid)
我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 本文提供了两种方法 ( ...
- const指针和指向const的指针
int *const p=&a; 这是const指针,这种指针必须在定义时就给出它所指向的地址,否则会error:uninitialized const 'p'.const指针的指针本身是co ...
- 构造函数和初始化表、this指针与常函数、析构函数、拷贝构造与拷贝赋值(day05)
十四 构造函数和初始化表 ... 初始化表 )语法形式 class 类名{ 类名(形参表):成员变量1(初值),...{} }; )必须要使用初始化表的场景 -->如果有类 类型的成员变量,而该 ...
随机推荐
- 数学图形(2.26) 3D曲线结
我收集的几种曲线结 knot(huit) #http://www.mathcurve.com/courbes3d/noeuds/noeudenhuit.shtml vertices = 1000 t ...
- Orchard运用 - 整合Disqus评论插件
评论对于博客系统那是必须具备的一个功能,Orchard本身也默认实现了评论模块,你可以集成到其他内容,比如博客随笔,不过觉得有点寒碜,样式有点呆板.幸运的是,你可以简单集成第三方评论插件,比如Disq ...
- QT在windows下的安装与配置
先了解Qt: Qt一直以来,分为商业.开源两个版本,商业版本为用户提供了二级制的动态库,直接安装既可以使用,但是需要花钱购买license,而开源版本则遵守GPL协议,提供了源码,用户需要自行编译,才 ...
- go语言基础之普通函数的调用流程
函数调用流程:先调用后返回,先进后出,函数递归,函数调用自己本分,利用此物点 1.普通函数的调用流程 package main //必须 import "fmt" func fun ...
- ArrayList的使用和List<T>的比较
使用非泛型集合类的限制可以通过编写一小段程序来演示,该程序利用 .NET Framework 基类库中的 ArrayList 集合类.ArrayList 是一个使用起来非常方便的集合类,无需进行修改即 ...
- Transformer中引用iqd作为数据源导入报错TR1907与TR3312
好久没和transform接触了,初次接触就给我送了个大礼,在选择好iqd文件执行最后一步导入的时候,要求我对数据源输入用户名密码,我连续输入了三次用户名和密码,在我十分肯定用户名和密码没错的情况下, ...
- Report Studio中目录结构报表浅析
一:场景:在一个报表中如果存在多个页面,每个页面显示不同的数据,如何通过目录控件实现对每一个报表的友好访问呢?下面我们就来看一下下面的效果,如下图1,2 图1:-------------------- ...
- [React] Safely setState on a Mounted React Component through the useEffect Hook
In the class version of this component, we had a method called safeSetState which would check whethe ...
- 想控制GIF图片动画播放吗?试试gifffer.js
在线演示:http://www.gbtags.com/gb/demoviewer/3578/c6bec39a-61ae-4017-8e23-e0bc1eeb740f/example|index.htm ...
- 创建组件“AxLicenseControl”失败
打开以前的程序,准备来添加一个功能,打开主程序就报错: 我未曾改变过版本,原来是由于破解测试需要,修改了系统时间,时间对不了,ArcGIS的问题,改过来就正常了.