C++--基础知识--内联函数--auto关键字--基于范围的for循环--指针空值

女爷i 2022-11-04 13:27 256阅读 0赞

C++基础知识

  • 内联函数
    • 特性:
  • auto关键字
  • 基于范围的for循环
  • 指针空值

内联函数

inline修饰的函数叫做内联函数:
在这里插入图片描述

  1. inline int add(int a, int b){ //简单内联函数
  2. return a + b;
  3. }
  4. inline int fun1(int n){ //较为复杂
  5. for (int i = 1; i < n; ++i)
  6. n += i*n / (i + 1)*n;
  7. return n;
  8. }
  9. void test2(){
  10. int a = add(10, 20); //实际编译时: int a=10+20
  11. int n = 10000;
  12. n = fun1(n); //过于复杂的时候,使用内联函数也是没有效果的
  13. }

特性:

1.inline就是利用空间换取时间,省去了函数的开销,在代码很长或者存在循环或者递归的时候就不适宜使用内联函数.

2.inline 只是对编译器提出的一个建议,然后编译器会自己选择是否对目标函数进行优化.

3.inline不建议声明和定义分离

auto关键字

用我的话来总结,auto 就是一个万能的变量类型名,类似于一个指示符,在你将你想传入的参数直接利用auto传入的时候,它会自动隐式的转成所对应的类型存储起来!

知识点 :typeid(变量).name() 将需要显示的类型显示出来

使用规则:

1.在使用auto声明指针变量的时候,使用autoauto* 没有区别,但是在声明的时候,必须要进行取地址的操作,如:auto&

2.在一行中定义多个变量的时候,必须是相同类型的,否则编译器会报错.

  1. void test1(){
  2. //auto: 自动类型推导(自动识别你输入数据的类型)
  3. //相当于一个类型的调用符
  4. auto a = 10;
  5. auto b = 2.0;
  6. auto c = 'a';
  7. auto d = 'a' + b;
  8. //定义指针:都可以,因为你可以从右边的&符号看出来
  9. auto pa = &a; //指针
  10. auto* pb = &a;
  11. //定义引用:必须加&
  12. auto& rc = b;
  13. auto f = b;
  14. int j, k, l;
  15. //auto a = 10, b = 60, c = 'a'; //报错,同一行必须是同一个类型
  16. cout << typeid(a).name() << endl; //显示出类型
  17. cout << typeid(b).name() << endl; //同样的操作
  18. cout << typeid(c).name() << endl;
  19. cout << typeid(d).name() << endl;
  20. cout << typeid(pa).name() << endl;
  21. cout << typeid(rc).name() << endl;
  22. cout << typeid(f).name() << endl;
  23. }

主要在于理解,不懂的话就多写代码尝试一下.

基于范围的for循环

对于我们现在敲的代码来说,在很多情况中我们都没有必要来说明所在的范围,所以我们这里就引入了一个新的范围for,可以不必在乎所在的范围,将整个需要循环的直接循环.

范围for: 当前的数据 : 循环的范围

  1. void test3(){
  2. //====这个时我们普通的循环方式
  3. int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  4. for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i){
  5. cout << arr[i] << " ";
  6. }
  7. cout << endl;
  8. //范围for: 当前的数据 : 循环的范围
  9. //只是循环的条件发生了变化,其他的都是一样的
  10. for ( int& e : arr){ //如果在这里加了const 则值不会被修改,后面的赋值也没有办法
  11. cout << e << " ";
  12. //e = 10; //在第一次循环后,其对应的值被修改成了全10,
  13. //所以如果后面需要重新循环的时候,其所包含的值为全10
  14. //但是如果你在对应的变量之前加上const .他就会变成固定的,无法改变
  15. }
  16. cout << endl;
  17. for (int e : arr){
  18. cout << e << " ";
  19. }
  20. cout << endl;
  21. for (const auto& e : arr){
  22. cout << e << " ";
  23. }
  24. }

在数组作为参数的时候,数组名会退化成指针,范围是无法确定的,故——不能使用范围for

  1. void fun(int arr[], int n){
  2. for (const auto& e : arr){ //数组作为参数不能使用范围for
  3. cout << e << " ";
  4. }
  5. cout << endl;
  6. }

没有太多的理解,只要掌握了范围for并且能灵活运用就可以了.

指针空值

NULL其实就是0,在预处理的时候,它会被宏自动的替换.

当你在直接使用fun(NULL),的时候,因为NULL指的是0,所以就会调用第一个的整型,当你需要调用第二个指针类型的时候,就需要fun((int*)NULL)或者fun(nullptr),这两个操作其实是等效的,都可以用来调用指针的类型!

这里的 nullptr 指的就是 指针空值

  1. //上面两个fun为所引入变量不同的函数
  2. void fun(int a){
  3. cout << "fun(int)" << endl;
  4. }
  5. void fun(int* a){
  6. cout << "fun(int*)" << endl;
  7. }
  8. void test(){
  9. int* p = NULL; //在预处理的时候,宏替换: int* p=0;
  10. int* p2 = 0;
  11. fun(NULL); //在为空的时候,编译器会有限将NULL转换成整型,而不是指针类型
  12. fun((int*)NULL);//==
  13. fun(nullptr); //建议使用下面的这个方式
  14. cout << typeid(nullptr).name() << endl; //输出nullptr对应的类型,前面讲过
  15. }

对于今天讲的还是一些关于C++的基础知识,大家多理解多吸收吸收,就能懂的! 多敲代码!!!

发表评论

表情:
评论列表 (有 0 条评论,256人围观)

还没有评论,来说两句吧...

相关阅读