C++ 面試考點 類成員函數的調用時機

構造函數和析構函數的調用時機

1. 對于全局定義的對象,每當程序開始運行,在主函數 main 接受程序控制權之前,就調
用構造函數創建全局對象,整個程序結束時,自動調用全局對象的析構函數。
2. 對于局部定義的對象,每當程序流程到達該對象的定義處就調用構造函數,在程序離開
局部對象的作用域調用對象的析構函數。
3. 對于關鍵字 static 定義的靜態對象,當程序流程到達該對象定義處調用構造函數,在整
個程序結束時調用析構函數。
4. 對于用 new 運算符創建的堆對象,每當創建該對象時調用構造函數,在使用 delete 刪
除該對象時,調用析構函數

拷貝構造函數回顧

在看調用時機之前,先回顧以下拷貝構造函數的定義:

拷貝構造函數的形式是固定的:類名(const 類名 &)
1. 該函數是一個構造函數 —— 拷貝構造也是構造!
2. 該函數用一個已經存在的同類型的對象,來初始化新對象,即對對象本身進行復制
沒有顯式定義拷貝構造函數,這條復制語句依然可以通過,說明編譯器自動提供了默認的
拷貝構造函數。其形式是:

Point(const Point & rhs)
: _ix(rhs._ix)
, _iy(rhs._iy)
{}

但是默認的拷貝構造函數只能實現淺拷貝,無法對復雜的數據結構進行深拷貝,示例如下:

Computer pc("Acer",4500);
Computer pc2 = pc;//調用拷貝構造函數class Computer{
public:void print(){cout << "name:" << _name << endl;cout << "price:" << _price << endl;}
private:int _price;char *_name;  
};

編譯可以通過,運行則會報錯。

如果是默認的拷貝構造函數,pc2會對pc的_brand進行淺拷貝,指向同一片內存;pc2被銷
毀時,會調用析構函數,將這片堆空間進行回收;pc再銷毀時,析構函數中又會試圖回收
這片空間,出現double free問題

如果拷貝構造函數需要顯式寫出時(該類有指針成員申請堆空間),在自定義的拷貝構造函數中要換成深拷貝的方式,先申請空間,再復制內容

Computer::Computer(const Computer & rhs)
: _brand(new char[strlen(rhs._brand) + 1]())
, _price(rhs._price)
{
strcpy(_brand, rhs._brand);
}

拷貝構造函數的調用時機

1. 當使用一個已經存在的對象初始化另一個同類型的新對象時
2. 當函數參數(實參和形參的類型都是對象),形參與實參結合時(實參初始化形參)
—— 為了避免這次不必要的拷貝,可以使用引用作為參數

注意:類內拷貝構造函數必須對形參使用使用,否則會陷入對拷貝的遞歸調用導致棧溢出。

3. 當函數的返回值是對象,執行return語句時(編譯器有優化)。
——為了避免這次多余的拷貝,可以使用引用作為返回值,但一定要確保返回值的生命
周期大于函數的生命周期

拷貝構造函數的形式探究

拷貝構造函數是否可以去掉引用符號?

Point(const Point ?rhs)
—— 類名(const 類名) 形式,首先編譯器不允許這樣寫,直接報錯
如果拷貝函數的參數中去掉引用符號,進行拷貝時調用拷貝構造函數的過程中會發生“實參
和形參都是對象,用實參初始化形參”(拷貝構造第二種調用時機),會再一次調用拷貝構
造函數。形成遞歸調用,直到棧溢出,導致程序崩潰。

拷貝構造函數是否可以去掉const?

Point(Point & rhs)—— 類名(類名 &) 形式
編譯器不會報錯
加const的第一個用意:為了確保右操作數的數據成員不被改變
加const的第二個用意:為了能夠復制臨時對象的內容,因為非const引用不能綁定臨時變量(右值)

先看一個簡單的示例,看看什么是臨時的變量或對象:

參考:https://zhuanlan.zhihu.com/p/165391845

#include <iostream>
using namespace std;void f(int &a){cout << "f(" << a  << ") is being called" << endl;
}void g(const int &a){cout << "g(" << a << ") is being called" << endl;
}int main(){int a = 3, b = 4;f(a + b);  //編譯錯誤,把臨時變量作為非const的引用參數,傳遞給int &a了g(a + b);  //OK,把臨時變量作為const&傳遞是允許的
}

上面的兩個調用之前,a+b的值會存在一個臨時變量中,因為a+b是一個表達式,本質上屬于一個沒有名字的變量,編譯器會自動生成一個臨時變量儲存a+b的值,當把這個臨時變量傳給f時,由于f的聲明中,參數是int&,不是常量引用,所以產生以下編譯錯誤:

error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'

那么臨時變量跟引用有什么關系?C++語法規定,const引用可以綁定右值,非const引用不能綁定右值。這里什么是左值和右值?

通俗的說,可以取地址的變量稱為左值,反之則為右值。臨時變量,匿名變量,臨時對象,匿名對象他們在內存中并沒有實際的內存分配,絕大多數情況下屬于右值。對于沒有實際存在于內存中的變量或對象,不允許直接對其進行引用,因為編譯器認為引用的對象必須是內存中實體,面對這種情況,必須加const進行常量引用。

