C++ 面向對象 - 對象定義方法匯總

C++對象定義方法匯總

1. 棧上定義方式

1.1 調用無參構造函數的定義方式

無參構造函數有兩種:

  • 默認無參構造函數
    Demo(){}
    
  • 默認值列表構造函數
    Demo():a{1},b{2}{}	// 使用初始化列表實現
    

對象定義方式

Demo d;	
Demo d1{}; 
// 以下定義方式還調用了拷貝構造函數
Demo d2 = Demo();
Demo d3 = Demo{};

🚫 注意事項:

  • 一個類只能有一個無參構造函數:無參構造函數的參數列表都為空,無法實現函數重載。
  • 不能使用對象名()調用無參構造函數
  • 可以使用類名()的方式創建對象
  • 推薦使用花括號定義對象

示例

class Demo1{
public:// 無參構造函數Demo(){cout << "無參構造函數"}
}class Demo2{
private:int a;int b;
public:// 默認值列表構造函數Demo():a{1},b{2}{cout << "默認值列表構造函數"<< endl;}
}int main()
{// 棧變量Demo1 d1;	// 調用無參構造函數Demo2 d2{};  // 調用無參構造函數Demo1 d3 = Demo1();Demo2 d4 = Demo2{};// Demo2 d3(); // 錯誤
}
1.2 調用有參構造函數的定義方式

有參構造函數通過不同的參數列表進行重載。一個類中可以存在多個有參構造函數。
有參構造函數也可以使用參數默認值簡化重載。包括兼并無參構造函數。

有參構造函數定義:

Demo(int a, int b):a(a),b(b){}

帶默認值的有參構造函數定義:

Demo(int a = 1):a(a),b(1){}

此有參構造函數兼并無參構造函數,若定義了無參構造函數則會起沖突。

對象定義方式
調用有參構造函數的對象定義通過(){}來傳遞參數。
主流推薦使用{}

Demo d(2);	
Demo d1{2, 3}; 
// 以下定義方式還調用了拷貝構造函數
Demo d2 = Demo(2, 3);
Demo d3 = Demo{2};

示例

#include <iostream>
using namespace std;class Demo{
private:int a;int b;
public:// 帶默認值的有參構造函數,可替代無參構造函數Demo(int a = 1):a{a},b{2}{cout << "帶默認值的有參構造函數"<< endl;}// 初始化列表構造函數Demo(int a, int b):a{a},b{b}{cout << "初始化列表構造函數"<< endl;}
};int main()
{// 棧變量Demo d1;	// 有參構造函數Demo d2{3};	// 有參構造函數Demo d3{3, 4};  // 初始化列表構造函數Demo d4(3, 4);  // 初始化列表構造函數Demo d5 = Demo(2);	// 有參構造函數Demo d6 = Demo{2};	// 有參構造函數Demo d7 = Demo(2,6);	// 初始化列表構造函數Demo d8 = Demo{2,6};	// 初始化列表構造函數return 0;
}
1.3 調用拷貝構造函數的定義方式

拷貝構造函數是在用同類對象來定義新對象時調用。已經規定死了它的函數名和參數列表,所以不存在重載,一個類也只有一個拷貝構造函數。
拷貝構造函數定義:

Demo(const Demo& d):a{d.a},b{d.b}{}

對象定義方式
拷貝構造函數是一種有參構造函數,遵循有參構造函數的對象定義方式。也有一種獨特的定義方式:=

Demo d1;	// 要先存在一個用來拷貝的對象
Demo d2(d1);
Demo d3{d1};
Demo d4 = d1;	// 對象定義時,= 號調用的是拷貝構造函數
Demo d4 = Demo();	// 通過臨時對象來定義新對象

示例

#include <iostream>
using namespace std;class Demo{
private:int a;int b;
public:// 帶默認值的有參構造函數,可替代無參構造函數Demo(int a = 1):a{a},b{2}{cout << "帶默認值的有參構造函數"<< endl;}// 拷貝構造函數Demo(const Demo& d):a{d.a},b{d.b}{cout << "拷貝構造函數"<< endl;}
};int main()
{// 棧變量Demo d1;	// 有參構造函數// 拷貝構造函數Demo d11(d1);Demo d12{d1};Demo d13 = d1;Demo d2 = Demo(2);	// 有參構造函數Demo d3 = Demo{2};	// 有參構造函數return 0;
}

