C++ 中的引用

文章目錄

  • C++ 引用的應用
    • 1. 修改函數中傳遞的參數
    • 2. 避免復制大型結構
    • 3. for 循環中修改所有對象
    • 4. for 循環中避免復制對象
  • References vs Pointers
  • 引用的限制
  • 使用引用的優點
  • 練習
    • Quesition 1
    • Question 2
    • Question 3
    • Question 4
    • Question 5
    • Question 6

如果一個變量被聲明為引用,那它就成了一個已有變量的別名。一個變量可以通過在聲明的時候加 & 而成為引用。

此外,還可以將引用變量定義為一種類型,它可以作為另一個變量的引用。& 用于表示變量或任何內存的地址。與引用變量關聯的變量,既可以通過變量名訪問,也可以通過與之關聯的引用變量訪問。

語法:

data_type &ref = variable;

例子:

// C++ Program to demonstrate 
// use of references
#include <iostream>
using namespace std;int main()
{int x = 10;// ref is a reference to x.int& ref = x;// Value of x is now changed to 20ref = 20;cout << "x = " << x << '\n';// Value of x is now changed to 30x = 30;cout << "ref = " << ref << '\n';return 0;
}

輸出:

x = 20
ref = 30

C++ 引用的應用

C++中的引用有很多的應用,如下是其中的一些:

  1. 修改函數中傳遞的參數;
  2. 避免復制大型結構;
  3. for 循環中修改所有對象;
  4. for 循環中避免復制對象;

1. 修改函數中傳遞的參數

如果一個函數接收到了一個變量的引用,它可以修改這個變量的值。如下程序變量是使用引用交換的。

// C++ Program to demonstrate
// Passing of references as parameters
#include <iostream>
using namespace std;// Function having parameters as
// references
void swap(int& first, int& second)
{int temp = first;first = second;second = temp;
}// Driver function
int main()
{// Variables declaredint a = 2, b = 3;// function calledswap(a, b);// changes can be seen// printing both variablescout << a << " " << b;return 0;
}

輸出:

3 2

2. 避免復制大型結構

想象一下,一個函數必須接收一個大對象。如果我們沒有使用引用來傳遞,那么它的一個新副本就會被創建,這回導致CPU時間和內存的浪費。可以使用引用來避免這種情況。

struct Student {string name;string address;int rollNo;
}// If we remove & in below function, a new
// copy of the student object is created. 
// We use const to avoid accidental updates
// in the function as the purpose of the function
// is to print s only.
void print(const Student &s)
{cout << s.name << "  " << s.address << "  " << s.rollNo<< '\n';
}

3. for 循環中修改所有對象

我們可以在每個循環中使用引用來修改所有元素。

// C++ Program for changing the
// values of elements while traversing
// using references
#include <iostream>
#include <vector>using namespace std;// Driver code
int main()
{vector<int> vect{ 10, 20, 30, 40 };// We can modify elements if we// use referencefor (int& x : vect) {x = x + 5;}// Printing elementsfor (int x : vect) {cout << x << " ";}cout << '\n';return 0;
}

輸出:

15 25 35 45 

4. for 循環中避免復制對象

我們可以在每個循環中使用引用,以避免在對象很大時復制單個對象。

// C++ Program to use references
// For Each Loop to avoid the
// copy of objects
#include <iostream>
#include <vector>using namespace std;// Driver code
int main()
{// Declaring vectorvector<string> vect{ "geeksforgeeks practice","geeksforgeeks write","geeksforgeeks ide" };// We avoid copy of the whole string// object by using reference.for (const auto& x : vect) {cout << x << '\n';}return 0;
}

輸出

geeksforgeeks practice
geeksforgeeks write
geeksforgeeks ide

References vs Pointers

