C++基礎語法:類構造函數

前言

? ? ? ?"打牢基礎,萬事不愁" .C++的基礎語法的學習

引入

? ? ? ? 類是實現面向對象思想的主要方法.前面提到:類是函數的變種,類可以通過調用靜態方法或者成員函數來實現邏輯.多數情況下使用成員函數.構造函數是生成類對象成員的必須條件,對此做一些構造函數的歸納

構造函數的目的

? ? ? ?接續:做每件事之前都想想目標是什么.學習也是一樣,想想設計者的思路是什么.?

? ? ? ? 通常情況下類有成員屬性和成員函數.構造函數的目的是為了初始化屬性(給屬性賦初值)

構造函數的形式

? ? ? ? 1>直接賦值:最直觀的形式,也是用得最多的一種,傳入的?形參等于屬性值????????

? ? ? ? 舉例:?

class PersonDirect {std::string name;int age;
public:PersonDirect(const std::string& str,int ag):name(str),age(ag){}
};

?????????調用構造函數生成對象,將名稱和年齡傳入????????

PersonDirect zs_d("張三",40);    //創建一個對象,姓名"張三",年齡40

? ? ? ? 2>部分賦值,不給屬性賦初值也可以.

????????舉例:

class PersonDirectSome {string name;int age;
public:PersonDirectSome(const string& str) :name(str) {}    //沒有給屬性age賦初值void setAge(int ag) { age = ag; }                    //設置屬性age的值int getAge() const { return age; }                   //讀取屬性age的值
};

? ? ? ? 調用構造函數時,傳入名稱

	PersonDirectSome zs_ds("張三");zs_ds.setAge(45);cout << zs_ds.getAge() << endl;

?? ? ? ? 生成對象時age沒有初始化,不報錯.相當于屬性age被"懸掛"起來.唯一注意的是在getAge()之前如果不調用setAge()設置值,則會出現意料之外的結果---相當于隨機訪問了一塊內存地址,地址內值未初始化.

? ? ? ? 給屬性默認賦值,所有對象的屬性用同一個值,比如將上面的構造函數改成

PersonDirectSome(const string& str) :name(str),age(20){} //所有對象age默認為20

? ? ? ? 則所有對象的年齡不需要傳入,都被默認設成20.?

? ? ? ? 3>間接賦值

? ? ? ? 構造函數也表達了形參和屬性之間的一種"因果"聯系.他們不一定是賦值關系.

? ? ? ? 舉例:構造函數中有表示"姓"的字符串fname,用一個字符lname表示"名"的字符串首字母.

class PersonIndirect {string fname;char lname;int age;
public:PersonIndirect(const string& strf, const string& strl ,int ag) :fname(strf), age(ag) {lname = strl.at(0);        //獲得傳入字符串的首字母,交給屬性}char getLname() {              //獲得字符return lname;}
};

? ? ? ? 調用構造函數,輸入表示"姓"和"名"的字符串,生成對象.

	PersonIndirect zs_i("zhang", "san",44);cout << "對象名的首字母是:" << zs_i.getLname() << endl;

默認構造函數

? ? ? ? C++提供了默認構造函數.?舉例:

class Default {												//默認構造函數
private:int age;
public:int getAge() const{ return age; }
};

? ? ? ? 調用默認構造函數生成對象,什么都不用輸入

	Default df;                    //什么都不用輸入,調用默認構造函數生成對象cout << df.getAge() << endl;   //警告"使用未初始化內存",因為沒有給age賦值

? ? ? ? 如果定義了其他構造函數,默認構造函數將失效,上述代碼中Default df;將報錯

? ? ? ? 默認構造函數還是比較有用的,特別在類繼承中,派生對象的生成必須先生成基類對象,派生類的構造函數必須要給基類構造函數傳入參數.如果給基類定義默認構造函數,則可以簡化派生類構造函數.例如:

class Base {									//基類定義int age;
public:Base(int ag):age(ag){}						//基類普通構造函數Base() {									//基類提供默認構造函數							age = 20;}int getAge() const { return age; }
};
class BasePlus : public Base {					//派生類定義string name;
public:BasePlus(const string& na,int ag):Base(ag),name(na){}	//派生類普通構造函數,參數傳給基類構造函數BasePlus(const string&na) :name(na) {}//派生類普通構造函數,忽略傳給基類參數,使用了基類默認構造函數
};

? ? ? ? 調用派生類構造函數,生成派生類對象

	BasePlus lisi("lisi", 30);				//BasePlus普通構造函數,傳入年齡30給基類構造函數cout << "李四的年齡是:" << lisi.getAge() << endl;;BasePlus zs("zs");						//由于基類中定義默認構造函數,簡化了派生類對象生成時的編碼cout << "張三的年齡是:" << zs.getAge() << endl;

?? ? ? ? 所以一般需要自己定義默認構造函數,即類的構造函數兩個以上,含自定義的默認構造函數

? ? ? ? 定義方法也比較簡單,默認給屬性賦值就可以.?