2. 堆上定義方式

堆上定義對象主要通過堆操作符new來實現,它返回一個對象指針。

1.1 調用無參構造函數的定義方式
Demo *pd = new Demo;		// 無參構造函數Demo *pd10 = new Demo[2];	// 無參構造函數,返回對象數組Demo *pd2 = new Demo();		// 無參構造函數Demo *pd3 = new Demo{};		// 無參構造函數
1.2 調用有參構造函數的定義方式
Demo *pd4 = new Demo(1);	// 有參構造函數
Demo *pd5 = new Demo{1};	// 有參構造函數
1.3 調用拷貝構造函數的定義方式
Demo d1;
Demo *pd1 = new Demo(d1);
Demo *pd2 = new Demo{d1};

3. 總結

對象定義方式有兩大類:

  • 對象名類名 對象名;
  • 類名類名()
    對象定義的三小類:
  • 無參構造:可無符號、可帶(){}。變量名不能帶(),類名可以帶()
  • 有參構造:可通過(){}傳遞參數。
  • 拷貝構造:由(){}=傳遞同類對象參數。

對象定義是指對象第一次創建,構造函數只會在對象第一次創建的時候調用,若是已有對象使用了與對象定義相似的格式,必定不會調用構造函數。

4. 綜合示例

#include <iostream>
using namespace std;class Demo{
private:int a;int b;
public:// 無參構造函數
//	Demo(){cout << "無參構造函數"}// 默認值列表構造函數Demo():a{1},b{2}{cout << "無參構造函數"<< endl;}// 有參構造函數Demo(int a):a{a},b{2}{cout << "有參構造函數"<< endl;}// 初始化列表構造函數Demo(int a, int b):a{a},b{b}{cout << "初始化列表構造函數"<< endl;}// 拷貝構造函數Demo(const Demo& d):a{d.a},b{d.b}{cout << "拷貝構造函數"<< endl;}// 賦值運算符重載Demo& operator=(const Demo& d){cout << "賦值運算符重載"<< endl;if(this == &d) return *this;a = d.a;b = d.b;return *this;}
};int main()
{// 棧變量Demo d;	// 無參構造函數Demo d1{};  // 無參構造函數Demo d2{3};	// 有參構造函數Demo d3{3, 4};  // 初始化列表構造函數Demo d4(3, 4);  // 初始化列表構造函數Demo d5 = Demo();	// 無參構造函數Demo d6 = Demo{};	// 無參構造函數Demo d7 = Demo(2);	// 有參構造函數Demo d8 = Demo{2};	// 有參構造函數Demo d9 = Demo(2,6);	// 初始化列表構造函數Demo d10 = Demo{2,6};	// 初始化列表構造函數// 堆變量Demo *pd = new Demo;		// 無參構造函數Demo *pd10 = new Demo[2];Demo *pd2 = new Demo();		// 無參構造函數Demo *pd3 = new Demo{};		// 無參構造函數Demo *pd4 = new Demo(1);	// 有參構造函數Demo *pd5 = new Demo{1};	// 有參構造函數Demo *pd6 = new Demo(1, 2);	// 初始化列表構造函數Demo *pd7 = new Demo{1, 2};	// 初始化列表構造函數// 拷貝構造函數Demo d11(d4);Demo d12{d4};Demo d13 = d3;Demo *pd8 = new Demo(d4);Demo *pd9 = new Demo{d4};// 賦值運算符重載d11 = d3;*pd9 = d4;return 0;
}

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

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

相關文章

指尖上的魔法:優雅高效的Linux命令手冊

一、Linux基礎指令 1. ls ls&#xff1a;對于目錄&#xff0c;列出該目錄下的所有子目錄與文件&#xff0c;對于文件&#xff0c;將列出文件名以及其他信息。 -a&#xff1a;列出目錄下的所有文件&#xff0c;包含以.開頭的隱藏文件 -l:列出文件的詳細信息 -d&#xff1a;將目錄…