引用和指針都可以用于在一個函數中修改另一個函數的局部變量。當作為參數傳遞給函數或從函數返回時,它們都可以用來避免復制大對象,從而提高效率。盡管有上述相似之處,引用和指針之間還是有以下區別。

  1. 指針可以被聲明為 void,但引用不可以
    int a = 10;
    void* aa = &a; // it is valid
    void& ar = a;  // it is not valid
    
  2. 指針變量有n層/多層的間接,即單指針、雙指針、三指針。然而,引用變量只有一個間接層次。下面的代碼揭示了上述幾點:
    // C++ Program to demonstrate
    // references and pointers
    #include <iostream>
    using namespace std;// Driver Code
    int main()
    {// simple or ordinary variable.int i = 10;// single pointerint* p = &i;// double pointerint** pt = &p;// triple pointerint*** ptr = &pt;// All the above pointers differ in the value they store// or point to.cout << "i = " << i << "\t"<< "p = " << p << "\t"<< "pt = " << pt << "\t"<< "ptr = " << ptr << '\n';// simple or ordinary variableint a = 5;int& S = a;int& S0 = S;int& S1 = S0;// All the references do not differ in their// values as they all refer to the same variable.cout << "a = " << a << "\t"<< "S = " << S << "\t"<< "S0 = " << S0 << "\t"<< "S1 = " << S1 << '\n';return 0;
    }
    
    輸出:
    i = 10    p = 0x7ffecfe7c07c    pt = 0x7ffecfe7c080    ptr = 0x7ffecfe7c088
    a = 5    S = 5    S0 = 5    S1 = 5
    
  3. 引用變量不能更新;
  4. 引用變量是一個內部指針;
  5. 引用變量的聲明前面有&符號(但不要將其讀作“address of”)。

引用的限制

  1. 一個引用一旦被創建,它就不能再引用另一個對象;它不能被重置。這通常使用指針完成。
  2. 引用不能是NULL。指針經常用 NULL 來表示它沒有指向任何有效的東西。
  3. 引用必須在聲明的時候初始化,而指針沒有該限制。

由于上面的限制,C++中的引用不能用于實現如鏈表、樹等數據結構。Java 中,引用沒有上述限制,可以用于實現所有的數據結構。Java不需要指針的主要原因是引用功能更強大。

使用引用的優點

  1. 更安全:由于引用必須初始化,所以像野指針這樣的野引用不太可能存在。但仍然有可能存在不指向有效位置的引用(見下面練習中的第5和6題)
  2. 使用更方便:引用不需要解引用運算符來訪問值。它們可以像普通變量一樣使用。& 運算符只有在聲明的時候需要。此外,對象引用的成員可以通過點運算符(.) 訪問,而不像指針,需要箭頭運算符(->) 才能訪問成員。

除了上述原因,還有一些地方如拷貝構造函數不能使用指針。在拷貝構造函數中必須使用引用傳遞實參,類似地,重載某些運算符如++時必須使用引用。

練習

Quesition 1

#include <iostream>
using namespace std;int& fun()
{static int x = 10;return x;
}int main()
{fun() = 30;cout << fun();return 0;
}

輸出:

30

Question 2

#include <iostream>
using namespace std;int fun(int& x) { return x; }int main()
{cout << fun(10);return 0;
}

輸出:

./3337ee98-ae6e-4792-8128-7c879288221f.cpp: In function 'int main()':
./3337ee98-ae6e-4792-8128-7c879288221f.cpp:8:19: error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'cout << fun(10);^
./3337ee98-ae6e-4792-8128-7c879288221f.cpp:4:5: note: in passing argument 1 of 'int fun(int&)'int fun(int& x) { return x; }

Question 3

#include <iostream>
using namespace std;void swap(char*& str1, char*& str2)
{char* temp = str1;str1 = str2;str2 = temp;
}int main()
{char* str1 = "GEEKS";char* str2 = "FOR GEEKS";swap(str1, str2);cout << "str1 is " << str1 << '\n';cout << "str2 is " << str2 << '\n';return 0;
}

輸出:

str1 is FOR GEEKS
str2 is GEEKS

Question 4

#include <iostream>
using namespace std;int main()
{int x = 10;int* ptr = &x;int&* ptr1 = ptr;
}

輸出:

./18074365-ebdc-4b13-81f2-cfc42bb4b035.cpp: In function 'int main()':
./18074365-ebdc-4b13-81f2-cfc42bb4b035.cpp:8:11: error: cannot declare pointer to 'int&'int&* ptr1 = ptr;

Question 5

#include <iostream>
using namespace std;int main()
{int* ptr = NULL;int& ref = *ptr;cout << ref << '\n';
}

輸出:

timeout: the monitored command dumped core
/bin/bash: line 1:    34 Segmentation fault      timeout 15s ./372da97e-346c-4594-990f-14edda1f5021 < 372da97e-346c-4594-990f-14edda1f5021.in

