cpp学习日记7(只是记录给未来的自己看的)

C++的宏

#开头的都是预处理器去处理的

当我们编译c++代码时,预处理器会过一遍所有你看到的语句,这个阶段基本上是一个文本编辑阶段,就像遍历我们的代码然后执行查找和替换(也可以用形参,实参和变量这些来查找和替换)(模板的工作时间在这个的后面),是纯文本替换。

#define WAIT std::cin.get();
#define KK {

int main() KK//KK就是{
	WAIT //不需要;,因为上面已经有了
}

关于一些其他用法

#define Log(x) std::cout<<x<<std::endl

int main() {
	Log("hello");//这里的x就是hello了
	std::cin.get(); 
}

当然,这些用法并不怎么实用,下面会有一个真正实用的用法

首先,在debug解决方案配置下定义PR_DEBUG,对应的,在release配置下定义PR_RELEASE
在这里插入图片描述
在这里插入图片描述
然后修改代码的日志宏定义

#ifdef  PR_DEBUG//即,处于debug模式下才成立
#define Log(x) std::cout<<x<<std::endl //宏定义是输出日志
#else//非debug模式是这个
#define Log(x) //宏定义是无
#endif //  PR_DEBUG



int main() {
	Log("hello");//这里的x就是hello了
	std::cin.get(); 
}

这样子,就可以不修改代码还能避免发布版本会给用户看日志了

C++的 auto关键字

auto实际含义非常简单,是一个提示符,提示编译器根据变量的值来推导变量的类型。而这里,会主要讨论怎么使用它的问题。

int main() {
	auto a = 5;
	auto b = a;
	std::cin.get(); 
}

如果你有了auto,你还需要写类型吗?能不能到处都用auto呢?
这是一个关于编程风格的问题。
比如,你使用了一个带返回值的api,如果你用auto去接受返回值,那么当某一天返回值类型改变了的时候,就不需要修改这一行代码,你甚至可能不知道返回值已经改变了。但是,它可能会破坏其他的依赖于特定类型的代码,你同意也可能不知道咋错了为什么错了(。而如果你不用auto,一方面你会因为返回值的修改而修改你的代码,但是,你不仅能知道错哪了还可能因为类型转换而不需要考虑这个问题。

总的来说,对于某些较长或较奇怪的数据类型,可交给编译器自行推导,这样使代码更简洁。另外,当你也不知道类型的时候,也可以使用auto,最后,要传引用时在后面加&,比如const auto&。

C++的静态数组(std array)

静态数组指大小不会增长的数组。


int main() {
	std::array<int, 50> data;//和c语言风格的数组一样
	data[0] = 2;
	data.size();//可以直接访问大小

	std::cin.get(); 
}

他并不会带太多性能开销,比如size函数,因为是模板实现,他的源代码就是返回一个直接你给的(比如50),事实上就是return 50(在这个例子里),所以基本上不会有什么性能开销。
同时,他还有许多好用的功能。

C++函数指针

这一节讲的是原始风格的函数指针,来自于C语言。
函数指针,是将一个函数赋值给一个变量的方法。

#include<iostream>
#include<string>

void foo(std::string testStr)
{
	std::cout << testStr << std::endl;
}
int main()
{
	std::string testStr = "hellsassasao";

	//第一种函数指针,auto来表示
	auto foo1 = foo;
	foo1(testStr);

	//第二种,函数指针变量,其中
	void(*funcsuibianqude)(std::string);
	funcsuibianqude = foo;
	funcsuibianqude(testStr);

	//第三种,改变第二种的形式,表现得更自然一些
	typedef void(*suibianqu)(std::string);
	suibianqu suibian = foo;
	suibian(testStr);
}

#include<iostream>
#include<vector>

void PrintValue(int value)
{
	std::cout << "value: " << value << std::endl;
}
void ForEach(const std::vector<int>& values, void(*suibian)(int))
{
	for (int val : values)
	{
		suibian(val);
	}
}
int main()
{
	std::vector<int> values = { 1,5,4,2,3 };
	ForEach(values, PrintValue);//给函数传递函数
	ForEach(values, [](int value) {std::cout << value << std::endl; });//你甚至可以
	//直接传一个lambda表达式

	std::cin.get();
}

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值