補充:【臨時變量】不能作為【非const引用參數】,不是因為他是常量,而是因為c++編譯器的一個關于語義的限制。如果一個參數是以非const引用傳入,c++編譯器就有理由認為程序員會在函數中修改這個值,并且這個被修改的引用在函數返回后要發揮作用。但如果你把一個臨時變量當作非const引用參數傳進來,由于臨時變量的特殊性,程序員并不能操作臨時變量,而且編譯器認為臨時變量不會常駐內存,隨時可能被釋放掉,所以,一般說來,修改一個臨時變量是毫無意義的,據此,c++編譯器加入了臨時變量不能作為非const引用的這個語義限制,意在限制這個非常規用法的潛在錯誤。

回到之前的拷貝構造函數,由之前的疑問可以得出,拷貝構造函數必須讓對象包含引用符號。

又因非const引用不能綁定臨時變量,所以對于拷貝構造函數必須進行const引用。

對于下圖中的示例,右邊的Computer實際并未被完全實例化,就直接拷貝給了pc3對象,屬于一個臨時對象,這條語句執行完就被釋放掉了。所以必須是const引用。

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

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

相關文章

59.螺旋矩陣II

59.螺旋矩陣II 螺旋矩陣沒有什么算法&#xff0c;就是一道單純模擬轉圈的一道題目&#xff0c;因為轉圈的過程需要處理的邊界條件很多&#xff0c;所以有難度 那只能從第二個節點開始處理&#xff1b;從第二個節點開始處理&#xff0c;把最后一個節點也處理了&#xff08;第二…

MS SQL(Microsoft SQL Server)面試常考的知識點

MS SQL是Microsoft SQL Server的簡稱&#xff0c;是由微軟公司開發的一款關系型數據庫管理系統&#xff08;RDBMS,Relational DataBase Management System&#xff09;。它支持在Windows和Linux上運行&#xff0c;廣泛應用于企業級數據庫市場&#xff0c;適用于大型企業網站和應…

百勝軟件獲邀出席第七屆中國智慧零售大會,智能中臺助力品牌零售數智變革

8月28日&#xff0c;由深圳市智慧零售協會主辦的第七屆中國智慧零售大會在深圳福田希爾頓酒店成功召開。本屆大會以“聚勢AI共啟智慧零售新生態”為主題&#xff0c;匯聚了來自北京大學、騰訊云、百果園、舍得酒業、美宜佳等眾多知名企業與機構的專家代表&#xff0c;共同探討A…

QEMU使用Qemu-Guest-Agent傳輸文件、執行指令等

簡介 之前介紹過qemu傳輸文件,使用的掛載 / samba方式 :Qemu和宿主機不使用外網進行文件傳輸。 這是一種方式,這里還有另一種方式:使用Qemu-Guest-Agent,后面簡稱qga。 官網介紹:https://www.qemu.org/docs/master/interop/qemu-ga.html 安裝 這里有一篇參考文章,會…

HTML 核心標簽全解析:從文本排版到媒體嵌入

在網頁開發中&#xff0c;HTML&#xff08;超文本標記語言&#xff09;是構建頁面結構的基石。掌握各類核心標簽的用法&#xff0c;是實現頁面內容有序呈現、提升用戶體驗的關鍵。本文將系統講解 HTML 中最常用的幾類標簽 —— 段落標簽、文本格式標簽、列表標簽、表格&#xf…

[后端快速搭建]基于 Django+DeepSeek API 快速搭建智能問答后端

在 AI 應用開發中&#xff0c;將大模型 API 與 Web 框架結合是常見需求。本文將詳細記錄如何使用 Django 搭建后端服務&#xff0c;并集成 DeepSeek API 實現智能問答功能&#xff0c;包含環境配置、路由設計、API 調用及異常處理的完整流程&#xff0c;適合需要快速搭建 AI 問…

R 語言 + 卒中 Meta 分析

R 語言 卒中 Meta 分析&#xff1a;4 類核心場景完整代碼&#xff08;含藥物對比 / 劑量風險&#xff09; 卒中&#xff08;缺血性 / 出血性&#xff09;的臨床決策高度依賴循證證據&#xff0c;而 Meta 分析是整合多中心研究結果的核心工具。本文以卒中臨床研究為核心&#x…

Goframe 框架下HTTP反向代理并支持MCP所需的SSE協議的實現

一、需求背景 Go 語言開發 MCP 服務&#xff0c;并在 Goframe 框架下實現 Http 反向代理&#xff0c;代理該 MCP 服務。 二、效果演示 三、Goframe框架簡介 GoFrame 是一款模塊化、低耦合設計、高性能的Go 語言開發框架。包含了常用的基礎組件和開發工具&#xff0c;既可以作…

Git將多筆patch合并成一筆

