網站首頁 編程語言 正文
前言:
初學C++發現了下面這個問題,其中Duck是一個已知的類,并以多種方式指定對象的值:
Duck d1(); Duck d2(d1); Duck d3 = d1; Duck d4; d4 = d1;
問題在于,上述d1、d2、d3、d4是如何創建的呢?分別調用的哪個函數呢?
1、賦值和初始化的區別
C++中,賦值和初始化是兩個不同的概念:
- 初始化是指對象創建之時指定其初值,分為直接初始化和復制初始化兩種(一句);
- 賦值是指對象創建以后指定其值(兩句);
對于上述d1、d2、d3、d4的創建來說,分別對應下述情況:
Duck d1(); ? ?// 直接初始化 Duck d2(d1); ?// 復制初始化 Duck d3 = d1; // 復制初始化 Duck d4; ? ? ?// 未初始化 d4 = d1; ? ? ?// 賦值
2、初始化和賦值分別調用哪個函數?
直接初始化時,參數為對象所需的值,此時調用構造函數;復制初始化時,參數是一個已存在的類對象,此時調用復制構造函數;賦值時,對象是已經定義好的,調用“重載的等號賦值操作”,使用另一個對象的值計算出此對象的值。
Duck d1(); ? ?// 調用構造函數 Duck d2(d1); ?// 調用復制構造函數 Duck d3 = d1; // 調用復制構造函數 Duck d4; ? ? ?//? d4 = d1; ? ? ?// 賦值
需要特別注意的是下面兩種方式都是初始化,而且都是調用的復制構造函數,容易誤以為第二種方式是賦值:
Duck d2(d1); Duck d3 = d1;
3、編寫測試類
對于上述Duck
類的初始化以及賦值方式,為了正確的測定每種情況分別調用了什么函數,下面的類中包含了構造函數、復制構造函數、重載等號賦值運算符函數:
class Duck{ public: ?? ?Duck() { cout << "constructing !!!" << endl; }; ?? ?Duck(const Duck &d) { cout << "copying !!!" << endl; } ?? ?Duck& operator=(const Duck &another); }; Duck& Duck::operator=(const Duck &another) { ?? ?cout << "operator= !!!" << endl; ?? ?return *this; }
使用Section 1
和Section 2
中的各種方式指定對象的值時,可以方便的確定出各個函數的調用情況。
原文鏈接:https://zhuanlan.zhihu.com/p/125103834
相關推薦
- 2022-06-28 C++哈希表之線性探測法實現詳解_C 語言
- 2022-04-18 uniapp h5去掉默認的頂部導航
- 2023-12-11 Spring利用注解自動裝配
- 2023-03-11 C/C++?-?從代碼到可執行程序的過程詳解_C 語言
- 2022-08-05 C語言示例講解while循環語句的用法_C 語言
- 2022-06-23 python入門語句基礎之if語句、while語句_python
- 2022-05-13 C++ 減少臨時字符串對象的產生
- 2021-10-09 C#?將Excel轉為PDF時自定義表格紙張大小的代碼思路_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支