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(初值),...{} }; )必须要使用初始化表的场景 -->如果有类 类型的成员变量,而该 ...
随机推荐
- mac下的一些命令
1.显示隐藏文件 defaults write com.apple.finder AppleShowAllFiles -bool true 2.隐藏隐藏文件 defaults write com.ap ...
- Qt 串口类QSerialPort 使用笔记
Qt 串口类QSerialPort 使用笔记 虽然现在大多数的家用PC机上已经不提供RS232接口了.但是由于RS232串口操作简单.通讯可靠,在工业领域中仍然有大量的应用.Qt以前的版本中,没有提供 ...
- C#转义字符[转]
C#转义字符: 一种特殊的字符常量 以反斜线"\"开头,后跟一个或几个字符 具有特定的含义,不同于字符原有的意义,故称“转义”字符. 主要用来表示那些用一般字符不便于表示的控制代码 ...
- text-overflow样式属性值ellipsis的用法
一.div标签中使用text-overflow样式属性值ellipsis的方法: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...
- <The Art of Readable Code> 笔记二 (上)
第2章 封装信息到名字 (Packing information into names) 2.1 use specific words GetPage() 不如 FetchPage() 和 Dow ...
- PHP XML Parser函数
PHP XML Parser 函数 PHP XML Parser 简介 XML 函数允许您解析 XML 文档,但无法对其进行验证. XML 是一种用于标准结构化文档交换的数据格式.您可以在我们的 XM ...
- 环境变量之执行文件路径的变量PATH
当我们执行一个命令时,系统会依据PATH的设置去PATH定义的每个目录下查寻该命令的可执行文件,如果在PATH定义的目录中含有多个文件名为我们要执行的命令的可执行文件时,那么先查询到的同名命令先被执行 ...
- OSG 集群渲染 cluster render 支持 Cave 和 powerwall 模式
写了几天.用OSG,实现了集群渲染,感觉还不错,线性加速比还算能够.採用KDTree .八叉树管理场景.场景数据通过UDP和TCP. 不用复制文件,直接在线读取(主节点向渲染节点同步模型数据).效率基 ...
- 37、EnumSet详解
EnumSet类也是有顺序的,EnumSet按照枚举值在Enum类内定义的顺序决定集合元素的顺序 EnumSet在内部已位向量的形式存储,这种存储方式非常紧凑.搞笑,因此EnumSet占用内存很小,而 ...
- ubuntu——主题更新,Ubuntu-tweak安装
1.首先打开终端 2.在终端中输入sudo apt-add-repository ppa:tualatrix/ppa 回车后输入密码等一会,导入密钥 3.再输入sudo apt-get update ...