Question 6

#include <iostream>
using namespace std;int& fun()
{int x = 10;return x;
}int main()
{fun() = 30;cout << fun();return 0;
}

輸出:

0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215916.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215916.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215916.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android-Framework 默認橫屏、dpi設置

一、環境 高通865 Android 10 二、源碼修改位置 1、修改dpi device/qcom/kona/kona.mk -116,7 116,7 TARGET_USES_RRO : true# system prop for Bluetooth SOC typePRODUCT_PROPERTY_OVERRIDES \vendor.qcom.bluetooth.sochastings \ - ro.sf.lcd_density480ro.sf.lcd_d…

Python中的logging介紹

Python中的logging模塊是一個強大的、靈活的、可配置的日志記錄系統。它允許你在不修改源代碼的情況下記錄錯誤和調試信息&#xff0c;同時也可以對日志信息進行各種處理&#xff0c;例如寫入到文件、輸出到控制臺、記錄到數據庫等。 logging模塊提供了一種用于日志記錄的通用接…

液態二氧化碳儲存罐遠程無線監測系統

二氧化碳強化石油開采技術&#xff0c;須先深入了解石油儲層的地質特征和二氧化碳的作用機制。現場有8輛二氧化碳罐裝車&#xff0c;每輛罐車上有4臺液態二氧化碳儲罐&#xff0c;每臺罐的尾部都裝有一臺西門子S7-200 smart PLC。在注入二氧化碳的過程中&#xff0c;中控室S7-1…

國產單片機XL32F001,價格便宜,性價比高,32位M0+內核

XL32F001芯片簡介 1、是一個32位ARM架構Cortex -M0系列的單片機 2、系統工作頻率最高為24MHz 3、擁有24Kbytes Flash存儲器和3Kbytes SRAM 4、擁有內部24MHz和32.768MHz的RC振蕩器&#xff08;HSI和LSI&#xff09;&#xff0c;擁有32.768KHz低速晶體振蕩器&#xff08;LSE…

JVM內存模型+JVM類加載機制

jvm內存模型包括哪些以及各自作用 主要包括類加載 對象創建 方法調用 本地方法區 程序計數 方法區&#xff1a; class文件加載到方法區 堆&#xff1a; 對象創建在堆內存中 jvm棧&#xff1a;方法調用入棧 本地方法棧&#xff1a;主要是c寫的一些方法 程序計數器&#xff1a;存…

OneNote for Windows10 徹底刪除筆記本

找了超多方法&#xff0c;都沒有用&#xff0c;我的OneNote都沒有文件選項&#xff0c;要在OneDrive中刪除&#xff0c;但是一直登不進&#xff0c;然后又找到一個方法&#xff1a; 在網頁中打開Office的控制面板 "Sign in to your Microsoft account" 在“最近”一…

【強化學習-讀書筆記】多臂賭博機 Multi-armed bandit

參考 Reinforcement Learning, Second Edition An Introduction By Richard S. Sutton and Andrew G. Barto強化學習與監督學習 強化學習與其他機器學習方法最大的不同&#xff0c;就在于前者的訓練信號是用來評估&#xff08;而不是指導&#xff09;給定動作的好壞的。 …

第21章網絡通信

網絡程序設計基礎 網絡程序設計編寫的是與其他計算機進行通信的程序。Java 已經將網絡程序所需要的元素封 裝成不同的類&#xff0c;用戶只要創建這些類的對象&#xff0c;使用相應的方法&#xff0c;即使不具備有關的網絡支持&#xff0c;也可 以編寫出高質量的網絡通信程序…

2023年【危險化學品生產單位安全生產管理人員】考試題庫及危險化學品生產單位安全生產管理人員考試技巧

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 危險化學品生產單位安全生產管理人員考試題庫是安全生產模擬考試一點通總題庫中生成的一套危險化學品生產單位安全生產管理人員考試技巧&#xff0c;安全生產模擬考試一點通上危險化學品生產單位安全生產管理人員作業…

【教程】制作 iOS 推送證書