《磁力下載工具實測:資源搜索+高速下載一站式解決方案》

嘿&#xff0c;朋友們&#xff01;我是阿燦&#xff0c;今天給大家帶來一個超實用的看片神器&#xff0c;特別適合老司機們使用&#xff0c;保證讓你眼前一亮&#xff01;推薦一款比某雷更好用的下載工具&#xff0c;搭配資源搜索神器&#xff0c;輕松獲取資源不限速。超強磁力…

Go網絡編程基礎:網絡模型與協議棧概述 - 從理論到實踐的完整指南

1. 引言 在當今的互聯網時代&#xff0c;網絡編程已經成為后端開發的核心技能。Go語言以其出色的并發性能和簡潔的語法&#xff0c;在網絡編程領域展現出了強大的優勢。從Docker、Kubernetes到眾多微服務框架&#xff0c;Go已經成為構建高性能網絡應用的首選語言之一。 你是否…

Web攻防-SSTI服務端模版注入利用分類語言引擎數據渲染項目工具挖掘思路

知識點&#xff1a; 1、WEB攻防-SSTI-利用分類&功能點 2、WEB攻防-SSTI-利用項目&挖掘思路 SSTI(Server Side Template Injection) 服務器模板注入, 服務端接收了用戶的輸入&#xff0c;將其作為 Web 應用模板內容的一部分&#xff0c;在進行目標編譯渲染的過程中&…

李沐動手學深度學習Pytorch-v2筆記【07自動求導代碼實現】

文章目錄前言自動求導實現非標量變量的反向傳播分離計算Python控制流的梯度計算前言 關于走動求導的理論知識個人有點難以理解&#xff0c;推薦大家去看https://blog.csdn.net/weixin_42831564/article/details/135658138這篇文章&#xff0c;講的很好。 自動求導實現 impor…

strchr 與 strstr 函數詳解

一.strchr - 字符查找函數1.函數原型char *strchr(const char *str, int c);2.核心功能在字符串中查找特定字符的第一次出現位置3.參數說明參數 類型 說明str const char* 要搜索的字符串c int 要查找的字符&#xff08;自動轉換為char&#xff09;4.返回值…

jakes信道模型

Jakes 模型 前面我們介紹了多徑信道合成信號可表示為&#xff1a; r(t)Re{∑i0N(t)?1ai(t)u(t?τi(t))ej2πfc(t?τi(t))?Di(t)} r(t)Re \left\{\sum_{i0}^{N(t)-1}a_{i}(t)u(t-\tau_{i}(t))e^{j2\pi f_{c}(t-\tau_{i}(t))\phi_{D_{i}}(t)} \right\} r(t)…

JVM類加載機制解析

什么是類加載器&#xff1f; 類加載器是JVM的核心組件之一&#xff0c;負責將Java字節碼文件&#xff08;.class文件&#xff09;加載到JVM內存中。由于JVM只能執行二進制字節碼&#xff0c;類加載器的作用就是將編譯后的.class文件轉換為JVM可以理解和執行的格式&#xff0c;使…

用Python和OpenCV從零搭建一個完整的雙目視覺系統(二)

本系列文章旨在系統性地闡述如何利用 Python 與 OpenCV 庫&#xff0c;從零開始構建一個完整的雙目立體視覺系統。 本項目github地址&#xff1a;https://github.com/present-cjn/stereo-vision-python.git 項目架構設計&#xff1a;藍圖、分工與工作流 在上一篇文章中&#…

億級流量下的緩存架構設計:Redis+Caffeine多級緩存實戰

億級流量下的緩存架構設計&#xff1a;RedisCaffeine多級緩存實戰 一、為什么需要多級緩存&#xff1f; 在億級流量場景下&#xff0c;單純依賴Redis會遇到三大瓶頸&#xff1a;網絡延遲&#xff1a;Redis遠程訪問通常需要1-5ms&#xff0c;QPS超過10萬時成為瓶頸資源成本&…

AI基建還能投多久?高盛:2-3年不是問題,回報窗口才剛開啟

