iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++引用的详细解释
  • 650
分享到

C++引用的详细解释

2024-04-02 19:04:59 650人浏览 薄情痞子
摘要

目录一、c++ 引用1.规则2.应用3.引用提高1.可以定义指针的引用,但不能定义引用的引用。2.可以定义指针的指针,不能定义引用的指针。3.可以定义指针数组,但不能定义引用数组,可

一、C++ 引用

变量名,本身是一段内存的引用,即别名(alias)。此处引入的引用,是为己有变量起一个别名。

声明如下


int main()
{
	int a;
	int &b = a;
}

1.规则

1.引用没有定义,是一种关系型声明。声明它和原有某一变量的关系。类型与原有类型保持一致,且不分配内存。与被引用的变量有相同的地址。

2.声明的时候必须初始化,一经声明,不可变更。

3.可对引用,再次引用。多次引用的结果,是某一个变量具有多个别名。

4.&符号前面有数据类型时,是引用。其他均为取地址。


#include <iOStream>
using namespace std;
int main()
{
	int a,b;
	int &r = a;
	int &r = b; //错误,不可更改原有的引用关系
	float &rr = b; //错误,引用类型不匹配
	cout<<&a<<&r<<endl; //变量与引用具有相同的地址。
	int &ra = r; //可对引用更次引用,表示 a 变量有两个别名,分别是 r 和 ra
}

输出结果

2.应用

1.值作函数参数


void swap(int a, int b); //无法实现两数据的交换
void swap(int *p, int *q); //开辟了两个指针空间实现交换

2.引用作函数参数


#include <iostream>
using namespace std;
void swap(int &a, int &b){
	int tmp;
	tmp = a;
	a = b;
	b = tmp;
}
int main(){
	int a = 3,b = 5;
	cout<<"a = "<<a<<"b = "<<b<<endl;
	swap(a,b);
	cout<<"a = "<<a<<"b = "<<b<<endl;
	return 0;
}

输出结果

c++中引入引用后,可以用引用解决的问题。避免用指针来解决。

3.引用提高

引用的本质是指针,C++对裸露的内存地址(指针)作了一次包装。又取得指针的优良特性。所以再对引用取地址,建立引用的指针没有意义

1.可以定义指针的引用,但不能定义引用的引用。


int a;
int* p = &a;
int*& rp = p; // ok
int& r = a;
int&& rr = r;//error

例子:


#include <iostream>
using namespace std;
void swap(char *pa,char *pb)
{
	char *t;
	t=pa;
	pa=pb;
	pb=t;
}
void swap2(char **pa,char **pb)
{
	char *t;
	t=*pa;
	*pa=*pb;
	*pb=t;
}
void swap3(char *&pa,char *&pb)//指针的引用
{
	char *t;
	t=pa;
	pa=pb;
	pb=t;
}
int main()
{
	char *pa="china";
	char *pb="america";
	cout<<"pa"<<pa<<endl;
	cout<<"pb"<<pb<<endl;
	//swap(pa,pb);
	//swap2(&pa,&pb);
	swap3(pa,pb);
	cout<<"pa"<<pa<<endl;
	cout<<"pb"<<pb<<endl;
	return 0;
}

输出结果

2.可以定义指针的指针,不能定义引用的指针。


int a;
int* p = &a;
int** pp = &p; // ok
int& r = a;
int&* pr = &r; // error

3.可以定义指针数组,但不能定义引用数组,可以定义数组引用。


int a, b, c;
int* parr[] = {&a, &b, &c}; // ok
int& rarr[] = {a, b, c}; // error
int arr[] = {1, 2, 3};
int (&rarr)[3] = arr; // ok

4.常引用

const 引用有较多使用。它可以防止对象的值被随意修改。因而具有一些特性。

(1)const 对象的引用必须是 const 的,将普通引用绑定到 const 对象是不合法的。

这个原因比较简单。既然对象是 const 的,表示不能被修改,引用当然也不能修改,必须使用 const 引用。实际上,const int a=1; int &b=a;这种写法是不合法的,编译不过。

