首页 > 编程语言 >C++零基础教程(引用)

C++零基础教程(引用)

时间:2023-10-22 14:32:05浏览次数:33  
标签:int 绑定 C++ 对象 num 引用 基础教程 指针

(文章目录)


前言

本篇文章我们来讲解C++中非常重要的一个概念,这个概念就是引用,引用在C++中经常使用,下面就让我们来看看到底什么是引用吧。

一、引用概念介绍及使用方法

在C++中,引用是一种别名,它允许我们使用一个已经存在的对象来创建一个新的名称。引用提供了一种更直观、简洁和安全的方式来操作对象,同时也增加了代码的可读性。

以下是关于C++中引用的一些重要特点和用法:

1.引用的声明和初始化:

引用必须在声明时进行初始化,并指定它所引用的对象,否则会导致编译错误。 引用初始化后,一旦绑定到一个对象,就不能再改变其绑定的对象。

int num = 10;
int& ref = num;  // 引用声明和初始化

2.引用与所引用的对象绑定:

引用与所引用的对象始终保持绑定关系,它们指向同一片内存空间,对引用的修改会影响到所引用的对象,反之亦然。 引用不拥有独立的内存地址,它仅是所引用对象的一个别名。

int num = 10;
int& ref = num;

ref = 20;  // 修改引用的值
cout << num;  // 输出 20

3.引用作为函数参数:

引用可以作为函数的参数传递,允许在函数内部直接操作外部对象,避免了拷贝和内存消耗。 通过传递引用,函数可以修改外部对象的值,这种方式称为引用传递。

void modifyValue(int& ref) {
    ref += 10;
}

int num = 5;
modifyValue(num);  // 传递引用
cout << num;  // 输出 15

二、引用与指针的区别

指针(Pointer)和引用(Reference)是在C++中常用的两种变量类型,它们具有不同的特点和用法,下面是它们之间的区别:

1.内存操作:

指针可以通过指针运算和解引用来直接操作内存地址,可以改变所指向的对象的值,也可以指向空地址(nullptr)。 引用是对象的一个别名,没有自己的独立内存地址,它和所引用的对象始终绑定在一起,不能改变引用所绑定的对象。

2.初始化与赋值:

指针可以没有初始化,也可以为空指针(nullptr)初始化,可以在后续进行赋值操作。 引用必须在声明时进行初始化,并一直绑定到同一个对象,不能绑定到其他对象。

3.空值(Nullability):

指针可以指向空地址(nullptr),表示指针未指向任何有效的对象。 引用不能为空,必须引用一个有效的对象。

4.重新指向:

指针可以通过重新赋值来指向其他对象或空地址。 引用一经引用绑定,就无法改变所引用的对象。

5.数组操作:

指针可以进行指针算术运算,可以指向数组的不同元素,并能通过指针访问数组元素。 引用不能直接绑定到数组,但可以通过指针间接操作数组。

6.参数传递:

指针可以用作函数参数,可以传递指针的地址或指向对象的指针,通过指针在函数内部修改外部对象的值。 引用也可以用作函数参数,将参数声明为引用类型,可以直接操作参数所引用的外部对象,更加简洁直观。 总的来说,指针提供了更多的灵活性和直接的内存操作能力,适合需要进行动态内存分配、操作数组或者追踪空值的场景。引用则更加简洁和安全,适合作为参数传递,避免了指针空值和误操作的问题。选择使用指针还是引用取决于具体的使用场景和需求。

示例:

int num = 10;
int& ref = num;  // 引用
int* ptr = &num;  // 指针

ref = 20;
*ptr = 30;

cout << num;  // 输出 30

三、引用常用代码示例

1.引用作为函数参数传递: 引用经常用于函数参数传递,允许函数直接修改传递的对象,避免了对象的拷贝。例如:

void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

int x = 5;
int y = 10;
swap(x, y);

cout << x << " " << y;  // 输出 10 5

2.引用用于遍历容器元素: 引用可以用于遍历容器中的元素,以更简洁和直观的方式访问和修改容器中的值。例如:

vector<int> numbers = {1, 2, 3, 4, 5};

for (int& num : numbers) {
    num *= 2;
}

for (int num : numbers) {
    cout << num << " ";  // 输出 2 4 6 8 10
}

3.引用用于操作符重载: 引用常用于重载操作符,允许在自定义类型上使用像赋值操作符、下标操作符等常见的操作。例如:

class MyArray {
private:
    int data[5];

public:
    int& operator[](int index) {
        return data[index];
    }
};

MyArray arr;
arr[2] = 10;
cout << arr[2];  // 输出 10

