C++ 对象模型学习笔记六: 程序转化语义

  我们写的代码,编译器会对代码进行拆分,拆分成编译器更容易理解和实现的代码。看一看编译器是如何解析这些代码的。下面实例会站在程序员角度 / 站在编译器角度看代码。

测试代码如下:

// 该实例演示 站在程序员角度/站在编译器角度 看代码
// 下面有的代码是演示编译器工作流程,属于伪代码

#include <iostream>
#include <time.h >

using namespace std;

class X
{
public:
	int m_i;
	X(const X &tmpx)
	{
		m_i = tmpx.m_i;
		cout << "拷贝构造函数被调用" << endl;
	}
	X()
	{
		m_i = 0;
		cout << "构造函数被调用" << endl;
	}
	~X()
	{
		cout << "析构函数被调用" << endl;
	}
	void functest()
	{
		cout << "functest()被调用" << endl;
	}
};

void func1cxy(X tmpx)
{
	return;
}

//老编译器看func1cxy(老编译器角度)
void func1byq(X &tmpx)
{
	return;
}

//人类视角
X func2cxy()
{
	X x0;
	//....
	return x0;   //系统产生临时对象并把x0的内容拷贝构造给了临时对象。
}

//编译器角度的func2cxy
void func2byq(X &extra)
{
	X x0; //从编译器角度,这行不调用X的构造函数
		  //...
		  //...
	extra.X::X(x0);
	return;
}

int main()
{
	//(1)定义时初始化对象
	//---- 程序员视角
	cout << "定义的时候初始化 ----------程序员视角" << endl;
	X x0;            // 调用构造函数
	x0.m_i = 15;

	X x1 = x0;       // 调用拷贝构造函数
	X x2(x0);        // 调用拷贝构造函数
	X x3 = (x0);     // 调用拷贝构造函数

	//---- 切换到编译器角度,编译器会拆分成两个步骤(编译器视角)
	cout << "定义的时候初始化  ----------编译器视角" << endl;
	//X x100 = (x0)  编译器的角度 这一行拆分成下面两行
	//X x100;           //步骤一:定义一个对象,为对象分配内存。从编译器视角来看,这句是不调用X类的构造函数。
	//x100.X::X(x0);    //步骤二:直接调用对象的拷贝构造函数去了

	//(2)参数的初始化(程序员视角/现代编译器)
	cout << "参数的初始化 ----------程序员视角/现代编译器" << endl;
	X x6;  //调用构造函数
	func1cxy(x6);   // 拷贝构造函数 析构函数 析构函数
	cout << "参数的初始化 ----------老编译器视角" << endl;
	//老编译器视角 上面的两行代码转换为下面d代码
	//X tmpobj; //编译器产生一个临时对象
	//tmpobj.X::X(x0); //调用拷贝构造函数
	//func1byq(tmpobj); //用临时对象调用func
	//tmpobj.X::~X(); //func()被调用完成后,本析构被调用。

	//(3)返回值初始化(程序员角度)
	cout << "返回值初始化 ----------程序员视角" << endl;
	X my = func2cxy(); //调用构造函数 拷贝构造函数 析构函数  析构函数

	cout << "返回值初始化 ----------编译器角度" << endl;
	//编译器对上述代码的理解(编译器角度)
	//X my; //不会调用X的构造函数
	//func2byq(my);

	//人类视角
	cout << "返回值初始化 ----------程序员视角" << endl;
	func2cxy().functest();

	cout << "返回值初始化 ----------编译器角度" << endl;
	//切换到编译器视角
	//X my; //不会调用X的构造函数
	//(func2byq(my), my).functest(); //逗号表达式:先计算表达式1,再计算表达式2,整个逗号表达式的结果是表达式2的值;


	//程序员视角
	cout << "返回值初始化 ----------程序员视角" << endl;
	X(*pf)(); //定义个函数指针
	pf = func2cxy;
	pf().functest();

	//编译器视角
	cout << "返回值初始化 ----------编译器角度" << endl;
	//X my; //不调用构造函数
	//void(*pf)(X &);
	//pf = func2byq;
	//pf(my);
	//my.functest();

	system("pause");

	return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值