C++基础知识
内联函数
用inline修饰的函数叫做内联函数:
inline int add(int a, int b){ //简单内联函数
return a + b;
}
inline int fun1(int n){ //较为复杂
for (int i = 1; i < n; ++i)
n += i*n / (i + 1)*n;
return n;
}
void test2(){
int a = add(10, 20); //实际编译时: int a=10+20
int n = 10000;
n = fun1(n); //过于复杂的时候,使用内联函数也是没有效果的
}
特性:
1.inline就是利用空间换取时间,省去了函数的开销,在代码很长或者存在循环或者递归的时候就不适宜使用内联函数.
2.inline 只是对编译器提出的一个建议,然后编译器会自己选择是否对目标函数进行优化.
3.inline不建议声明和定义分离
auto关键字
用我的话来总结,auto 就是一个万能的变量类型名,类似于一个指示符,在你将你想传入的参数直接利用auto传入的时候,它会自动隐式的转成所对应的类型存储起来!
知识点 :typeid(变量).name() 将需要显示的类型显示出来
使用规则:
1.在使用auto声明指针变量的时候,使用auto和auto* 没有区别,但是在声明的时候,必须要进行取地址的操作,如:auto&
2.在一行中定义多个变量的时候,必须是相同类型的,否则编译器会报错.
void test1(){
//auto: 自动类型推导(自动识别你输入数据的类型)
//相当于一个类型的调用符
auto a = 10;
auto b = 2.0;
auto c = 'a';
auto d = 'a' + b;
//定义指针:都可以,因为你可以从右边的&符号看出来
auto pa = &a; //指针
auto* pb = &a;
//定义引用:必须加&
auto& rc = b;
auto f = b;
int j, k, l;
//auto a = 10, b = 60, c = 'a'; //报错,同一行必须是同一个类型
cout << typeid(a).name() << endl; //显示出类型
cout << typeid(b).name() << endl; //同样的操作
cout << typeid(c).name() << endl;
cout << typeid(d).name() << endl;
cout << typeid(pa).name() << endl;
cout << typeid(rc).name() << endl;
cout << typeid(f).name() << endl;
}
主要在于理解,不懂的话就多写代码尝试一下.
基于范围的for循环
对于我们现在敲的代码来说,在很多情况中我们都没有必要来说明所在的范围,所以我们这里就引入了一个新的范围for,可以不必在乎所在的范围,将整个需要循环的直接循环.
范围for: 当前的数据 : 循环的范围
void test3(){
//====这个时我们普通的循环方式
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i){
cout << arr[i] << " ";
}
cout << endl;
//范围for: 当前的数据 : 循环的范围
//只是循环的条件发生了变化,其他的都是一样的
for ( int& e : arr){ //如果在这里加了const 则值不会被修改,后面的赋值也没有办法
cout << e << " ";
//e = 10; //在第一次循环后,其对应的值被修改成了全10,
//所以如果后面需要重新循环的时候,其所包含的值为全10
//但是如果你在对应的变量之前加上const .他就会变成固定的,无法改变
}
cout << endl;
for (int e : arr){
cout << e << " ";
}
cout << endl;
for (const auto& e : arr){
cout << e << " ";
}
}
在数组作为参数的时候,数组名会退化成指针,范围是无法确定的,故----不能使用范围for
void fun(int arr[], int n){
for (const auto& e : arr){ //数组作为参数不能使用范围for
cout << e << " ";
}
cout << endl;
}
没有太多的理解,只要掌握了范围for并且能灵活运用就可以了.
指针空值
NULL其实就是0,在预处理的时候,它会被宏自动的替换.
当你在直接使用fun(NULL),的时候,因为NULL指的是0,所以就会调用第一个的整型,当你需要调用第二个指针类型的时候,就需要fun((int*)NULL)或者fun(nullptr),这两个操作其实是等效的,都可以用来调用指针的类型!
这里的 nullptr 指的就是 指针空值
//上面两个fun为所引入变量不同的函数
void fun(int a){
cout << "fun(int)" << endl;
}
void fun(int* a){
cout << "fun(int*)" << endl;
}
void test(){
int* p = NULL; //在预处理的时候,宏替换: int* p=0;
int* p2 = 0;
fun(NULL); //在为空的时候,编译器会有限将NULL转换成整型,而不是指针类型
fun((int*)NULL);//==
fun(nullptr); //建议使用下面的这个方式
cout << typeid(nullptr).name() << endl; //输出nullptr对应的类型,前面讲过
}
对于今天讲的还是一些关于C++的基础知识,大家多理解多吸收吸收,就能懂的! 多敲代码!!!