初识C++(二)

1、程序预处理

程序预处理就是对编写的程序文本格式进行处理,生成最终的可执行程序,假设现有一个test.cpp文件,下面将介绍程序预处理过程。

(1)头文件展开(拷贝头文件中的内容)和命名空间的展开有很大区别 -> 宏定义的替换 -> 去掉注释(换成空格) -> 条件编译(处理源代码中含有#ifdef的命令)-> 生成test.i文件。

(2)编译代码 -> 检查语法 -> 生成汇编代码(指令级代码)-> 生成test.s文件。

(3)汇编 -> 将汇编代码生成二进制文件 -> 生成test.o文件(CPU能直接识别的二进制代码)。

(3)链接 -> 合并链接(将多个目标文件合并成一个可执行文件)-> 生成a.out/xxx.exe文件。

*注C++在编译过程中对函数名进行修饰时会把函数中的形参类型考虑进来,而C语言不能,因此C++中能构成函数重载,而C语言不能。

2、引用

引用并不是新定义一个变量,而是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间(程序中表达形式:参数类型+&+别名=引用实体)。

要求:(1)引用在定义时必须初始化。

(2)一个变量可以有多个引用。

(3)引用一旦引用一个实体,再不能引用其它实体。

int main() {
	int a = 10;
	int& b = a;//对a取别名为b
	int& c = a;
	int& d = b;
	return 0;
}

2.1传引用传参

直接将原参数传递到函数中,函数中可以直接访问和修改原参数,无需在函数中重新建立栈帧。

#include<iostream>
void Swap(int& a, int& b) {
	int tmp = a;
	a = b;
	b = tmp;
}
using std::cout;
using std::endl;
int main() {
	int m = 10, n = 20;
	Swap(m, n);
	cout << m << "  " << n << endl;
	return 0;
}

优点:(1)传引用传参相当于直接传递实参,不需要建立栈帧和参数拷贝从而传参效率高。

(2)很适合输出型参数使用(在函数中需要直接提取的数据,在形参中修改时,实参也会跟着变,这种引用参数可以直接在函数中赋值我们所需要的结果)。

2.2传引用返回

作为函数返回值引用时,返回的变量不会建立临时拷贝然后返回,而是直接将变量本身直接返回。

struct SeqList
{
	int a[10];
	int size;
};
//ps为s的别名
int& SLAT(struct SeqList& ps, int i)
{
	assert(i < ps.size);
	return (ps.a[i]);//该返回对象出了函数作用域还在,因此可以使用引用返回
}
int main()
{
	struct SeqList s;
	s.size = 1;
	SLAT(s, 0) = 10;//直接修改函数返回值
	cout << SLAT(s, 0) << endl;
	return 0;
}

优点:(1)提高效率。

(2)可以直接修改函数返回值变量。

2.3常引用(const+类型+&+别名)

常引用权限只能平移和缩小,不能放大。

int main() {
	const int a = 10;
	int c = 20;
	const int& b = a;//不能写成int& b = a;
	const int& d = c;
	return 0;
}

另外,数据类型之间发生转换时会先生成临时变量(具有常性),然后再赋值,因此要使用常引用形式。

int main() {
	int a = 10;
	const double& b = a;//不能直接写成double& b = a;
	return 0;
}

3.引用和指针区别

        在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间,但是在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

引用指针
概念上定义一个变量的别名
存储一个变量地址
在定义时必须初始化
无要求
初始化时引用一个实体后,就不能再引用其他实体
在任何时候指向任何一个同类型实体
没有NULL引用
有NULL指针
在sizeof运算中引用结果为引用类型的大小
在sizeof运算中指针始终是地址空间所占字节个数(32bit平台为4,64bit平台为8)
自加即引用的实体增加1
自加即指针向后偏移一个类型的大小
没有多级引用
有多级指针
访问实体方式时,编译器自己处理
访问实体方式时,需要显式解引用
引用比指针使用起来相对更安全

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值