網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
在不實(shí)現(xiàn)構(gòu)造函數(shù)的情況下,編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)無(wú)參構(gòu)造函數(shù)。但是看起來(lái)編譯器自動(dòng)生成的無(wú)參默認(rèn)構(gòu)造函數(shù)似乎沒有什么用,比如創(chuàng)建p對(duì)象時(shí)調(diào)用了編譯器生成的無(wú)參默認(rèn)構(gòu)造函數(shù),但是p對(duì)象的成員變量依舊是隨機(jī)值。
class Person
{
private:
int age;
public:
int getAge()
{
return age;
}
};
int main()
{
Person p;
cout << p.getAge() << endl;
return 0;
}
默認(rèn)無(wú)參構(gòu)造函數(shù)真的沒有用嗎?
我們可以通過下面的代碼來(lái)探究默認(rèn)無(wú)參構(gòu)造函數(shù)的作用。
#include<iostream>
#include<string>
using namespace std;
class Person
{
int age;
public:
Person() { cout << "自定義類型成員的默認(rèn)無(wú)參構(gòu)造函數(shù)被調(diào)用" << endl; }
//Person(int _age = 0) :age(_age) { cout << "自定義類型成員的全缺省默認(rèn)構(gòu)造函數(shù)被調(diào)用" << endl; }
int getAge()
{
return age;
}
};
class Student
{
Person p;
int id;
public:
Student(){}
int getId()
{
return id;
}
int getAge()
{
return p.getAge();
}
};
int main()
{
Student s;
cout << "id:" << s.getId() << endl;
cout << "age:" << s.getAge() << endl;
return 0;
}
上面代碼利用默認(rèn)無(wú)參構(gòu)造函數(shù)創(chuàng)建對(duì)象s,根據(jù)第一句輸出,我們可以得知默認(rèn)無(wú)參構(gòu)造函數(shù)會(huì)先對(duì)自定義類型的數(shù)據(jù)成員會(huì)調(diào)用自定義數(shù)據(jù)類型的默認(rèn)構(gòu)造函數(shù)來(lái)處理自定義類型數(shù)據(jù)成員。根據(jù)第二句輸出,我們可以知道默認(rèn)無(wú)參構(gòu)造函數(shù)對(duì)基本類型數(shù)據(jù)成員沒有作處理,只是在初始化列表中用隨機(jī)值對(duì)其進(jìn)行了初始化,第三句輸出,是默認(rèn)無(wú)參構(gòu)造函數(shù)調(diào)用了自定義類型的默認(rèn)構(gòu)造函數(shù)對(duì)自定義數(shù)據(jù)成員處理的結(jié)果,由于自定義類型的默認(rèn)構(gòu)造函數(shù)也是默認(rèn)無(wú)參構(gòu)造函數(shù),所以它不會(huì)對(duì)基本數(shù)據(jù)類型成員age作處理,只是在初始化列表中用隨機(jī)值對(duì)其進(jìn)行初始化。
我們把第八行代碼屏蔽,放出第九行全缺省默認(rèn)構(gòu)造函數(shù)試試看,輸出如下:
上面代碼利用默認(rèn)無(wú)參構(gòu)造函數(shù)創(chuàng)建對(duì)象s,根據(jù)第一句輸出,我們可以得知默認(rèn)無(wú)參構(gòu)造函數(shù)會(huì)先對(duì)自定義類型的數(shù)據(jù)成員會(huì)調(diào)用自定義數(shù)據(jù)類型的默認(rèn)構(gòu)造函數(shù)來(lái)處理自定義類型數(shù)據(jù)成員,與之前不同的是,之前自定義數(shù)據(jù)類型的默認(rèn)構(gòu)造函數(shù)是默認(rèn)無(wú)參構(gòu)造函數(shù),這里自定義類型的默認(rèn)構(gòu)造函數(shù),是自己定義的全缺省的默認(rèn)構(gòu)造函數(shù)。根據(jù)第二句輸出,我們可以知道默認(rèn)無(wú)參構(gòu)造函數(shù)對(duì)基本類型數(shù)據(jù)成員沒有作處理,只是在初始化列表中用隨機(jī)值對(duì)其進(jìn)行了初始化,第三句輸出,是默認(rèn)無(wú)參構(gòu)造函數(shù)調(diào)用了自定義類型的全缺省默認(rèn)構(gòu)造函數(shù)對(duì)自定義數(shù)據(jù)成員處理的結(jié)果。
由此我們可以得出結(jié)論:
C++把類型分成基本類型和自定義類型。
默認(rèn)無(wú)參默認(rèn)構(gòu)造函數(shù)對(duì)基本類型成員變量不做處理(在初始化列表中用隨機(jī)值對(duì)其進(jìn)行初始化),C++11 中針對(duì)基本類型成員不初始化的缺陷,又打了補(bǔ)丁,即:基本類型成員變量在類中聲明時(shí)可以給默認(rèn)值。
默認(rèn)無(wú)參構(gòu)造函數(shù)對(duì)于自定義類型成員變量才會(huì)處理,它會(huì)去調(diào)用自定義類型的默認(rèn)構(gòu)造函數(shù)去初始化創(chuàng)建自定義類型的成員變量(對(duì)象)。
何時(shí)使用編譯器自動(dòng)生成的無(wú)參默認(rèn)構(gòu)造函數(shù)就夠了,何時(shí)需要自己實(shí)現(xiàn)構(gòu)造函數(shù)呢?
如果一個(gè)類中的成員全是自定義類型,或者基本類型成員在聲明時(shí)已經(jīng)給了缺省值,即無(wú)需對(duì)基本類型成員變量做處理,且自定義成員都提供了默認(rèn)構(gòu)造函數(shù),此時(shí)使用編譯器自動(dòng)生成的無(wú)參默認(rèn)構(gòu)造函數(shù)就可以了。
如果有基本類型的成員變量且需要顯示傳參初始化,即我們需要自己對(duì)基本類型成員變量進(jìn)行處理,或者自定義類型成員沒有默認(rèn)構(gòu)造函數(shù),那么就要自己實(shí)現(xiàn)構(gòu)造函數(shù)。
原文鏈接:https://blog.csdn.net/weixin_44049823/article/details/127856959
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-09-12 關(guān)于Rsa?Public?Key?not?Find的問題及解決_數(shù)據(jù)庫(kù)其它
- 2022-03-26 C++實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字小游戲_C 語(yǔ)言
- 2022-09-30 Docker容器harbor私有倉(cāng)庫(kù)部署和管理_docker
- 2022-10-30 詳解Objective?C?中Block如何捕獲外部值_IOS
- 2022-12-04 詳解Go?依賴管理?go?mod?tidy_Golang
- 2022-03-15 Centos7下NFS服務(wù)搭建介紹_Linux
- 2022-07-22 git倉(cāng)庫(kù)的第一次上傳以及修改上傳項(xiàng)目
- 2022-10-15 Golang官方限流器庫(kù)實(shí)現(xiàn)限流示例詳解_Golang
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支