C++中常函数内部的this指针也是const类型的
2014-08-18 11:41
176 查看
代码中碰到一个奇怪的现象,在同样的函数中调用this指针,结果却有一个无法通过编译
编译的错误提示是:
上面两个函数实现的功能是一个读取文件,一个写入文件,在两个函数中都使用到了QMessageBox::information函数,但是第二个函数中却必须将this指针强制转换成非const才能通过编译,仔细思考这个问题发现,是因为写入文件的函数定义为了常函数,即在函数体的大括号之前使用const修饰该函数。
以前学习C++primer的使用只知道定义为常函数是为了避免该函数修改类对象的成员变量。只是知道如果在常函数中修改了类的成员变量,那么编译时是通不过呢,至于为什么,怎么实现这样的控制的,却是不知道,只记住了怎么用。
下面说一下我自己的分析,众所周知,C++的所有成员函数都会有一个看不见的指针参数传入函数,该指针指向该对象(静态函数除外),那么可以推测,类的成员函数访问成员还是通过指针来访问的,即使有时候我们没有显示的使用this指针,系统也可能为我们默认填上,因为想要操作内存,归根结底还是要知道它存储在哪个位置,所以即便是那些没有指针的语言,我想,也是它的平台为它屏蔽了这些东西,而并不是这些东西不存在(这些东西是指指针)。
如此是否可以得出这样的结论:在常函数中,系统默认传入函数的this指针是const类型的。
那么,这样就可以解释的通了,如果在常函数中修改成员变量(即使不显示使用this指针,系统也会加上,因为要访问内存,必须使用指针),而现在的this指针又是const类型的,那么就会报错了,因此就可以实现限制在常函数中修改成员变量的功能了。
当然,以上全是凭借自己看到的现象以及对编程的一些悟性、理解做出的推测,不知道对不对。不过我的想法是,既然大师能想的出来,而大师也是人,只不过经验多些,所以自己如果思考的多了,也可能会成为大师的,嘿嘿,愿望。
最近开始看深入探索C++对象模型,就是讲C++的对象模型是如何实现的,希望在本书能将自己得出的这个结论验证一下。
// 读取连接信息 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 = 0; 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 = 0;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/c++笔试题——const类型的成员函数内部如何改变成员变量
- c/c++笔试题——const类型的成员函数内部如何改变成员变量
- c/c++笔试题——const类型的成员函数内部如何改变成员变量
- C++点滴——const/volatile不能用来修饰没有this指针的成员函数
- 【C++】const、volatile不能修饰没有this指针的成员函数
- C++中的成员函数调用原理及this指针的传递方式
- C#中调用C++的dll的参数为指针类型的导出函数
- C/C++ 指针 数组 const 函数
- 改变 javascript 函数 内部 this 指针 指向 的三种方法
- C++强制转换不同声明或类型的函数指针隐患
- 【转】C++函数——指针和引用类型的参数传递
- c++数据类型--指针、字符串、const、引用
- C++特性探寻-继承、成员函数、this指针
- C++中的const关键字系列——常类型与常指针之间的纠缠
- 为什么要用this指针,为什么是const类型的
- C++向函数模版传递 const类型,数组类型
- 理解复杂的C/C++声明 const, typedef , 函数指针
- 成员函数中隐含的this指针的类型
- 条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用 (转自effective c++ second edition)
- 理解复杂的C/C++声明 const, typedef , 函数指针