【C++自学笔记】从C到C++入门级的小知识(引用、内联函数、auto关键字、范围for循环)

一、引用

1、引用的定义

引用是C++中的一个很重要的概念,引用不是新定义了一个变量,而是给已经存在的变量取了一个别名,实际上编译器并不会为它分配新的内存空间,它和它所引用的变量使用同一块命名空间。

其语法为:类型& 引用变量名(对象名) = 引用实体;

void TestFun() {
	int a = 10;
	int& ra = a;
	cout << a << endl;
	cout << ra << endl;
	cout << &a << endl;
	cout << &ra << endl;
}
int main() {
	TestFun();
	return 0;
}

由此可见 ,二者的值是相同的,地址也是相同的!!!

2、引用的特性

1、引用在定义的时候必须进行初始化;

2、一个变量可以有多个引用;

3、引用一旦拥有一个实体之后,就不能在引用别的其他实体;

void TestFun(){
    int a = 10;
    //int ra&;   //这句话是错误的!引用定义时必须进行初始化
    int& rra = a;
    int& rrra = a;
}

3、常引用

//常引用
void TestFun() {
	const int a = 10;
	//int& ra = a;
	const int& ra = a;
}

4、引用的使用场景

1、做参数

//引用作为参数
void Swap(int& a,int& b) {
	int temp = a;
	a = b;
	b = temp;
}

2、做返回值

int& TesrFun1(int& a) {
	a += 10;
	return a;
}

3、一段有意思的代码!!!

int& Add(int a,int b) {
	int c = a + b;
	return c;
}
int main() {
	int& ret = Add(1,2);
	Add(3, 4);
	cout << ret << endl;
	system("pause");
	return 0;
}

结果等于  7 !!! 而不是 3 !!!

详情参考:https://blog.csdn.net/qq_40550018/article/details/81225519

注意:如果函数返回时,离开函数作用域后,其栈上空间已经还给系统,因此不能用栈上的空间作为引用类型返回。如果以引用类型返回,返回值的声明周期必须不受函数的限制(即比函数生命周期长);

5、引用和指针的区别

  • 引用在定义的必须初始化,指针没有要求;
  • 引用在初始化引用一个实体之后,就不能在引用第二个实体,而指针可以在任何时候指向任何一个同类型的实体;
  • 没有NULL引用,但是有NULL指针;
  • 在sizeof中含义不同:引用结果为所引用的实体类型的大小,但是指针始终是地址空间所占字节个数(32位系统下占4个字节);
  • 引用自增加即引用的实体自增加,指针则是在原指针所指向的位置向后偏移一个位置;
  • 有多级指针,但是没有多级引用;
  • 访问实体的方式不同,指针需要显示解引用,引用则由编译器自行处理;
  • 引用比指针使用起来相对安全;

二、内联函数

在C++中以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,属于一种以空间换时间的当时,提升了程序允许的效率;

注意:因为内联函数是在函数调用的地方进行展开,以空间换时间,所以代码很长或者有循环/递归的函数不适宜使用内联函数。当然这种情况,编译器有的时候也会进行自动优化,比如如果定义位inline的函数体内有循环/递归等,编译器优化时会忽略掉内联。

三、auto关键字(C++11)

auto这个关键字在早期的版本中:使用auto修饰的变量,都是具有自动存储功能的局部变量;

C++11:auto不再是一个存储类指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

我们看一段代码就可以直到,auto的神奇用法:

int Test() {
	return 10;
}
int main() {
	int a = 10;
	auto b = a;
	auto c = 'a';
	auto d = Test();
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;
	cout << typeid(d).name() << endl;
	return 0;
}

但是auto也有几个非常值得注意的地方:

  • auto在定义变量的时候必须对其进行初始化,auto他并非是一种“类型”的声明,而是一个占位符,编译器会在编译期间把他替换成变量的实际类型;
  • auto不能作为函数的参数使用,因为编译器无法对函数参数的实际类型进行推导;0

四、基于范围的for循环(C++11)

for循环后的括号由冒号“:”分为两个部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围;

int main() {
	//遍历一个数组
	int array[] = {1,2,3,4,5,6,7,8,9};
	for (auto e : array)
		cout << e << "";
	cout << endl;
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_ClivenZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值