C++程序翻译成C语言程序

C++语言是在C语言的基础上发展过来的,第一个C++的编译器实际上是将C++程序翻译成C原因程序,再通过C语言编译器进行编译。

然而C语言中没有类的概念,只有结构,而且函数还是全局函数,没有类成员函数。在翻译时,将class翻译为struct、对象翻译成结构变量,但是对类的成员函数应该如何翻译,对MyCar.Modify();这样通过一个对象调用成员函数的语句,又该怎么样翻译?

C语言中只有全局函数,因此成员函数被翻译成全局函数:MyCar.Modify()这样的语句也被翻译成普通的调用全局函数的语句。如何让翻译后的Modify全局函数还能够作用在MyCar这个结构变量上?就"引用this"指针。

C++中:

class CCar{public:int price;void SetPrice(int p){price=p;}
};
int main(){CCar car;car.SetPrice(2000);return 0;
}

翻译后的C程序:

Struct CCar{int price;
}
void SetPrice(struct CCar* this,int p){this->price=p;
}
int main(){struct CCar car;SetPrice(&car,2000);return 0;
}

类被翻译成结构体,对象被翻译成结构变量,成员函数被翻译成全局函数。但是在C语言中的全局函数SetPrice比C++中的成员函数SetPrice多一个参数,就是struct CCar *this 。car.SetPrice(2000); 被翻译成SetPrice(&car,2000),后者在执行时,this 形参指向的正是 car 这个变量,因而达到了 SetPrice 函数作用在 car 变量上的效果。

this指针在这里的作用

现在C编译器从本质上来说也是按上面的方法来处理成员函数和对成员函数的调用,即非静态成员函数实际上的形参个数比程序员写的多一个。多出来的参数就是所谓的“this指针”。这个“this指针”指向了成员函数作用的对象,在成员函数执行过程中,正是通过“this指针”才能找到对象所在地址,因而也就能够找到对象的所有非静态成员变量的地址。

#include <iostream>
using namespace std;
class Student{int i;public:void Hello(){cout<<"Hello"<<endl;
};
int main(){A* p=NULL;p->Hello();
}

在程序中,p本来是一个空指针,为何通过p还能调用A的成员函数Hello?因为,参数C++到C程序的翻译,p->Hello()实质上应该是Hello(p),在翻译后的Hello函数中,cout语句没有用到this指针,因此还可以输出结果。如果Hello函数中有对成员变量的访问,则程序会报错。

C++规定,在非静态成员函数内部可以直接使用this关键字,this关键字就代表指向该函数所作用的对象的指针:

#include<iostream>
using namespace std;
class Complex{public:double real,imag;Complex(double r,double i):real(r),imag(i){}Complex AddOne(){this->real++;return *this;}
};
int main(){Complex c1(1,1),c2(2,2);c2=c1.AddOne();cout<<c2.real<<","<<c2.imag<<endl;return 0;
}

this指针的类型是Complex *。因为this指针就指向函数所作用的对象,所以this->rear和real是完全等价的。*this代表函数所作用的对象,进入c2=c1.AddOne()函数后,*this实际上是c1。因此c2值会变得与c1值相同。

因为静态成员函数并不作用于某个对象,所以在其内部不能使用this指针;否则,这个this指针不知道指向何处。

class与struct的区别

从语法上讲,class与struct类型定义有三点区别:

①默认继承权限区别:如果不明确指定,class的继承将会按private继承处理,struct继承会按public继承处理。

②成员默认访问权限:class的成员默认是private权限,struct默认为public权限。

③struct类型名可以同时作为变量名,class不可以。因为class各类型变量定义时直接是类名。而struct是struct+结构体名来定义变量的。

最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点:“class”这个关键字还用于 定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。

C++程序翻译成C语言程序相关推荐

  1. C程序翻译成汇编语言

    求助汇编高手,请把这段C程序翻译成汇编语言, 急! 请汇编高手把这段C程序翻译成汇编语言,并附解释,谢谢!比较急,明天下午选标. #include <reg52.H> #include & ...