如需向 iOS 設備推送數據&#xff0c;您首先需要在消息推送控制臺上配置 iOS 推送證書。iOS 推送證書用于推送通知&#xff0c;本文將介紹消息推送服務支持的證書類型&#xff0c;并引導您制作 iOS 推送證書。 證書類型 消息推送服務僅支持 Apple Push Service 類型的證書。有…

react Hooks之useDebugValue

1、作用&#xff1a; 用于在開發過程中幫助開發者調試自定義 Hook。它的作用是將自定義 Hook 中的某些值暴露給 React 開發工具&#xff08;例如 React DevTools&#xff09;以便于調試。 當我們使用 React 開發工具查看組件的狀態時&#xff0c;React DevTools 會從組件和其…

鴻蒙(HarmonyOS)應用開發——保存應用數據

保存應用數據 harmonyOS系統提供了四種數據存儲方式 #mermaid-svg-kZlN0CFY1VGySIPo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kZlN0CFY1VGySIPo .error-icon{fill:#552222;}#mermaid-svg-kZlN0CFY1VGySIPo .…

競賽保研 LSTM的預測算法 - 股票預測 天氣預測 房價預測

0 簡介 今天學長向大家介紹LSTM基礎 基于LSTM的預測算法 - 股票預測 天氣預測 房價預測 這是一個較為新穎的競賽課題方向&#xff0c;學長非常推薦&#xff01; &#x1f9ff; 更多資料, 項目分享&#xff1a; https://gitee.com/dancheng-senior/postgraduate 1 基于 Ke…

Android RecyclerView 動畫處理 流程 原理(源碼分析第二篇)

零、本文主題 本文要解決的問題&#xff1a; 1. Recyclerview 動畫的實現原理是什么&#xff1f; 2. 處理的主要流程大概是怎樣的&#xff1f; 一、核心原理 我們拋開代碼&#xff0c;想一下&#xff0c;RecyclerView中的view動畫有幾種&#xff1f; 添加一個view&#xff1a;…

react Hooks之useLayoutEffect和useInsertionEffect

在介紹這兩個hooks之前。讓我們先對比一下useEffect、useLayoutEffect、useInsertionEffect 執行時機&#xff1a; useEffect 在組件渲染完成后執行&#xff0c;屬于異步執行。useInsertionEffect 在組件渲染并插入 DOM 后執行&#xff0c;也屬于異步執行。useLayoutEffect 在組…

互聯網公司,哪個部門才是鄙視鏈最頂端?

文章目錄 每日一句正能量前言財務部法務部公關部銷售部前臺行政IT部創意部后記 每日一句正能量 我們必須在失敗中尋找勝利&#xff0c;在絕望中尋求希望。 前言 在互聯網公司中&#xff0c;不同職位的鄙視鏈是存在的。有些職位享有高尚的地位&#xff0c;而有些則被看作是次要…

python 爬蟲 m3u8 視頻文件 加密解密 整合mp4

文章目錄 一、完整代碼二、視頻分析1. 認識m3u8文件2. 獲取密鑰&#xff0c;構建解密器3. 下載ts文件4. 合并ts文件為mp4 三、總結 一、完整代碼 完整代碼如下&#xff1a; import requests import re import os from tqdm import tqdm from Crypto.Cipher import AES# 創建臨…

Shopify二次開發之五:元字段(Metafields)

目錄 解釋 操作 1、添加Custom data 2、選擇特定類型的數據 3、為Page配置元子段和值 4、模板訪問 解釋 Shopify Metafields 是一種用于存儲和管理自定義數據的功能。它們允許商戶在商城中的產品、訂單、客戶、Page等對象上添加自定義字段&#xff0c;以滿足特定業務需求…

c語言->自定義類型聯合體和枚舉類型

系列文章目錄 文章目錄 前言 ?作者簡介&#xff1a;大家好&#xff0c;我是橘橙黃又青&#xff0c;一個想要與大家共同進步的男人&#x1f609;&#x1f609; &#x1f34e;個人主頁&#xff1a;橘橙黃又青_C語言,函數,指針-CSDN博客 目的&#xff1a;學習聯合體和枚舉類型的…

[cleanrl] ppo_continuous_action源碼解析

1 import庫&#xff08;略&#xff09; import os import random import time from dataclasses import dataclassimport gymnasium as gym import numpy as np import torch import torch.nn as nn import torch.optim as optim import tyro from torch.distributions.normal…