this指针------新标准c++程序设计
背景:
c++是在c语言的基础上发展而来的,第一个c++的编译器实际上是将c++程序翻译成c语言程序,然后再用c语言编译器进行编译。c语言没有类的概念,只有结构,函数都是全局函数,没有成员函数。翻译时,将class翻译成struct、对象翻译成结构变量是显而易见的,但是对类的成员函数应该如何翻译?对“my.modify();”这样通过一个对象调用成员函数的语句,又该如何翻译呢?
c语言只有全局函数,因此成员函数只能被翻译成全局函数;“my.modify();”这样的语句也只能翻译成普通的调用全局函数的语句。那如何让翻译后的modify全局函数还能作用在my这个结构变量上呢?答案是引入“this指针”。
示例:
下面来看一段c++程序到c程序的翻译。
c++程序:
class CCar{
public:
int price;
void SetPrice(int p);
};
void CCar::SetPrice(int p){
price=p;
}
int main(){
CCar car;
car.SetPrice(20000);
}
翻译后的c程序:
struct CCar{
int price;
};
void SetPrice(CCar* this,int p){
this->price=p;
}
int main(){
struct CCar car;
SetPrice(&car,20000);
}
可以看出,类被翻译成结构体,对象被编译成结构变量,成员函数被翻译成全局函数。但是c程序的全局函数SetPrice比c++的成员函数SetPrice多了一个参数,就是“CCar*this”。“car.SetPrice(20000);”被翻译成“SetPrice(&car,20000);”,后者在执行时,this形参指向的正是car这个变量,因而达到了SetPrice函数作用在car变量上的效果。
this指针的作用:
实际上,现在的c++编译器从本质上来说也是按上面的方法来处理成员函数和对成员函数的调用的,即非静态成员函数实际上的形参个数比程序员写的多一个。多出来的参数就是所谓的“this指针”。这个”this指针“指向了成员函数作用的对象,在成员函数执行的过程中,正是通过“this指针”才能找到对象所在的地址,因而也就能找到对象的所有非静态成员变量的地址。
示例:
#incldue<iostream>
using namespace std;
class A{
int i;
public:
void Hello(){cout<<"hello"<<endl;}
}; int main(){
A*p=NULL:
p->Hello();
}
程序的输出结果是:
hello
在上面的程序中,p明明是一个空指针,但它还是能正确调用A的成员函数Hello,因为,参考上面c++到c程序的白泥臆,“p->Hello()”实质上应该是“Hello(p)”,在翻译后的Hello函数中,cout语句没有用到this指针,因此依然可以输出结果。如果Hello函数中有对成员变量的访问,则程序就会出错。
this指针的使用:
c++规定,在非静态成员函数内部可以直接使用this关键字,this就代表指向该函数所作用的对象的指针。
示例:
#include<iostream>
using namespace std;
class A{ public:
double real,imga;
A(double r,double i):real(r),imga(i){}
A addone(){
this->real++;
return *this;
}
}; int main(){
A c1(1,1),c2(0,0);
c2=c1.addone();
cout<<c2.real<<","<<c2.imga<<endl;
}
输出为 2,1
第9行,this指针的类型是A*。因为this指针就指向函数所作用的对象,所以this->real和real是完全等价的。“*this”代表函数所作用的对象,因此执行第16行,进入addone函数后,“*this”实际上就是c1。因此c2的值会变得和c1相同。
注意:
因为静态成员函数并不作用于某个对象,所以在其内部不能使用this指针。
新标准c++程序设计
转发请注明出处
this指针------新标准c++程序设计的更多相关文章
- 指针和动态分配内存 (不定长度数组)------新标准c++程序设计
背景: 数组的长度是定义好的,在整个程序中固定不变.c++不允许定义元素个数不确定的数组.例如: int n; int a[n]; //这种定义是不允许的 但是在实际编程中,往往会出现要处理的数据数量 ...
- 正确处理类的复合关系------新标准c++程序设计
假设要编写一个小区养狗管理程序,该程序需要一个“主人”类,还需要一个“狗”类.狗是有主人的,主人也有狗.假定狗只有一个主人,但一个主人可以有最多10条狗.该如何处理“主人”类和“狗”类的关系呢?下面是 ...
- 在成员函数中调用虚函数(关于多态的注意事项)------新标准c++程序设计
类的成员函数之间可以互相调用.在成员函数(静态成员函数.构造函数和析构函数除外)中调用其他虚成员函数的语句是多态的.例如: #include<iostream> using namespa ...
- 多态实现的原理------新标准c++程序设计
“多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类还是派生类的函数,运行时才确定.例子: #include<iostream> using namespac ...
- 类的互相包含------新标准c++程序设计
#include<iostream> using namespace std; class A; class B{ public: void f(A* pt){}; } class A{ ...
- 多态的作用-游戏编程展示------新标准c++程序设计
游戏软件的开发最能体现面向对象设计方法的优势.游戏中的人物.道具.建筑物.场景等都是很直观的对象,游戏运行的过程就是这些对象相互作用的过程.每个对象都有自己的属性和方法,不同对象也可能有共同的属性和方 ...
- 类与类之间的两种关系------新标准c++程序设计
在c++中,类和类之间有两种基本关系:复合关系和继承关系. 复合关系也称为“has a”关系或“有”的关系,表现为封闭类,即一个类以另一个类的对象作为成员变量. 继承关系也称为“is a”关系或“是” ...
- 复制构造函数被调用的三种情况------新标准c++程序设计
1.当用一个对象去初始化同类的另一个对象时,会引发复制构造函数被调用.例如,下面的两条语句都会引发复制构造函数的调用,用以初始化c2. C c2 (c1); C c2=c1; 这两条语句是等价的.注意 ...
- 析构函数的调用------新标准c++程序设计
示例1: #include<iostream> using namespace std; class CDemo{ public: ~CDemo(){cout<<"d ...
随机推荐
- C#一个判断子串在父串中出现的次数
/// <summary> /// 计算字符串中子串出现的次数 /// </summary> /// <param name=”str”>字符串</param ...
- C#三层架构实例
对于三层的概念查也查了,看也看了,下面是我找的一个关于三层的简单实例,真正看一下它是如何具体实现的. 我们先来一起看看 实体类-Model 实质:实体类就是在完成数据库与实体类对应的功能,一个类是一张 ...
- Nginx反向代理图片总结
配置需求: 内网192.168.80.205的机器上部署了一个Web项目,下文称web, url为http://192.168.80.205:8082. 并且使用nginx访问图片,url格式 ...
- 基本的Ceph性能测试工具和方法
测试环境 1. 测试准备 1.1 磁盘读写性能 1.1.1 单个 OSD 磁盘写性能,大概 165MB/s. root@ceph1:~# echo 3 > /proc/sys/vm/drop_c ...
- 1.solr学习速成之配置文件
什么是solr Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过H ...
- leetcode717
class Solution { public: bool isOneBitCharacter(vector<int>& bits) { int len = bits.size() ...
- 通过class类获取类的方法信息
测试:
- 2-2+CPU多级缓存-乱序执行优化
- Codeforces 919F——A Game With Numbers
转自大佬博客:https://www.cnblogs.com/NaVi-Awson/p/8405966.html; 题意 两个人 Van♂ 游戏,每人手上各有 8'>88 张牌,牌上数字均为 [ ...
- Tensorflow CPU mask-rcnn 训练模型
基于cpu版的tensorflow ,使用mask_rcnn训练识别箱子的模型 代码参考(https://blog.csdn.net/disiwei1012/article/details/79928 ...