首页 > 编程语言 >C++引用

C++引用

时间:2024-12-30 21:28:25浏览次数:3  
标签:初始化 变量 右值 int C++ 引用

        

目录

1.引用的声明与初始化

2.别名

3.引用与指针的区别

4.常量引用 | const与引用

5.引用作为函数参数

6.引用返回值

7.右值引用(C++11新特性)

8.引用的实现


        C++中的引用是一种特殊的类型,它是一个别名(或者叫作“引用名”),用来指向另一个变量。一旦引用被初始化为一个变量,它就不能被改变指向另一个变量。引用必须在声明时被初始化,并且之后引用名和它所指向的变量名可以互换使用。引用是C++中一个非常强大的特性,它提供了一种高效的方式来操作变量,同时保持代码的简洁性和可读性。以下是C++引用的一些关键点:

/*
1.引用的声明与初始化
2.别名
3.引用与指针的区别
4.常量引用|const与引用
5.引用作为函数参数
6.引用返回值
7.右值引用(C++11新特性)
8.引用的实现
*/

    int num1 = 1;
    int &n = num1;  //引用被声明时必须进行初始化,n为num1的引用,不可改变引用关系
    n = 100 ;
    cout << num1;    //100,对引用进行操作就是其指向的变量进行的操作

1.引用的声明与初始化

        引用在声明时必须被初始化,并且一旦初始化后,其指向的变量不能改变。引用实体和引用类型必须是相同的数据类型

2.别名

        引用是它所指向变量的别名。因此,对引用的操作实际上就是对它所指向的变量的操作。

3.引用与指针的区别

4.常量引用 | const与引用

//常量引用
int num1 = 100;
const int& num = num1;
// num = 1;报错,const修饰的引用类型不可以修改,可以指向静态变量/非静态变量
num1 = 1000;
cout << num1 << endl;    //1000

5.引用作为函数参数

        引用作为函数参数时,可以在函数内部对参数进行修改,提高函数的运行效率(值的传递机制是通过将“形参=实参”进行的,会形成一个实参的副本,参数为引用时,已有了实参的信息,进而可以避免复制开销,提高函数运行效率)

//引用作为函数参数
void swap(int &a,int &b) {
    int temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a = 0, b = 0;
    cout << "请依次输入a和b的值:";
    cin >> a >> b;
    swap(a, b); //在swap函数中修改了a和b
    cout << "a=" << a << endl << "b=" << b << endl;
    return 0;
}

6.引用返回值

        引用作为返回值时,不会在内存中产生返回值内存的副本(否则在栈区产生返回值的副本,占用内存,函数调用结束后释放)

//引用作为返回值
int& swap(int a) {
    a += 2;
    return a;
}

int main()
{
    int b = 0;
    cin >> b;
    int c = swap(b);
    cout << "c=" << c << endl;
    return 0;
}

7.右值引用(C++11新特性)

        右值引用(&&)用于优化移动操作以避免不必要的深拷贝。右值引用只能绑定到即将被销毁的对象上。具体来说,当函数返回一个临时对象时,可通过右值引用直接移动该对象,避免复制,提高程序的运行效率。

        右值引用与move、RVO(Return Value Optimization)和universal reference等概念紧密相关

8.引用的实现

        C++中的引用(&)是变量的一个别名,它提供了一种方式来间接访问该变量。从实现的角度来看,引用通常被编译器实现为指针,但对程序员来说,它们表现得像另一个变量名。

  • 编译器实现层面
    • 从编译器的角度来看,引用在内部通常是通过指针来实现的。当创建一个引用时,编译器会在幕后将引用转换为一个指针常量。例如,对于int a = 10; int& ref=a;,编译器可能会将其处理为类似于int* const ref_ptr = &a的形式。这里ref_ptr是一个指向a的常量指针,它不能被重新指向其他变量,这就保证了引用一旦初始化就不能再引用其他对象的特性。
  • 内存布局层面
    • 引用变量和被引用变量的内存地址是相同的。因为它们本质上是同一块内存的不同表示方式。以int类型为例,如果变量a的地址是0x1000,那么引用ref的地址也是0x1000。当通过引用访问变量时,实际上是通过这个共享的内存地址来读写数据。