	Base() {							//基類提供默認構造函數							age = 20;}
============================================================BasePlus() {						//派生類默認構造函數Base(20);name = "nobody";}

? ? ? ? 還有一種更為簡單的方法,給構造函數提供默認參數. 但是試了下如果多個函數使用默認參數的情況似乎不行,所以這是一種選項.? ? ? ??

	Base(int ag=20):age(ag){}			//基類普通構造函數,提供默認參數//Base() {							//替換部分							//	age = 20;//}
========================================================

小結

? ? ? ? 有時候覺得C++的語法已經夠復雜的了,像構造函數這些相對簡單的內容要不要搞得那么復雜.學會后總結一些常規用法,以后就是"復制"和"粘貼".

? ? ? ? 小結構造函數的寫法:

? ? ? ? 1>直接賦值,形參和屬性一一對應.這也是用得最多的寫法

? ? ? ? 2>建議自定義默認構造函數,不寫形參,直接給屬性賦值.

? ? ? ? 3>?默認參數,簡化函數調用

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

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

相關文章

【日志消息類的編寫】

日志消息類編寫 由于上篇的代碼比較簡單&#xff0c;今天就多寫兩段代碼順便把日志消息類編寫完成。 這個類的實現就是&#xff1a;什么時間&#xff0c;哪個線程&#xff0c;哪個文件的哪一行&#xff0c;發生了什么等級的日志&#xff0c;日志機器名字是什么&#xff0c;日…

20240628 每日AI必讀資訊

&#x1f4da; Hugging Face 推出新版開源大模型排行榜&#xff0c;中國模型 Qwen-72B 奪冠 - 阿里Qwen-2-72B指令微調版本問鼎全球開源大模型排行榜榜首 - Llama-3-70B 微調版本排名第二&#xff0c;而 Mixtral-8x22B 微調版本位居第四。 - 另外&#xff0c;微軟的 Phi-3-M…

三種分布式鎖實現方式

目錄 1、數據庫自增 2、Redis自增 3、Zookeeper 4、其他 4.1、雪花算法 4.2、Tinyid 4.3、Leaf 4.4、數據庫號段 1、數據庫自增 利用數據庫表的自增特性&#xff0c;或主鍵唯一性&#xff0c;實現分布式ID REPLACE INTO id_table (stub) values (’a‘) ; SELECT LA…

社交App廣告優化新篇章:Xinstall引領用戶體驗升級,助力買量效果提升

隨著移動互聯網的快速發展&#xff0c;社交App已經成為人們生活中不可或缺的一部分。然而&#xff0c;在競爭激烈的市場環境下&#xff0c;如何有效地進行廣告投放&#xff0c;吸引并留住用戶&#xff0c;成為了每個社交App運營者面臨的重大挑戰。今天&#xff0c;我們就來談談…

自費5K,測評安德邁、小米、希喂三款寵物空氣凈化器誰才是高性價比之王

最近&#xff0c;家里的貓咪掉毛嚴重&#xff0c;簡直成了一個活生生的蒲公英&#xff0c;家中、空氣中各處都彌漫著貓浮毛甚至所有衣物都覆蓋著一層厚厚的貓毛。令人難以置信的是&#xff0c;有時我甚至在摳出的眼屎中都能發現夾雜著幾根貓毛。真的超級困擾了。但其實最空氣中…

Packer-Fuzzer一款好用的前端高效安全掃描工具

★★免責聲明★★ 文章中涉及的程序(方法)可能帶有攻擊性&#xff0c;僅供安全研究與學習之用&#xff0c;讀者將信息做其他用途&#xff0c;由Ta承擔全部法律及連帶責任&#xff0c;文章作者不承擔任何法律及連帶責任。 1、Packer Fuzzer介紹 Packer Fuzzer是一款針對Webpack…

4.if 條件判斷

1.if-else語句 if #判斷條件 :pass else:pass2.if - elif- else if #判斷條件 :pass elif #判斷條件:pass else:pass3.if語句可以嵌套 if #判斷條件 :passif #判斷條件 :pass 4.邏輯運算符 and 兩個都為真,才是真 or 一個為真 即是真 not 取反 and從左到右,所有值為真,返回…

麒麟系統安裝MySQL

搞了一整天&#xff0c;終于搞定了&#xff0c;記錄一下。 一、背景 項目的原因&#xff0c;基于JeecgBoot開發的系統需要國產化支持&#xff0c;這就需要在電腦上安裝MySQL等支撐軟件。 國產化項目的操作系統多是麒麟系統&#xff0c;我的系統如下&#xff1a; arm64架構。…

C#快速開發OPCUA服務器

為方便演示&#xff0c;此時創建一個控制臺應用程序。第三方dll(C編寫的庫opcsrv.dll&#xff0c;他人實現)。 拷貝dll到運行目錄下&#xff1a; 拷貝二次封裝后的文件到項目目錄下&#xff1a; 第一步&#xff1a;創建OpcUa服務器 //第一步&#xff1a;創建OpcUa服務器 OPCSr…

java.util.Optional類介紹

java.util.Optional 是 Java 8 引入的一個容器類,用于表示可能包含或不包含非空值的對象。它的設計初衷是為了減少程序中的空指針異常(NullPointerException),并使代碼更加簡潔和易讀。 Optional 類的介紹 1. 特點 避免顯式的 null 檢查:使用 Optional 可以避免顯式的 n…

基于ssh框架的個人博客源碼

基于ssh的個人博客源碼&#xff0c;頁面清爽簡潔&#xff0c;原先有部分bug,運行不了&#xff0c;現已修復 1.博客首頁 &#xff08;本地訪問地址 :localhost:8080/Blog/index/index&#xff09; 2.關于我 3.慢生活 4.留言板 5.我的相冊 微信掃碼下載源碼

商場配電新思維:智能網關驅動的自動化管理系統

在商場配電室監控系統中&#xff0c;主要是以無線網絡為載體&#xff0c;目的就是便于對變電站等實時監測與控制。其中&#xff0c;4G配電網關非常關鍵&#xff0c;可以將配電室系統終端上的信息數據及時上傳到服務器&#xff0c;再由服務器下達控制指令到各模塊中&#xff0c;…

Oracle Database 23ai新特性之INTERVAL聚合函數增強

Oracle Database 23ai 開始 AVG 以及 SUM 函數支持 INTERVAL 數據類型&#xff0c;它們可以作為聚合函數或者分析函數使用。 示例表 本文將會使用以下示例表&#xff1a; create table t1 (id integer,start_time timestamp,end_time timestamp,duration in…

超越規模的冒險之旅:引導人工智能價值對齊

在茫茫技術之林中&#xff0c;人工智能憑借大模型占據了重要地位。人們已經不再局限于人機對弈和AI識圖&#xff0c;開始探索那些能夠模仿人類思考的機器。無論是日常聊天、文本寫作&#xff0c;還是[在完美的提示詞引導下創作出驚艷的詩歌]&#xff0c;我們不得不承認AI工具已…

雙指針算法第二彈(查找總價格為目標值的兩個商品-和為s的兩個數字 三數之和 四數之和)

系列文章目錄 《雙指針算法第一彈&#xff08;移動零 復寫零 快樂數&#xff09;》鏈接&#xff1a;http://t.csdnimg.cn/Nqdvn 目錄 系列文章目錄 前言 1. 查找總價格為目標值的兩個商品 &#xff08;1&#xff09;題目及示例 &#xff08;2&#xff09;思路&#xff08…

純css寫一個動態圣誕老人

效果預覽 在這篇文章中&#xff0c;我們將學習如何使用CSS來創建一個生動的圣誕老人動畫。通過CSS的魔力&#xff0c;我們可以讓圣誕老人在網頁上搖擺&#xff0c;仿佛在向我們招手慶祝圣誕節和新年。 實現思路 實現這個效果的關鍵在于CSS的keyframes動畫規則以及各種CSS屬性…

想要打造高效活躍的私域社群,這些技巧要知道

對一些企業來說“做社群等于做私域”。 在騰訊提到的私域轉化場景中&#xff0c;社群與小程序、官方導購三者并列。 社群連接著品牌和群內用戶。品牌通過圈住更多用戶&#xff0c;來持續免費觸達用戶實現變現&#xff0c;用戶則是從品牌方手中直接獲取更多服務和優惠。那么&a…

【絕對有用】yolo系列目標檢測 核心技術點 匯總

YOLO (You Only Look Once) 是一種高效的目標檢測算法&#xff0c;它以速度和精度著稱。YOLO 的工作原理是將目標檢測視為一個回歸問題&#xff0c;直接從圖像的像素空間預測目標的類別和位置。YOLO 目標檢測頭包括以下幾個關鍵部分&#xff1a; 輸入圖像處理&#xff1a; YOLO…

云計算【第一階段(19)】磁盤管理與文件系統 LVM與磁盤配額(二)

目錄 一、LVM概述 1.1、LVM機制的基本概念 ?編輯 1.2、LVM的管理命令 1.3、lvm存儲 兩種機制 1.4、lvm應用實例 二、磁盤配額概述 2.1、設置磁盤配額 2.2.1、實現磁盤限額的條件 2.2.2、linux磁盤限額的特點 2.2.3、磁盤配額管理 一、LVM概述 1.1、LVM機制的基本概…

用Python制作一個簡單的計算器(加減乘除)

簡易計算器 寫在前面 小編用python實現了一個簡單的計算器&#xff0c;一起來看看吧~ 需要環境&#xff1a; pycharm python 一、需求分析 1.1 功能分析 使用Python的Tkinter界面設計實現一個簡單的計算器&#xff0c;主要功能按鈕包括數字鍵、四則運算符、等于號和清除…