以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率 。
#include
using namespace std;
/*
函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的
调用
*/
inline void swap(int& a, int& b)
{
int tmp = 0;
tmp = b;
b = a;
a = tmp;
return;
}
如下示例:报错就是因为内联函数定义和声明分离下,执行swap函数时函数被展开成函数体,不再去call函数的地址,因为在链接时候找不到符号表里面call出来的函数地址导致链接错误
swap.cpp
swap.h
test.cpp
随着程序越来越复杂,程序中用到的类型也越来越复杂:
加入auto关键字类似于python语法中的不给数据指定类型,而是自动识别。
auto的使用细则:
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须
加&
#include
#include
using namespace std;
void swap(int &a, int &b)
{
int tmp = 0;
tmp = b;
b = a;
a = tmp;
return;
}
auto ret()
{
auto a = 1.56;
return a;
}
int main()
{
int i = 0;
auto k = i;
/*
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须
加&
*/
auto pk = &k;
auto &ri = i;
void (*pf)(int &, int &) = swap;
int a = 0, b = 1;
pf(a, b);
printf("a = %d b = %d \n", a, b);
printf("%f\n", ret());
return 0;
}
运行结果如下:
当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译
器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量
// 错误示例:
void TestAuto()
{
auto a = 1, b = 2;
auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}
==注意:==auto关键字不能在函数参数中使用:
auto 关键字也有一些限制,其中就是不能在函数的参数中使用。这是因为编译器在编译函数的时候,需要知道函数的参数的类型,以确定函数的签名,分配栈空间,生成调用代码等。如果使用 auto 关键字,编译器就无法确定参数的类型,只有在调用函数的时候,才能根据实参来推导出形参的类型,否则就会导致编译错误。
// 错误示例:
auto ret(auto a)//此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
{
return a;
}
==注意:==auto不能用来直接声明数组:
// 错误示例:
void TestAuto()
{
auto b[] = {4,5,6};// 错误用法
}
在C++98中如果要遍历一个数组,可以按照以下方式进行 :
#include
using namespace std;
int main(void)
{
int array[] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
{
array[i] *= 2;
}
system("pause");
return 0;
}
C++11中引入了基于范围的for循环 :
for循环后的括号由冒号“ :”分为两部分: 第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围
#include
using namespace std;
int main(void)
{
int array[] = {1, 2, 3, 4, 5, 6,7,8,9,10};
for (auto value : array)
{
cout << value << " ";
}
cout << endl;
system("pause");
return 0;
}
在上面的的代码中,将数组中遍历的当前元素拷贝到了声明的变量 value 中,因此无法对数组中的元素进行修改操作,如果需要在遍历过程中修改元素的值,需要使用引用。
#include
using namespace std;
int main()
{
int array[] = {1, 2, 3, 4, 5, 6,7,8,9,10};
cout << "遍历修改之前的数组: ";
for (auto &value : array)
{
cout << value++ << " ";
}
cout << endl << "遍历修改之后的数组: ";
for (auto &value : array)
{
cout << value << " ";
}
cout << endl;
system("pause");
return 0;
}
在上面的的代码中,将数组中遍历的当前元素拷贝到了声明的变量 value 中,因此无法对数组中的元素进行修改操作,如果需要在遍历过程中修改元素的值,需要使用引用。
#include
using namespace std;
int main()
{
int array[] = {1, 2, 3, 4, 5, 6,7,8,9,10};
cout << "遍历修改之前的数组: ";
for (auto &value : array)
{
cout << value++ << " ";
}
cout << endl << "遍历修改之后的数组: ";
for (auto &value : array)
{
cout << value << " ";
}
cout << endl;
system("pause");
return 0;
}