網(wǎng)站首頁 編程語言 正文
前言:
初學C++發(fā)現(xiàn)了下面這個問題,其中Duck是一個已知的類,并以多種方式指定對象的值:
Duck d1(); Duck d2(d1); Duck d3 = d1; Duck d4; d4 = d1;
問題在于,上述d1、d2、d3、d4是如何創(chuàng)建的呢?分別調(diào)用的哪個函數(shù)呢?
1、賦值和初始化的區(qū)別
C++中,賦值和初始化是兩個不同的概念:
- 初始化是指對象創(chuàng)建之時指定其初值,分為直接初始化和復制初始化兩種(一句);
- 賦值是指對象創(chuàng)建以后指定其值(兩句);
對于上述d1、d2、d3、d4的創(chuàng)建來說,分別對應(yīng)下述情況:
Duck d1(); ? ?// 直接初始化 Duck d2(d1); ?// 復制初始化 Duck d3 = d1; // 復制初始化 Duck d4; ? ? ?// 未初始化 d4 = d1; ? ? ?// 賦值
2、初始化和賦值分別調(diào)用哪個函數(shù)?
直接初始化時,參數(shù)為對象所需的值,此時調(diào)用構(gòu)造函數(shù);復制初始化時,參數(shù)是一個已存在的類對象,此時調(diào)用復制構(gòu)造函數(shù);賦值時,對象是已經(jīng)定義好的,調(diào)用“重載的等號賦值操作”,使用另一個對象的值計算出此對象的值。
Duck d1(); ? ?// 調(diào)用構(gòu)造函數(shù) Duck d2(d1); ?// 調(diào)用復制構(gòu)造函數(shù) Duck d3 = d1; // 調(diào)用復制構(gòu)造函數(shù) Duck d4; ? ? ?//? d4 = d1; ? ? ?// 賦值
需要特別注意的是下面兩種方式都是初始化,而且都是調(diào)用的復制構(gòu)造函數(shù),容易誤以為第二種方式是賦值:
Duck d2(d1); Duck d3 = d1;
3、編寫測試類
對于上述Duck
類的初始化以及賦值方式,為了正確的測定每種情況分別調(diào)用了什么函數(shù),下面的類中包含了構(gòu)造函數(shù)、復制構(gòu)造函數(shù)、重載等號賦值運算符函數(shù):
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
中的各種方式指定對象的值時,可以方便的確定出各個函數(shù)的調(diào)用情況。
原文鏈接:https://zhuanlan.zhihu.com/p/125103834
相關(guān)推薦
- 2023-05-07 C++中的并行與并發(fā)基礎(chǔ)與使用詳解_C 語言
- 2022-09-02 ORACLE正則匹配查詢LIKE查詢多個值檢索數(shù)據(jù)庫對象_oracle
- 2022-12-24 Qt實現(xiàn)給窗口繪制陰影的示例代碼_C 語言
- 2022-06-18 C#使用ThreadPriority設(shè)置線程優(yōu)先級_C#教程
- 2022-05-06 Nginx七層及四層反向代理配置的全過程_nginx
- 2022-08-06 C++圖論之Bellman-Ford算法和SPFA算法的實現(xiàn)_C 語言
- 2022-06-25 說說react中引入css的方式有哪些并區(qū)別在哪_React
- 2023-03-13 Pandas篩選某列過濾的方法_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支