C++ 常成员函数和常对象以及this指针的重要理解
来源:互联网 发布:java中int转date 编辑:程序博客网 时间:2024/05/23 00:03
转自:http://blog.csdn.net/zhuyingqingfen/article/details/31751111
先明确几个概念:
1. 常对象只能调用常成员函数。
2. 普通对象可以调用全部成员函数。
3. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。
4. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。
5. 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;
在X类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对象是不可修改的(即不能对这种对象的数据成员进行赋值操作);
6. 由于this并不是一个常规变量,所以,不能取得this的地址。
如:
- #include <iostream>
- class A
- {
- public:
- A():mValue(0)
- {
- }
- void print()
- {
- std::cout<<"hello";
- }
- int GetValue()
- {
- return mValue;
- }
- int GetValue()const
- {
- return mValue;
- }
- private:
- int mValue;
- };
- void test(A & const a)
- {
- }
- int main()
- {
- const A a;//const A* const this ;
- a.print(); //错误,将会提示 error C2662: “A::print”: 不能将“this”指针从“const A”转换为“A &”
- test(a); //error C2664: “test”: 不能将参数 1 从“const A”转换为“A &”
- }
由于a是const对象,所以a只能调用类A中的常成员函数。
那么为什么会提示:“不能将this指针.......”的语句呢?
因为对于c++的成员函数(当然不是静态成员函数),都会含有一个隐藏的参数,对于上例A中的int GetValue()函数,在编译后会变成:
int GetValue(A * const this); //不能修改this变量,但可以修改this指向的内容,即:this是常量指针。
而对于int GetValue()const ,编译后是:
int GetValue(const A* const this);
只所以this指针是const类型,因为在某次调用整个过程this指向都不允许改变(原因很简单,如果改变的话就不是这个对象调用的了)
从编译后的结果看就很清楚了, 因为a是const,所以其this指针就对应: const A* const this ;
而print函数被编译出来后对应的是void print(A* const this); 在进行参数匹配时, 所以就会提示 “不能将“this”指针从“const A ....."
this指针的出现就解释了,所有类A的对象都是公用一套代码模版,为什么各个对象在调用成员函数的时候不会乱套。
原来C++为成员函数提供了一个名字为this的指针,这个指针称为自引用指针。每当创建一个对象时,系统就把this指针初始化为指向该对象。每当调用一个成员函数时,系统就自动把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数this指针所指向的对象来确定应该引用哪一个对象的数据成员。通常情况下,this指针是隐含存在的,也可以将其显示的表示出来(即如上例中的 this->mValue。不过this指针只能在类中使用)
还有就是 this指针是一个const指针,不能再程序中修改它或给它赋值;
- C++ 常成员函数和常对象以及this指针的重要理解
- C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟
- C++ 常成员函数以及常指针
- 常对象成员和常成员函数
- C++中常对象与常成员函数以及this与成员函数的联系与区别
- c++ 常成员函数 和 常对象
- 常对象和常成员函数
- C++ 常对象和常成员函数
- this指针和常函数
- 常对象 常成员函数 的关系
- C++之常对象,常成员对象,常成员函数,常指针
- C++常成员函数和常对象、对象指针和对象引用
- 常对象 常成员函数
- 常对象+常对象成员+指向对象的常指针+指向常对象的指针变量+对象的常引用
- 对象的常指针和常引用
- 常引用,常对象,常成员函数,常数据成员~
- 非常对象访问常成员函数,导致内部this指针无法访问非常成员函数
- 常对象及常成员及静态数据成员和静态成员函数的学习内容。
- Android中R.java没有自动生成解决方案
- js实现回放拖拽轨迹从过程上进行分析
- Qt中Qstring,char,int,QByteArray之间到转换
- apk,task,进程区别
- C语言中,unsigned与signed类型转换
- C++ 常成员函数和常对象以及this指针的重要理解
- android机顶盒开发问题集
- 黑马程序员_多线程(上)
- JS获取当前日期时间并定时刷新示例
- Android之File存储
- libevent+protobuf轻松搭建tcpserver
- asp中rs.BookMark的使用介绍
- SAP HR人力资源管理
- java基础——ArrayList、LinkedList、Vector