c++初阶篇(三):内联函数及auto关键字
1.内联函数
1.1 概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。
1.2 特性
// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
cout << i << endl;
}
// main.cpp
#include "F.h"
int main()
{
f(10);
return 0;
}
// 链接错误:main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl
f(int)" (?f@@YAXH@Z),该符号在函数 _main 中被引用
1.3 宏与内联
2.auto关键字(C++11)
2.1 auto来源
#include <string>
#include <map>
int main()
{
std::map<std::string, std::string> m{ { "apple", "苹果" }, { "orange",
"橙子" },
{"pear","梨"} };
std::map<std::string, std::string>::iterator it = m.begin();
while (it != m.end())
{
//....
}
return 0;
}
也许可以使用typedef进行重命名,如
#include <string>
#include <map>
typedef std::map<std::string, std::string> Map;
int main()
{
Map m{ { "apple", "苹果" },{ "orange", "橙子" }, {"pear","梨"} };
Map::iterator it = m.begin();
while (it != m.end())
{
//....
}
return 0;
}
但是,在编程时,常常需要把表达式的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的 类型。然而有时候要做到这点并非那么容易,因此C++11给auto赋予了新的含义。
注:
2.2 auto的使用细则
int main() {
int a = 0;
auto x = &a;
auto* y = &a;
auto& z = a;
return 0;
}
int main() {
auto a=1,b=2;
auto x = 1, y = 1.1; //编译报错
return 0;
}
2.3 auto不能推导的场景
1. auto不能作为函数的参数
2. auto不能直接用来声明数组
2.4 基于范围的for循环
int main() {
int arr[] = { 1,2,3,4,5 };
for (auto x : arr) {
cout << x << endl;
}
return 0;
}
对数组元素进行修改
int main() {
int arr[] = { 1,2,3,4,5 };
for (auto& x : arr) {
x++;
}
return 0;
}
注:
3. 指针空值nullptr
void TestPtr()
{
int* p1 = NULL;
int* p2 = 0;
// ……
}
NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
void f(int)
{
cout<<"f(int)"<<endl;
}
void f(int*)
{
cout<<"f(int*)"<<endl;
}
int main()
{
f(0);
f(NULL);
f((int*)NULL);
return 0;
}
注意:
原文地址:https://blog.csdn.net/weixin_58889934/article/details/140585823
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!