C++基础知识(二:引用和new delete)

简介: 引用是C++中的一种复合类型,它是某个已存在变量的别名,也就是说引用不是独立的实体,它只是为已存在的变量取了一个新名字。一旦引用被初始化为某个变量,就不能改变引用到另一个变量。引用的主要用途包括函数参数传递、操作符重载等,它可以避免复制大对象的开销,并且使得代码更加直观易读。


目录

引用(Reference)

new 和 delete

一、引用

【1】定义

【2】&的使用

【3】引用的性质

示例:

编辑

【4】引用作为函数的形参

【5】数组引用和指针的引用

【6】引用作为函数的返回值

【7】引用和指针的区别*

【1】new

i)单个内存空间的申请

ii)多个空间的申请

【2】delete


引用(Reference)

引用是C++中的一种复合类型,它是某个已存在变量的别名,也就是说引用不是独立的实体,它只是为已存在的变量取了一个新名字。一旦引用被初始化为某个变量,就不能改变引用到另一个变量。引用的主要用途包括函数参数传递、操作符重载等,它可以避免复制大对象的开销,并且使得代码更加直观易读。

new 和 delete

newdelete是C++中的动态内存管理操作符,用于在运行时分配和释放内存。

一、引用

【1】定义

引用和目标公用一片空间

对一片取别名

数据类型 &引用名 = 目标名;

引用的底层实现:类型  * const p; ------>常指针

int const *p;      ----->修饰*p

const int *p;      ----->修饰*p

int *const p;      ----->修饰p

const int  *const p;       ----->修饰*p和p

【2】&的使用

  1. 取变量的地址
  2. 位运算符
  3. &&逻辑与
  4. 定义引用,---->如果&前面有数据类型,就说明是在定义引用

【3】引用的性质

  1. 引用必须初始化
  2. 访问引用相当于访问目标
  3. 引用的目标一旦指定,不能修改
  4. 引用和目标占用同一片空间(引用不会额外开辟空间)

示例:

#include <iostream>
using namespace std;
int main()
{
    int num1=30,num2=90;
    //int &ref2;   引用必须初始化
    int &ref1 = num1;   //定义了一个引用refn1,目标是num1
    //在后面,访问ref1和访问num1是同一个效果
    
    //尝试修改ref1的目标
    ref1 = num2;   //<===>num1 = num2;
    cout << ref1 << endl;
    cout << &num1 << endl;
    cout << &ref1 << endl;
}

image.gif

image.gif 编辑

【4】引用作为函数的形参

好处:

  1. 不需要额外开辟空间
  2. 不涉及到值传递和地址传递的问题,传到函数内部的就是实参本身
#include <iostream>
using namespace std;
//可以实现两数交换,但是需要额外开辟两个指针的空间
void my_swap(int &x,int &y)   //my_swap(num1,num2);  int &x = num1;
{
    //由于形参是引用变量,所以函数内对形参的修改也是对实参的修改
      int temp;
      temp = x;
      x = y;
      y = temp;
}
int main()
{
    int num1=30,num2=90;
    //int &ref2;   引用必须初始化
    int &ref1 = num1;   //定义了一个引用refn1,目标是num1
    //在后面,访问ref1和访问num1是同一个效果
    //尝试修改ref1的目标
    ref1 = num2;   //<===>num1 = num2;
    cout << ref1 << endl;
    cout << &num1 << endl;
    cout << &ref1 << endl;
    my_swap(num1,num2);
    cout << "函数调用后" << endl;
    cout << "num1 = " << num1 << endl;
    cout << "num2 = " << num2 << endl;
    return 0;
}

image.gif

【5】数组引用和指针的引用

#include <iostream>
using namespace std;
int main()
{
    int arr[5]={89,12,34,0,5};
    int *p = arr;
    int *(&r3) = p;   //定义了一个指针p的引用r3
    //定义一个指向整个一维数组的指针
    //int (*p)[5];
    //定义一个数组arr的引用
    int a = 90;
    int &r1 = a;
    //定义了一个r2是arr数组的引用
    int (&r2)[5]  = arr;    //arr的数据类型int [5]
    return 0;
}

image.gif

【6】引用作为函数的返回值

复习:指针作为函数的返回值   ---->指针函数

  1. 全局变量
  2. static修饰的局部变量
  3. 堆区申请的空间
  4. 常量区的空间
  5. 实参传递过去的地址          ------>返回的是生命周期长的变量的地址

引用作为函数的返回值,和指针函数一样,需要返回生命周期长的变量的引用

引用作为函数的返回值,是一个左值,(因为返回引用就是返回变量本身),可以被赋值和自增自减运算

#include <iostream>
#include <cstdlib>
using namespace std;
int num1 = 12;
int &fun(int *p1)   //fun(&a);  <==>int *p = &a; p指向a
{
    //return num1;   // <==>返回num1的引用
    cout << p1 << endl;
    return *p1;   //p1是一个4Byte的指针,需要返回4Byte的int
}
int &fun1()
{
    return num1;
}
int main()
{
    int a = 90;
    int *p1 = (int *)malloc(4);
    cout << num1 << endl;   //12
    fun1()++ ;  // <==>num1++;
    cout << num1 << endl;
    *p1 = 90;
    return 0;
}

image.gif

【7】引用和指针的区别*

  1. 引用定义必须初始化,指针定义可以不初始化(野指针)
  2. 指针可以指向NULL,引用不可以
  3. 可以改变指针的指向,不能改变引用的目标
  4. 有指针数组但是没有引用数组
  5. 指针会额外开辟空间,引用不会额外开辟空间
  6. 有多级指针,没有多级引用
  • 动态内存分配

C中的动态内存分配:malloc和free   ----->C++中可以继续使用

C++中动态内存分配的关键字:new、delete