  2. python高级语言翻译成机器语言的方式有两种_将高级语言编写的程序翻译成机器语言程序,采用的两种翻译方式是( )。...

    展开全部 正确答案是A, 编译和解释. 原因是:编译和解释是将高级语言636f70793231313335323631343130323136353331333366306466编写的程序翻译成机器语 ...

  3. C翻译汇编语言,[求助]求人帮忙把汇编语言程序翻译成C或者C++

    [求助]求人帮忙把汇编语言程序翻译成C或者C++ 2009-6-17 14:32 8406 [求助]求人帮忙把汇编语言程序翻译成C或者C++ 2009-6-17 14:32 8406 求人帮忙把汇编语 ...

  4. 在 MFC SDI 程序中实现多语言程序界面

    下载: SdiML (34K,Visual C++ 6 项目) 今天举个例子,说说怎样使用 CLanguage 类,在 MFC SDI 程序中实现多语言程序界面. 因为 MFC 包装了一些字符串显示处 ...

  5. C语言C程序的构成,C语言程序的构成.doc

    C语言程序的构成 C语言程序的构成 章 C语言程序的构成 与C++.Java相比,C语言其实很简单,但却非常重要.因为它是C++.Java的基础. 不把C语言基础打扎实,很难成为程序员高手. 一.C语 ...

  6. js利用google翻译接口把网页翻译成各国语言

    js利用google翻译接口把网页翻译成各国语言 网页翻译为德语(Translate Page To German) <a href="javascript: void(window. ...

  7. 三菱A系列程序改成Q系列程序,实例说明 包含原程序与改后的程序,方便对照

    三菱A系列程序改成Q系列程序,实例说明 包含原程序与改后的程序,方便对照 程序里包含模数和数模转换模块,通信模块的应用 控制上包含模拟量控制和简单的PID控制,顺序结构 现工厂PLC升级换代,尤其是A ...

  8. 将py程序封装成exe应用程序

    想把自己写的 python 程序发给别人看,难道要把代码发给别人?但是别人却没有 python 的编译器,那该怎么办呢?那就要将自己写的程序封装成 exe 应用程序,使得在任何电脑上都能运行. 1.首 ...

  9. 8255a初始化c语言程序,8255A的c语言程序.doc

    8255A的c语言程序 8255A的c语言程序 [实例24]用8243扩展I/O端口 #include sbit ContrBit0=P1^0; sbit ContrBit1=P1^1; sbit C ...

最新文章

  1. 前端- jquery- 总结
  2. php文件安全实现方法,php安全下载大文件的实现代码
  3. 杭电2122Ice_cream’s world III
  4. component_春天@Component
  5. 为啥这个月流量,感觉跑得特别快
  6. RMSE、MAE和SD的基本概念
  7. 如何阅读源码学习总结
  8. Python 数据分析 —— Matplotlib ②
  9. mysql 经纬度范围_根据经纬度查询最近距离,mysql查询经纬度附近范围
  10. 电子设计教程3:按键滤波电路
  11. Nginx反向代理服务器解决负责均衡问题
  12. 结构化大数据分析平台设计
  13. 第三名是最危险的名次
  14. duet二重奏hp_《二重奏》Duet
  15. word页眉页码目录
  16. Linux系统Sudo命令的使用说明
  17. ping 192.168.1.1-t命令有什么用?是什么意思?
  18. 复制文本功能兼容 微信ios 火狐浏览器
  19. 2021级-JAVA06 继承和多态、抽象类和接口
  20. 新人培训,前期重点考核项

热门文章

  1. 计组(day5)8086指令系统——算术运算指令(乘除指令)
  2. 具体数学(Concrete Math) 读书笔记
  3. HTTP协议和静态编辑器
  4. MacOS 开发 — 关闭开机自启动软件
  5. Ucloud云的ufile组件使用
  6. 《CSS Secrets》读书笔记(5)
  7. 学Java基础19 字符流 编码表 转换流 字符高效流 对象流 序列化 以及所有的IO流总结
  8. [转]the look of love怀念西京时光~~
  9. 华硕笔记本无法调节屏幕亮度
  10. 新版计算机软件著作权申请详细教程