一、方法1、在你的代碼中把這多筆patch都打上2、git reset到origin那一筆(默認模式&#xff0c;不帶soft或者hard)3、再add和commit&#xff0c;push二、種模式對比模式命令示例影響范圍適用場景--softgit reset --soft HEAD~1僅移動 HEAD&#xff0c;保留修改在暫存區修改提交…

【SpringBoot】Dubbo、Zookeeper

文章目錄前提知識概要分布式系統單體架構垂直應用架構分布式架構流式架構RPCDubbo概念Dubbo環境搭建Zookeeper測試 ZookeeperWindow環境下使用Dubbo-admin版本匹配不對服務注冊實戰內容總結導入相關依賴選擇 Zookeeper 版本配置并啟用 Zookeeper創建服務接口和實現(DubboServic…

【不說廢話】pytorch張量相對于numpy數組的優勢

核心關系 我們首先需要了解&#xff1a;PyTorch 張量在設計上深受 NumPy 數組的影響&#xff0c;它們共享許多相似的 API 和概念。實際上&#xff0c;PyTorch 張量可以看作是支持 GPU 加速和自動求導功能的 NumPy 數組。PyTorch 張量的主要優勢 1. GPU 加速支持&#xff08;最重…

拼團小程序源碼分享拼團余額提現小程序定制教程開發源碼二開

功能詳細說明&#xff08;一&#xff09;首頁功能進入首頁&#xff0c;可看到以下核心功能&#xff1a;1、優惠券&#xff0c;錢包&#xff0c;簽到&#xff0c;拼團&#xff0c;分銷等各種功能入口2、推薦的商品和活動3、下方功能欄的各種功能&#xff08;二&#xff09;客服功…

pikachu之XSS

XSS&#xff08;跨站腳本&#xff09;概述Cross-Site Scripting 簡稱為“CSS”&#xff0c;為避免與前端疊成樣式表的縮寫"CSS"沖突&#xff0c;故又稱XSS。一般XSS可以分為如下幾種常見類型&#xff1a;1.反射性XSS;2.存儲型XSS;3.DOM型XSS;XSS漏洞一直被評估為web漏…

【Element Plus `el-select` 下拉菜單響應式定位問題深度解析】

Element Plus el-select 下拉菜單響應式定位問題深度解析 本文檔旨在深入剖析一個在響應式布局中常見的 UI 問題&#xff1a;如何確保一個靠近屏幕邊緣的 el-select 組件的下拉菜單&#xff0c;在任何屏幕尺寸下都能以預期的、優雅的方式顯示。 1. 需求背景 在一個大屏數據展示…

Qt 項目文件(.pro)中添加 UI 文件相關命令

在 Qt 的 .pro 項目文件中&#xff0c;處理 UI 文件&#xff08;.ui 文件&#xff09;通常需要以下配置&#xff1a; 基本 UI 文件配置 自動包含 UI 文件&#xff1a; qmake FORMS yourfile.ui \anotherfile.ui Qt 構建系統會自動使用 uic&#xff08;用戶界面編譯器&#xff…

展會回顧 | 聚焦醫療前沿 , 禮達先導在廣州醫博會展示類器官自動化培養技術

8月22-24日&#xff0c;廣州醫博會在廣交會展館B區圓滿落幕。此次盛會匯聚了來自全球醫療健康領域的頂尖專家學者、企業代表與合作伙伴。展會內容涵蓋基礎研發、臨床應用、前沿技術、產業轉化、醫療服務及金融支持&#xff0c;全景呈現醫療健康產業的創新生態&#xff0c;成為連…

華為eNSP防火墻綜合網絡結構訓練.docx

1.IP及VLAN規劃情況 設備 接口 IP vlan 備注 AR1 g0/0/0 1.1.1.2/28 PPPOE g0/0/1 3.3.3.1/30 g0/0/2 114.114.114.254/24 AR2 g0/0/0 2.2.2.2/28 DHCP g0/0/1 3.3.3.2/30 g0/0/2 100.100.100.254/24 FW1 g1/0/0 10.0.0.1/30 tr…

從 Oracle 到 TiDB,通過ETL工具,高效實現數據拉通

在當前企業數字化轉型的浪潮中&#xff0c;打破數據孤島、實現異構數據庫間的數據高效流轉已成為提升業務敏捷性與決策效率的關鍵。許多企業在要將 Oracle 數據庫中的海量數據準確地同步至TiDB 分布式數據庫時遇到了挑戰。這一過程不僅要求數據的絕對一致性&#xff0c;還對同步…

Effective c++ 35條款詳解

您問到了最關鍵的一點&#xff01;這正是策略模式的精妙之處——它通過組合&#xff08;composition&#xff09;而非繼承&#xff08;inheritance&#xff09;來實現多態效果。讓我詳細解釋這是如何工作的&#xff0c;以及它與傳統繼承多態的區別。&#x1f504; 策略模式如何…

51c自動駕駛~合集19

自己的原文哦~ https://blog.51cto.com/whaosoft/11793894 #DRAMA 首個基于Mamba的端到端運動規劃器 運動規劃是一項具有挑戰性的任務&#xff0c;在高度動態和復雜的環境中生成安全可行的軌跡&#xff0c;形成自動駕駛汽車的核心能力。在本文中&#xff0c;我…