4.引用用于返回值优化: 引用还可以用于函数的返回值优化(Return Value Optimization,RVO),允许函数直接返回一个对象而不进行拷贝,提高执行效率。例如:

vector<int> createVector() {
    vector<int> temp = {1, 2, 3, 4, 5};
    return temp;
}

vector<int>& getVector() {
    static vector<int> temp = {1, 2, 3, 4, 5};
    return temp;
}

vector<int> numbers1 = createVector();  // 返回临时对象的拷贝
vector<int>& numbers2 = getVector();    // 直接引用静态对象

numbers1.push_back(6);  // 对 numbers1 的修改不会影响原始对象
numbers2.push_back(6);  // 对 numbers2 的修改会影响原始对象

以上示例展示了引用的主要用途,包括函数参数、容器操作、操作符重载和返回值优化。引用的使用可以提高代码的可读性、避免拷贝开销,并在操作对象时提供便利的方式。

总结

本篇文章主要讲解了引用的使用,及引用和指针的区别。

标签:int,绑定,C++,对象,num,引用,基础教程,指针
From: https://blog.51cto.com/u_16153875/7976698

相关文章

  • C++中的RTTI机制、多继承中的虚函数
    C++中的RTTI机制基类有虚函数时才能实现RTTI机制:基类无虚函数时,typeid(*pA)返回的是pA声明时的类型。基类有虚函数时,typeid(*pA)返回的是pA指向对象的类型。比较两个带有虚函数的类的对象是否相等if(typeid(*a)==typeid(B))if(dynamic_cast<B*>(a)):如果能够成功向......
  • python包引用方式总结
    本文为博主原创,转载请注明出处:在Python中,有多种引用包的方式。以下是常见的方式:1.import语句import语句是最常见和推荐的引用包的方式。它允许你引入整个包或包中的特定模块/子模块。importpackage_nameimportpackage_name.module_namefrompackage_nameimportmod......
  • C++ 读写锁
    官网:https://zh.cppreference.com/w/cpp/thread/shared_mutex1.何为读写锁相比互斥锁,读写锁允许更高的并行性,互斥量要么锁住状态要么不加锁,而且一次只有一个线程可以加锁。读写锁可以有三种状态:读模式加锁状态;写模式加锁状态;不加锁状态;只有一个线程可以占有写模式的读写......
  • C++中的继承
    一、继承的概念与定义1、继承的概念继承机制是面向对象程序设计实现代码复用的重要手段,它允许程序员在保持原有类特性的基础上进行拓展,增加功能,我们把原本的类称之为父类或者基类,新产生的类称之为子类或者派生类。继承体现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过......
  • vs 禁用c++编译警告提示的两种方式
    1.禁用单个cpp文件编译警告#pragmawarning(disable:警告号)如:当前提示C4305警告;加入禁用单个cpp文件编译警告;结果:编译警告消失.2.全局禁用指定警告效果如下 翻译搜索复制......
  • C++变量类型
    C++变量类型变量的名称可以由字母、数字和下划线组成。它必须以字母或下划线开头。类型描述bool布尔类型,存储值为true或false,占用1个字节char字符类型,用于存储ASCII字符,通常占用1个字节int整数类型,通常用于存储普通整数,通常占用四个字节float单精度浮点值......
  • C/C++ C2679 二元“<<”: 没有找到接受“XXX”类型的右操作数的运算符(或没有可接受的
    今天在做一个C++项目时遇到了如下问题: 找了好久的百度,结果发现只要把这段报错的程序换一下位置,放到运算符重载函数的下面就可以了,因为编译器是按顺序执行的。。。 ......
  • c++指针相关
    常量指针(PointertoConstant)定义:一个指向常量的指针。这意味着指针指向的值不能被修改,但指针本身可以被修改,即可以重新指向其他地址。声明:constType*pointerName;constint*p1;intx=10,y=20;p1=&x;//Valid*p1=50;//Errorp1=&y;//Valid指针......
  • c++默认实参
    参考:默认实参#include<iostream>voidf(inta,intb=1);//只要前面声明了b的值,后面b可以不给默认值voidf(inta=2,intb){std::cout<<a<<''<<b<<'\n';}intmain(){f();}......
  • C++ 使用EPSG进行坐标转换
    场景将WGS84坐标转换为CGCS2000坐标使用epsg.io网站的坐标系转换功能可以检查转换结果是否正确下面网址是示例代码https://epsg.io/transform#s_srs=4326&t_srs=4538&x=88.0000000&y=47.0000000转换示例代码projver.9.2.0安装proj库,使用vcpkg(vcpkginstallproj:x64-wind......