【1】new

i)单个内存空间的申请

回忆malloc:
int *p = (int *)malloc(4);
只申请单个空间的操作
数据类型 *指针名 = new 数据类型;   //new会按照数据类型申请空间
申请并初始化操作
数据类型 *指针名 = new 数据类型(初始值);   //申请到空间中的初始值就是()内的内容

image.gif

ii)多个空间的申请

数据类型 *指针名 = new 数据类型[size]{初始值};   
//使用new申请多个空间,仍然可以使用不完全初始化的方式,未初始化的部分默认为0

image.gif

【2】delete

单个空间的释放:
delete 指针名;
多个空间的释放:
delete []指针名;
#include <iostream>
using namespace std;
int main()
{
    int *p = new int(3);    //指针p指向堆区申请的一个int的空间
    cout << *p << endl;
    string *ps = new string;
    int *ptr = new int[5]{2,3,5,6};   //申请了5个int的空间
    int i;
    for (i=0;i<5;i++)
    {
        cout << *(ptr+i) << endl;
    }
    delete p;     //释放单个的堆空间
    p = NULL;  //NULL的ASCII是0,可能会满足整形0的情况,
    //C++中提供的nullptr,只表示指针为空的情况
    delete [] ptr;   //释放多个堆空间,需要使用[],[]内不需要写任何内容
    ptr = nullptr;
    return 0;
}

image.gif

C++中不推荐使用malloc和free的原因:

malloc和free时不会自动调用构造函数和析构函数

new和delete会自动调用构造函数和析构函数

相关文章
|
2天前
|
存储 C语言 C++
【C/C++】动态内存管理( C++:new,delete)
C++的`new`和`delete`用于动态内存管理,分配和释放内存。`new`分配内存并调用构造函数,`delete`释放内存并调用析构函数。`new[]`和`delete[]`分别用于数组分配和释放。不正确匹配可能导致内存泄漏。内置类型分配时不初始化,自定义类型则调用构造/析构。`operator new`和`operator delete`是系统底层的内存管理函数,封装了`malloc`和`free`。定位`new`允许在已分配内存上构造对象,常用于内存池。智能指针等现代C++特性能进一步帮助管理内存。
|
2天前
|
C语言 C++ 开发者
C++基础知识(一:命名空间的各种使用方法)
C++在C的基础上引入了更多的元素,例如类,类的私密性要比C中的结构体更加优秀,引用,重载,命名空间,以及STL库,模板编程和更多的函数,在面向对象的编程上更加高效。C语言的优势则是更加底层,编译速度会更快,在编写内核时大多数都是C语言去写。 在C++中,命名空间(Namespace)是一种组织代码的方式,主要用于解决全局变量、函数或类的命名冲突问题。命名空间提供了一种封装机制,允许开发者将相关的类、函数、变量等放在一个逻辑上封闭的区域中,这样相同的名字在不同的命名空间中可以共存,而不会相互干扰。
|
2天前
|
算法 编译器 C++
C++基础知识(三:哑元和内联函数和函数重载)
在C++编程中,"哑元"这个术语虽然不常用,但可以理解为在函数定义或调用中使用的没有实际功能、仅作为占位符的参数。这种做法多见于模板编程或者为了匹配函数签名等场景。例如,在实现某些通用算法时,可能需要一个特定数量的参数来满足编译器要求,即使在特定情况下某些参数并不参与计算,这些参数就可以被视为哑元。
|
2天前
|
C++
C++基础知识(四:类的学习)
类指的就是对同一类对象,把所有的属性都封装起来,你也可以把类看成一个高级版的结构体。
|
2天前
|
自然语言处理 程序员 C++
C++基础知识(五:运算符重载)
运算符重载是C++中的一项强大特性,它允许程序员为自定义类型(如类或结构体)重新定义标准运算符的行为,使得这些运算符能够适用于自定义类型的操作。这样做可以增强代码的可读性和表达力,使得代码更接近自然语言,同时保持了面向对象编程的封装性。
|
2天前
|
存储 编译器 C++
C++基础知识(六:继承)
多态是面向对象编程的四大基本原则之一,它让程序能够以统一的接口处理不同的对象类型,从而实现了接口与实现分离,提高了代码的灵活性和复用性。多态主要体现在两个层面:静态多态(编译时多态,如函数重载)和动态多态(运行时多态,主要通过虚函数实现)。
|
2天前
|
存储 编译器 C++
C++基础知识(七:多态)
多态是面向对象编程的四大基本原则之一,它让程序能够以统一的接口处理不同的对象类型,从而实现了接口与实现分离,提高了代码的灵活性和复用性。多态主要体现在两个层面:静态多态(编译时多态,如函数重载)和动态多态(运行时多态,主要通过虚函数实现)。
|
2天前
|
存储 算法 程序员
C++基础知识(八:STL标准库(Vectors和list))
C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等. STL容器的提供是为了让开发者可以更高效率的去开发,同时我们应该也需要知道他们的底层实现,这样在出现错误的时候我们才知道一些原因,才可以更好的去解决问题。
|
2天前
|
算法 前端开发 C++
C++基础知识(八:STL标准库 deque )
deque在C++的STL(Standard Template Library)中是一个非常强大的容器,它的全称是“Double-Ended Queue”,即双端队列。deque结合了数组和链表的优点,提供了在两端进行高效插入和删除操作的能力,同时保持了随机访问的特性。
|
2天前
|
存储 C++ 索引
C++基础知识(八:STL标准库 Map和multimap )
C++ 标准模板库(STL)中的 map 容器是一种非常有用的关联容器,用于存储键值对(key-value pairs)。在 map 中,每个元素都由一个键和一个值组成,其中键是唯一的,而值则可以重复。

热门文章

最新文章