(2)const 引用可使用相关类型的对象(常量,非同类型的变量或表达式)初始化。

这个是const 引用与普通引用最大的区别。const int &a=2;是合法的。double x=3.14; const int&b=x;也是合法的。

4.常引用原理

const 引用的目的是,禁止通过修改引用值来改变被引用的对象。const 引用的初始化特性较为微妙,可通过如下代码说明


double val = 3.14;
const int &ref = val; // int const & int & const ??
double & ref2 = val;
cout<<ref<<" "<<ref2<<endl;
val = 4.14;
cout<<ref<<" "<<ref2<<endl;

上述输出结果为 3 3.14 和 3 4.14。因为 ref 是 const 的,在初始化的过程中已经给定值,不允许修改。而被引用的对象是 val,是非 const 的,所以 val 的修改并未影响 ref 的值,而 ref2 的值发生了相应的改变。

那么,为什么非 const 的引用不能使用相关类型初始化呢?实际上,const 引用使用相关类型对象初始化时发生了如下过程:


int temp = val;
const int &ref = temp;

如果 ref 不是 const 的,那么改变 ref 值,修改的是 temp,而不是 val。期望对 ref 的赋值会修改 val 的程序员会发现 val 实际并未修改。


int i=5;
const int & ref = i+5;
//此时产生了与表达式等值的无名的临时变量,
//此时的引用是对无名的临时变量的引用。故不能更改。
cout<<ref<<endl;

5.const的好处

1,使用 const 可以避免无意修改数据的编程错误。

2,使用 const 可以处理 const 和非 const 实参。否则将只能接受非 const 数据。

3,使用 const 引用,可使函数能够正确的生成并使用临时变量(如果实参与引用参数不匹配,就会生成临时变量)

6.引用的本质浅析

1.大小与不可再引用


struct TypeP
{
	char *p;
};
struct TypeC
{
	char c;
};
struct TypeR
{
	char& r; //把引用单列出来,不与具体的对象发生关系
};
int main()
{
	printf("%d %d %d\n",sizeof(TypeP),sizeof(TypeC),sizeof(TypeR));
	return 0;
}

输出结果

结论:引用的本质是,是对常指针 type * const p 的再次包装。


1、const int *pi                                   指向常量的指针。
2、int * const pi                                  指针本身是一个常量,称为“指针常量”、“常指针”。
3、const int * const pi                       指向常量的指针常量。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C++引用的详细解释