标签:初始化,变量,右值,int,C++,引用
From: https://blog.csdn.net/qq_64751004/article/details/144826187

相关文章

  • C++:正整数A+B
    正整数A+B题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。输入格式:输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱......
  • 21. C++快速入门--协程 Coroutine 入门
    参考:https://www.cnblogs.com/blizzard8204/p/17563217.htmlhttps://www.bennyhuo.com/2022/03/09/cpp-coroutines-01-intro/本文不完整,更新中1基本概念什么是协程?C++20的协程是一个特殊函数,具有挂起和恢复的能力.(可以不一次性执行)协程可用于异步编程,提供......
  • 16. C++快速入门--模板和Concept
    待修改1定义模板1.1模板形参模板参数模板可以有两种参数,一种是类型参数,一种是非类型参数这两种参数可以同时存在,非类型参数的类型可以是模板类型形参template< typenameT,//1 Ta//2>第一个参数是类型参数T第二个是非类型参数a,它的类型和形参......
  • C++语言知识点总结
    众所周知,C++有超级大量的相关知识,普通人类是难以做到“精通C++”的。不过,这不影响我想做一些C++语言知识点的总结,帮助自己理解C++的设计并更好地使用它:)一、基础概念相关类的构造关键点在于,对任何构造函数,C++会在进入构造函数体之前,自动调用所有成员变量的构造函数(如果未显式......
  • Effective C++ 条款40:明智而审慎地使用多重继承
    文章目录条款40:明智而审慎地使用多重继承示例1:多重继承中的歧义示例2:避免菱形继承问题示例3:合理使用多重继承总结条款40:明智而审慎地使用多重继承多重继承(MultipleInheritance)允许一个类从多个基类继承。然而,与单一继承相比,多重继承更加复杂,可能带来以下问题和......
  • C12.【C++ Cont】string类字符串的创建、输入、访问和size函数
    目录1.概念2.string字符串的创建示例代码 运行结果备注 2.string字符串的输入1.cin(字符串没有空格)2.getline(可以读含有空格的字符串)示例代码1:getline传两个参数示例代码2:getline传三个参数3.size函数示例代码运行结果4.访问string类字符串示例代码 运......
  • 1. C++快速入门--变量和基本类型, 类别
    文章使用obsidian编写,双链部分可能失效1基本内置类型1.1算术类型算术类型介绍bool类型字符类型整数类型实数浮点、虚数浮点和复数浮点参看如下表![[Pastedimage20230814160130.png|700]]带符号和无符号类型的变量分为:signed和unsignedunsigned变量......
  • qt/c++ 学习笔记之网页照片爬虫
    *注意:本爬虫使用的qt版本为5.14.2,使用的是qtwebkit类是自己配置了qtwebkit和对应qt版本的openssl,其中qtwebkit类在qt5.15和qt6版本已经删除,需要自己私下配置qtwebkit和对应qt版本的openssl头文件widget.h#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#include......
  • C++关键字
    C++关键字static类和结构体外的static被static修饰后只在内部发生链接,其作用域只在其所在的文件中。类和结构体内的staticstructEntity{ staticintx,y; 静态成员变量 staticvoidPrint() { std::cout<<x<<","<<y<<std::endl; }};intEntity::x; //......
  • C++标准库
        【欢迎关注编码小哥,学习更多实用的编程方法和技巧】    C++标准库是C++语言的重要组成部分,它为程序员提供了一系列的功能强大的工具和组件,帮助他们更高效地进行软件开发。标准库不仅包括基本的输入输出功能,还涵盖了数据结构、算法、内存管理、日期和时间处......