C++学习(19)

#学习自用#

当我们编译C++文件时,首先预处理器会过一遍所有带# 的语句(预编译指令符号),然后进行文本替换。

#include<iostream>
using namespace std;
#define  SQUARE(X) X*X

int main()
{
	int a = SQUARE(5);
	cout << a << endl;

	int b = SQUARE(2 + 3);
	cout << b << endl;

	cin.get();
}

这里写了一个宏来实现数的平方,注意X是参数符号标记并不是真正的传参,宏虽然看起来像函数但并不是传递参数来实现的,只是简单的文本替换,b=2+3*2+3,所以a,b的结果不相同。

宏并不适合拿来写函数,容易发生一些不容易察觉的错误,比如上面代码中b的结果,更麻烦的是宏是在预处理阶段进行的文本替换,并不能添加断点调试,这就导致宏引发的错误更难以发现。

在宏定义中不一定所有语句都得写在同一行,可以使用 \来实现多行的书写。反斜杠后面一定不能有空格!!!(有空格就是对空格的转义而不是对换行的)

auto

#include<iostream>
int main()
{
	auto a = 5;
	auto b = "odd";
	auto c =5.0f ;
	cin.get();
}

从这段代码可以看出,我们不需要特别关注类型,auto可以让变量自动对应上其赋值的类型。当变量类型比较简单时用auto会导致代码可读性下降,所以auto一般都运用在类型名过长(无须映射)和不知道类型的情景下。

既然auto可以根据输入的类型自定义的改变参数类型,那么它是否可以用在函数的形参,实现像模板那样的函数复写功能呢?这是不行的!!!在C++中,函数参数需要明确指定类型,以便编译器进行类型检查和错误处理,确保正确的行为。

array

array是静态数组,与vector不同array不能改变设定的元素个数,语法为 std::array<类型,元素个数>数组名,可以像访问数组那样访问它,array与c语言中的数组差别不大,都是储存在栈上。

#include<iostream>
#include<string>
#include<array>
using namespace std;
int main()
{
	array<int, 5>data;
	data[0] = 0;

	int dataold[5];
	dataold[0] = 0;

	cin.get();
}

相比于c风格的数组,array增加了一层调试,可检查数组是否越界,可记录数组大小,没有性能损失。

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值