本文链接: https://www.lsjlt.com/news/156022.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++引用的详细解释
    目录一、C++ 引用1.规则2.应用3.引用提高1.可以定义指针的引用,但不能定义引用的引用。2.可以定义指针的指针,不能定义引用的指针。3.可以定义指针数组,但不能定义引用数组,可...
    99+
    2024-04-02
  • C++的内存管理详细解释
    目录一、C/C++内存分布二、C语言中动态内存管理方式:1、malloc/calloc/realloc区别:三、C++中动态内存管理:new/delete四、实现原理五、面试常问问题...
    99+
    2024-04-02
  • C++详细讲解引用类型
    目录一、C++中的引用类型二、如何使用C++中的引用类型一、C++中的引用类型 在以严蔚敏老师的《数据结构》为代表的诸多数据结构的书中,都出现了C++引用这一用法,所以在学习数据结构...
    99+
    2024-04-02
  • getRealPath详细解释
    getRealPath是一个方法,用于获取指定文件路径的真实路径。在Java中,当我们使用相对路径来访问文件时,有时候可能会遇到问题...
    99+
    2023-09-13
    getRealPath
  • C语言详细讲解注释符号的使用
    目录一、注释规则二、注释中一个有趣的问题三、教科书型注释四、迷惑型的注释五、忽悠型注释六、搞笑型注释七、漂亮的程序注释八、小结一、注释规则 编译器在编译过程中使用空格替换整个注释字符...
    99+
    2024-04-02
  • Java ThreadLocal的详细解释
    目录一、ThreadLocal简介二、ThreadLocal简单使用三、ThreadLocal的实现原理1、set方法源码2、get方法源码3、remove方法的实现4、如下图所示:...
    99+
    2024-04-02
  • C++超详细讲解引用和指针
    目录引用概念定义步骤引用必须初始化引用初始化后不能更改引用作为函数的参数可以替代指针变量常引用引用作为函数的返回值类型引用的本质指针的引用(了解)指针和引用的区别引用概念 引用的本质...
    99+
    2024-04-02
  • 一篇文章详细解释C++的友元(friend)
    目录一.友元函数先看普通函数声明为友元函数:再看类成员函数声明为友元函数:最后说明二.友元类三.完整示例:四.同一个类(class)的类对象(object)互为友元总结一.友元函数 ...
    99+
    2024-04-02
  • python中savgol_filter的详细解释
    目录 savgol_filter简介savgol_filter原理参数window_length对平滑的效果参数polyorder的平滑效果 savgol_filter简介 Savitzk...
    99+
    2023-10-06
    python 人工智能 开发语言
  • C++详细分析讲解引用的概念与使用
    目录1.引用的概念2.引用的格式3.引用的特性4.取别名原则5.引用的使用场景做参数做返回值int&Count()的讲解传值传引用效率比较6.引用和指针的不同点1.引用的概念...
    99+
    2024-04-02
  • SpringMVC中@controllerAdvice注解的详细解释
    目录1.全局异常处理2.全局数据绑定3.全局数据预处理总结这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能: 1.全局异常处理; 2.全...
    99+
    2024-04-02
  • 详细解释opencv python中的 cv.approxPolyDP
    在OpenCV Python中,cv.approxPolyDP是一个用于多边形逼近的函数。它使用Douglas-Peucker算法来减少多边形的点数。 该函数需要两个参数:输入多边形和一个表示逼近精度...
    99+
    2023-09-10
    opencv python 计算机视觉
  • linux命令ifconfig的详细解释
    这篇文章主要讲解了“linux命令ifconfig的详细解释”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux命令ifconfig的详细解释”吧!许多...
    99+
    2024-04-02
  • c++超细致讲解引用
    C和C++禁止在函数调用时直接传递数组的内容,而是强制传递数组指针,而对于结构体和对象没有这种限制,调用函数时既可以传递指针,也可以直接传递内容;为了提高效率,我曾建议传递指针,这样...
    99+
    2024-04-02
  • 超详细解释Java反射
    目录一、什么是反射1. 反射机制的功能2. 实现反射机制的类二、反射的使用1. Customer类2. ReflectTester类三、具体实例1. ReflexDemo类2. Wr...
    99+
    2024-04-02
  • axios引入的详细讲解
    安装axios:npm install axios,等待安装完毕即可 引用axios:在需要使用的页面中引用  import axios from 'axios'  即可 axios请求的时候有两种方式:一种是get请求,另一种是post请...
    99+
    2023-10-25
    javascript 开发语言 ecmascript
  • 详解C++右值引用
    目录概述移动语义(Move Semantics)完美转发(Perfect Forwarding)概述 在C++中,常量、变量或表达式一定是左值(lvalue)或右值(rvalue)。...
    99+
    2024-04-02
  • Java 单例模式详细解释
    目录饿汉式懒汉式懒汉式(加锁synchronized)懒汉式(部分加锁synchronized)懒汉式(DCL)懒汉式(DCL)最终版静态内部类总结饿汉式 public cla...
    99+
    2024-04-02
  • python委托模式详细解释
    收集了网上的三个例子,然后做了些注释: #!/usr/bin/env python3 # -*- coding: utf-8 -*- class Wrapper: def __init__(self, obj): ...
    99+
    2023-01-31
    模式 详细 python
  • 详细解释MySQL中DECIMAL数据类型的使用
    MySQL定点数类型DECIMAL用法详解 在数据库中,经常需要处理精确的数值,例如货币金额或者科学计算等。为了保证计算准确性,MySQL提供了DECIMAL类型,用于存储精确的定点数...
    99+
    2024-02-24
    mysql 用法 decimal
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作