IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 标准C++程序设计学习笔记(七)——★C++的引用 -> 正文阅读

[数据结构与算法]标准C++程序设计学习笔记(七)——★C++的引用

引用

  • 引用即别名? (一开始引用是出现是想取代指针,没想到没做到,反而指针和引用都保留了下来)

  • 数据类型& 别名 = 目的对象;

  • 注意:

    • 引用必须直接初始化 形参列表引用没有直接初始化(在函数调用的时候初始化)

    • 引用一旦初始化 不能更改引用对象(不能指向其他对象) 从一而终

      • 对引用对象的操作,直接影响其目标对象

#include <iostream>        //01ref.cpp
using namespace std;
void swap(int *pa,int *pb){
	int tmp = *pa;//pa = &a;
	*pa = *pb;
	*pb = tmp;
}
//引用
void exchange(int& m,int& n){// m和n是实参a和b的别名  操作m和n 其实 就是操作实参
	int tmp = m;
	m = n;
	n = tmp;
}

int main(){
	int a = 1024, b = 9527;
	cout << "a=" << a << ",b=" << b << endl;

	exchange(a,b);

	cout << "a=" << a << ",b=" << b << endl;

	int m = 1, n = 2;
	exchange(m,n);
	cout << m << "," << n << endl;

	return 0;	
}

引用的应用

  • 函数参数 在函数内部可以直接修改实参的值

#include <iostream>    //02ref.cpp
using namespace std;


int main(){
	int a = 1024;
	cout << &a << endl;
	cout << a << endl;

	int& r = a;//定义引用变量r 引用 a

	cout << &r << endl;
	cout << r << endl;
	
	r = 9527;
	cout << r << endl;
	cout << a << endl;

	a = 1212;
	cout << a << endl;
	cout << r << endl;
	

	double d = 3.14;
	double& rd = d;



	return 0;	
}
  • 函数的返回值 需要确保在函数调用之后,返回的对象依然有效

    能够返回全局变量、静态变量、动态内存对象引用参数的引用

    不能返回局部变量的引用,编译警告;引用的对象的值不确定、行为不确定

    不能返回局部变量的引用

#include <iostream>    //03initref.cpp
using namespace std;

void func(int& ra){
	cout << ra << endl;
	ra = 1111;
}

double& getd(void){
	double d = 6.666;
	return d;//不能返回局部变量的引用
}

int main(){
	//int& r;
	int a = 10;
	int& r1 = a,r2;//r1是引用 int&, r2是int

	func(a);
	cout << a << endl;
	double& rd = getd();
	cout << rd << endl;
	return 0;	
}
  • 多态 父类的引用类型引用子类对象

★引用与指针

  • 1.引用的本质就是指针,C++对指针的一个封装 很多场合引用和指针可以互换

  • 2.C++层面 上引用和指针有以下方面的不同

    • A.指针是实体变量,但是引用不是实体变量

      • sizeof(指针) == 4/8 当平台和编译器确定,大小唯一

      • int a = 1;int & ra = a; sizeof(ra) == 4

      • double d = 1.0;double& rd = d; sizeof(rd) == 8
        ?

        #include <iostream>    //04sizeof.cpp
        using namespace std;
        
        
        int main(){
        	cout << sizeof(void*) << endl;
        	cout << sizeof(int*) << endl;
        	cout << sizeof(double*) << endl;
        	
        	cout << "------------" << endl;
        
        	cout << sizeof(int&) << endl;
        	cout << sizeof(double&) << endl;
        	//cout << sizeof(void&) << endl;
        	return 0;
        }
        

    • B.指针可以不初始化,但是引用必须初始化

      • int *p; //OK

      • int& r; //Error

    • C.指针可以修改目标(指向不同的目标) 但是引用不能修改引用方向

      • int *p = &a; //指向a

      • p = &b; //指向b

      • int& r = a; //引用a

      • r = b; //对a进行赋值 &r = b;

    • D.可以声明void指针 void* 但不能声明void引用 void&

      void* p; //OK

      void& r = v; //Error

    • E.可以声明指针的指针(二级指针) 但不可以定义引用的引用

      int **p;

      int a; int &r = a;

      int&& rra = r; //引用的引用 Error

      int& rra = r; //OK

    • F.可以定义指针的引用 但不可以定义引用的指针

      int *p;

      int*& rp = p; //指针的引用 本质是引用 引用一个指针

      int& *pr; //错误的 引用的指针 本质是指针 指针指向引用
      ?

      #include <iostream>        //05refpointer.cpp
      using namespace std;
      
      
      int main(){
      	int a = 1024;
      	int *p = &a;
      	
      	int*& rp = p;//指针的引用
      	int b = 9527;
      
      
      	rp = &b;
      
      	*rp = 1111;
      
      	int& r = a;
      	int& *pr = &r;
      
      	return 0;	
      }
      

    • G.可以定义数组的引用 但不能定义引用的数组

      数组的引用本质是引用,引用了一个数组

      int arr[5] = {1,2,3,4,5};

      int (&rar)[5] = arr; //数组的引用 和 数组的指针 很类似

      int a,b,c,d,e;

      int& brr[5] = {a,b,c,d,e};//引用的数组 Error
      ?

      #include <iostream>    //06refarr.cpp
      using namespace std;
      
      int main(){
      	int arr[5] = {1,2,3,1023,1024};
      	//数组的引用
      	//数组的指针   int (*arr)[5]
      	int (*par)[5] = &arr;
      
      	int (&rar)[5] = arr;//数组的引用
      	
      	cout << arr << endl;
      	cout << rar << endl;
      
      
      	cout << rar[0] << endl;
      	cout << rar[1] << endl;
      	rar[4] = 9527;
      
      	cout << arr[4] << endl;
      	
      	int a,b,c,d,e;
      	int& brr[5] = {a,b,c,d,e};
      
      
      	return 0;	
      }
      

    • H.指针有自己的一块空间,而引用只是一个别名

    • I.作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象

    • J.可以有const指针,但是没有const引用

    • K.指针和引用使用++运算符的意义不一样

    • L.如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:50:25  更:2021-09-24 10:53:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 12:54:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码