高盛表示&#xff0c;盡管AI商業化變現仍處早期階段&#xff0c;但基于成本削減的第一階段回報已經顯現。預測到2030年AI自動化可為財富500強企業節省約9350億美元成本。分析師認為&#xff0c;這一早期收益足以支撐當前AI基礎設施投資水平&#xff0c;盡管增長率可能放緩。雖然…

【mac】快捷鍵使用指南

在Mac上&#xff0c;根據選擇對象的不同&#xff0c;在選擇時移動的方法也有所不同&#xff0c;以下是具體介紹&#xff1a; 移動文件或文件夾&#xff1a;可通過拖放操作移動。打開“訪達”&#xff08;Finder&#xff09;&#xff0c;找到要移動的文件或文件夾&#xff0c;按…

CS144 lab2 tcp_receiver

1. 實驗目的 lab2 的目的是實現tcp的接收端。 主要包括兩方面 &#xff08;1&#xff09; 從發送端接收消息&#xff0c;使用Reassembler聚合字節流&#xff08;Bytestream&#xff09; &#xff08;2&#xff09;將確認號&#xff08;ackno&#xff09;和window size發回對端 …

【論文筆記】A Deep Reinforcement Learning Based Real-Time Solution Policy for the TSP

《基于 DRL 和 DCNN 的實時 TSP 求解策略》IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS, VOL. 24, NO. 6, JUNE 2023一段話總結本文提出了一種基于深度強化學習&#xff08;DRL&#xff09; 和深度卷積神經網絡&#xff08;DCNN&#xff09; 的實時旅行商問題&am…

MMaDA:多模態大型擴散語言模型

集眾家之所長&#xff0c;成大一統。普林斯頓大學、北京大學、清華大學、字節跳動的研究者將“文本推理、多模態分析、圖像生成”三大方向融合在一個單一擴散模型里&#xff0c;并用恰當的優化策略來提升模型在各個方向的性能。 研究動機 研究人員致力于開發一個能夠處理多種模…

容器技術入門與Docker環境部署

容器技術入門與Docker環境部署Docker概述什么是 DockerDocker 的優勢Docker 的應用場景Docker 核心概念(1)鏡像(2)容器(3)倉庫Docker 安裝1.關閉系統防火墻和內核2.下載Docker的repo文件3.替換倉庫地址4.更新索引文件并安裝Docker5.添加國內鏡像站6.開啟Docker服務7.優化內核參…

【01】MFC入門到精通—— MFC新建基于對話框的項目 介紹(工作界面、資源視圖 、類視圖)

文章目錄1 創建工程2 運行3 工作界面介紹3. 1 類視圖 Class View3.2 如何打開 類視圖3.3 資源視圖1 創建工程 選擇菜單項 文件->新建->項目&#xff0c;彈出 “新項目” 對話框。 選擇 MFC&#xff0c;點擊下一步&#xff0c;然后鍵入工程名稱&#xff0c;本例取名“Add…

2025!在Windows的Python中安裝GDAL包(小白能成!)

最近更新 在2025.06.05日&#xff0c;GDAL發布預告&#xff1a;新版本將適配pipeline和向量讀寫功能。 直到2025.06.25日&#xff0c;最新的版本才算發行出來。 有朋友催我趕緊更新教程&#xff0c;我上次更新是3月份的時候了&#xff0c;恰好是GDAL上一個版本出來的時間。 前…

Python第一次作業

# 1.技術面試題**&#xff08;1&#xff09;TCP與UDP的區別是什么&#xff1f;****答&#xff1a;TCP 是 “可靠但較慢” 的協議&#xff0c;適合對數據完整性要求高的場景&#xff1b;UDP 是 “快速但不可靠” 的協議&#xff0c;適合對實時性要求高的場景。兩者互補&#xff…

Linux【大數據運維】下制作Redis綠色免安裝包(一)

linux下安裝Redis比較繁瑣&#xff0c;遇到內網部署環境更是麻煩。根據經驗將Redis打包一個綠色版進行使用。 大體思路&#xff0c;在一臺正常的機器上面制造好安裝包&#xff0c;然后上傳到內網服務器&#xff0c;解壓使用。 下載&#xff1a; wget https://download.redis…