網站首頁 編程語言 正文
在不實現構造函數的情況下,編譯器會自動生成一個默認無參構造函數。但是看起來編譯器自動生成的無參默認構造函數似乎沒有什么用,比如創建p對象時調用了編譯器生成的無參默認構造函數,但是p對象的成員變量依舊是隨機值。
class Person
{
private:
int age;
public:
int getAge()
{
return age;
}
};
int main()
{
Person p;
cout << p.getAge() << endl;
return 0;
}
默認無參構造函數真的沒有用嗎?
我們可以通過下面的代碼來探究默認無參構造函數的作用。
#include<iostream>
#include<string>
using namespace std;
class Person
{
int age;
public:
Person() { cout << "自定義類型成員的默認無參構造函數被調用" << endl; }
//Person(int _age = 0) :age(_age) { cout << "自定義類型成員的全缺省默認構造函數被調用" << 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;
}
上面代碼利用默認無參構造函數創建對象s,根據第一句輸出,我們可以得知默認無參構造函數會先對自定義類型的數據成員會調用自定義數據類型的默認構造函數來處理自定義類型數據成員。根據第二句輸出,我們可以知道默認無參構造函數對基本類型數據成員沒有作處理,只是在初始化列表中用隨機值對其進行了初始化,第三句輸出,是默認無參構造函數調用了自定義類型的默認構造函數對自定義數據成員處理的結果,由于自定義類型的默認構造函數也是默認無參構造函數,所以它不會對基本數據類型成員age作處理,只是在初始化列表中用隨機值對其進行初始化。
我們把第八行代碼屏蔽,放出第九行全缺省默認構造函數試試看,輸出如下:
上面代碼利用默認無參構造函數創建對象s,根據第一句輸出,我們可以得知默認無參構造函數會先對自定義類型的數據成員會調用自定義數據類型的默認構造函數來處理自定義類型數據成員,與之前不同的是,之前自定義數據類型的默認構造函數是默認無參構造函數,這里自定義類型的默認構造函數,是自己定義的全缺省的默認構造函數。根據第二句輸出,我們可以知道默認無參構造函數對基本類型數據成員沒有作處理,只是在初始化列表中用隨機值對其進行了初始化,第三句輸出,是默認無參構造函數調用了自定義類型的全缺省默認構造函數對自定義數據成員處理的結果。
由此我們可以得出結論:
C++把類型分成基本類型和自定義類型。
默認無參默認構造函數對基本類型成員變量不做處理(在初始化列表中用隨機值對其進行初始化),C++11 中針對基本類型成員不初始化的缺陷,又打了補丁,即:基本類型成員變量在類中聲明時可以給默認值。
默認無參構造函數對于自定義類型成員變量才會處理,它會去調用自定義類型的默認構造函數去初始化創建自定義類型的成員變量(對象)。
何時使用編譯器自動生成的無參默認構造函數就夠了,何時需要自己實現構造函數呢?
如果一個類中的成員全是自定義類型,或者基本類型成員在聲明時已經給了缺省值,即無需對基本類型成員變量做處理,且自定義成員都提供了默認構造函數,此時使用編譯器自動生成的無參默認構造函數就可以了。
如果有基本類型的成員變量且需要顯示傳參初始化,即我們需要自己對基本類型成員變量進行處理,或者自定義類型成員沒有默認構造函數,那么就要自己實現構造函數。
原文鏈接:https://blog.csdn.net/weixin_44049823/article/details/127856959
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-06-10 C語言?模擬實現strcpy與strcat函數詳解_C 語言
- 2023-03-05 Suspend函數與回調的互相轉換示例詳解_Android
- 2022-08-10 詳細講解Swift中的類型占位符_Swift
- 2022-08-11 python?rpyc客戶端調用服務端方法的注意說明_python
- 2022-05-04 Spring.Net框架簡介_實用技巧
- 2022-03-16 Oracle數據庫分析函數用法_oracle
- 2022-05-05 Redis數據類型string和Hash詳解_Redis
- 2022-02-07 SSH連服務器提示“Permission denied(publickey,gssapi-keyex
- 欄目分類
-
- 最近更新
-
- 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同步修改后的遠程分支