C++入门基础-2

简介: C++入门基础

C++入门基础-1

https://developer.aliyun.com/article/1504242


5.2 引用的作用

5.2.1 引用作为函数的参数

我们以下面这段代码为例:


我们知道在C语言中,我们必须传指针才可以交换两个变量之间的值,因为形参只是实参的拷贝!而在C++中,我们利用引用作为参数,作为实参的别名,指向的是同一块内存空间,所以就可以顺利的交换变量之间的值了!


5.2.2 引用作为函数的返回值

我们先来看这样一段代码

int& ADD(int x,int y)
{
  int tmp = x + y;
  return tmp;
}


int main()
{
  int& ret = ADD(1,2);
  cout << ret << endl;
  return 0;
}

你认为ret打印出来是多少呢?如果你认为是3,那么恭喜你,成功的答错了这道题!正确的答案其实应该是随机值:

注:对于函数开辟空间的问题,具体可以参考这篇文章:函数的栈帧

我们在看这段代码:

int& Count(int x,int y)
{
  static int n = x + y;
  return n;
}
int main()
{
  int& ret = Count(1, 2);
  cout << ret << endl;
  int& ret1 = Count(2, 3);
  cout << ret1 << endl;
  return 0;
}

你觉得ret和ret1打印出来各是多少呢?如果你以为是随机值!!!那么恭喜你又成功的答错了,因为此时的n是静态变量,它所在的位置不是位于函数中,而是在一个叫做静态区的位置,所以此时ret是一个确定的值,而由于对于变量,只可以初始化一次,所以ret1是等于ret的值的!!!

所以我们在使用引用作为返回值时,我们需要特别注意引用的地方内存是否会被清除!以下面这个例子为例,说明一下引用的用法,后续还会进一步的反复学习!!!

int& arraypos(SL* ps,int pos)
{
  return ps->a[pos];
}

int main()
{
  SL a;
  for (int i = 0; i < a.size; i++)
  {
    //让顺序表中的值都加1
    arraypos(&a, i)++;
  }
}

5.3 常引用

举几个例子来理解一下常引用:

接下来我们在理解一下这个代码:

这里需要说明一点的就是,当类型不一样时,是会发生类型转换的,而不管是强制类型转化还是隐性类型转化,其实都是会中途产生一个临时变量,而这个临时变量具有不可改变的性质也就是常性(也可以理解为是一个确定的数字,是一个常数),所以加了const才不会报错

图解:


4ebf00015e5b279e50fc80c03bf2082e_753946fd26894fe48f44280f1809a325.png


5.4 总结引用与指针的区别

1 指针是可以不初始化的,而引用必须初始化
2 引用是不可以更改实体的指向,而指针是可以的
3 引用是变量的别名,而指针是存储变量的地址
4 引用不可以为NULL,而指针可以为NULL
5 不存在多级引用,存在多级指针
6 引用自增是实体加1,而指针加1是偏移一个类型的大小
7 访问实体方式不同,引用编译器自己会进行处理,而指针需要显式的解引用
8 在sizeof中的含义不同,引用表示类型的大小,而指正是固定的4个字节(32位平台下)或8(64位平台下)个字节
9 总体而言,引用相比较于指针更加安全!

6 内联函数(inline关键字)

内联函数的概念:用inline关键字修饰的函数叫做内联函数,并且编译时会在调用内联函数的地方展开!这样就会没有函数栈帧的开销,提高了程序运行的效率!

6.1 配置

修改以下两个地方:


内联函数其实主要解决C语言中宏的缺点

我们可以先来看一段宏定义的代码:

宏的缺点:
1 宏是不方便进行调试的,因为在预编译阶段就进行了替换
2 代码的可读性比较差,难以理解
3 没有类型安全检查机制
优点:
1 可以不用开辟栈帧,提高代码的运行效率
2 增强代码的复用性


C++中就利用内联函数(兼容了宏的优点也克服了它的缺点)代替宏,常量定义用const enum来代替

7.2 内联函数的特性


1 inline对于C++编译器来说只是一个建议,适合于规模较小且使用频率高的函数,但不可以是递归!否则规模较大或者是递归,即使你使用了inline关键字去修饰函数,那么C++编译器会无视!!!

2 内联函数的定义和声明是不可以分开的!这是因为inline被展开,就会没有函数地址,这样链接的时候就找不到了!!!


7 auto关键字

可以自动识别类型,后续我们如果遇到很长的类型是,可以使用auto关键字,所以这就要求使用auto时,必须进行初始化!!!


我们从以上可以看出,使用auto关键字时,auto与auto*没有任何区别,并且引用类型必须要用&来声明!!!

1 auto不可以作为函数的参数

2 auto不能用来声明数组


8 nullptr关键字

我们先来看以下这段代码:

void func(int a)
{
  cout << "int a" << endl;
}

void func(int* a)
{
  cout << "int* a" << endl;
}

int main()
{
  //func(1)
  func(NULL);
  return 0;
}


你认为运行的结果是什么呢?其实答案是int a并不是int* a,为什么会这样呢?那是因为编译器默认情况下会将NULL认为字面常量为0,如果要成为指针空值,那么必须强制转化(void*)0。所以就会调用第一个func,所以在C++中就引入nullptr关键字作为指针空值


总结:

本篇文章主要学习了C++入门的一些基础知识,后续我们将继续深入的学习C++中的语法知识!

目录
相关文章
|
1月前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
38 2
C++入门12——详解多态1
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
30 2
|
1月前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
79 1
|
1月前
|
程序员 C语言 C++
C++入门5——C/C++动态内存管理(new与delete)
C++入门5——C/C++动态内存管理(new与delete)
68 1
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
19 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
32 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
42 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
1月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
23 0
|
1月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
26 0