C++:類與對象,定義類和構造函數

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

//如何讓定義一個類
// 封裝
// 1、將數據和方法定義到一起。
// 2、把想給你看的數據給你看,不想給你看的封裝起來。 ?通過訪問限定符來實現
class Stack
{
public:
?? ?//1.成員函數
?? ?void Push(int x);
?? ?//void Push(int x)
?? ?//{
?? ?//?? ?//...函數體?
?? ?//}//這種是在類里面定義
?? ?void Pop();//這里是類的申明,類外面定義
?? ?bool Empty();
?? ?//....
private:
?? ?//2.成員變量
?? ?int _a;
?? ?int _size;
?? ?int _capacity;//這里是聲明
};

//在類外面定義成員函數
void Stack::Push(int x)
{
?? ?//...
}

// 1、C語言中,struct是用來定義結構體的
// 2、C++中,兼容C的struct定義結構體的用法。但是同時struct也可以用來定義類
// 3、C++中使用class和struct定義類的區別? -》默認的訪問限定符

//C
struct ListNode_C
{
?? ?int* _val;
?? ?struct ListNode_C* _next;
?? ?struct ListNode_C* _prev;
};

//C++
struct ListNode_CPP//默認共有
//class ListNode_CPP//默認私有
{
?? ?int* _val;
?? ?//ListNode_CPP* _next;//這個地方不需要加struct
?? ?struct ListNode_CPP* _next;//這個地方也可以這樣用,C++兼容C

?? ?ListNode_CPP* _prev;//這是C++當成類的用法

?? ?//還可以定義成員函數
?? ?ListNode_CPP* Create(int val);
};

// 1、聲明和定義的區別? 聲明是一種承諾,承諾要干嘛,但是還沒做,定義就是把這個事落地了

//類中既有成員變量,又有成員函數
class A1
{
public:
?? ?void f1()
?? ?{
?? ?}
private:
?? ?int _a;
?? ?char _ch;
};

//類中僅有成員函數
class A2
{
public:
?? ?void f2()
?? ?{
?? ?}

};

//類中既沒有成員函數,也沒有成員變量
class A3
{

};
int main()
{
?? ?//類實例化出對象,相當于定義出了類的成員變量
?? ?Stack s1;
?? ?Stack s2;
?? ?Stack s3;

?? ?//s1._a = nullptr;//私有的,不能訪問
?? ?s1.Push(1);

?? ?//對象中只存儲成員變量,不存儲成員函數?為什么?
?? ?cout << sizeof(s1) << endl;
?? ?// 因為一個類實例化出N個對象,每個對象的成員變量都可以存儲不同的值,但是調用的函數確是同一個
?? ?// 如果每個對象都放成員函數,而這些成員函數卻是一樣的,會浪費空間


?? ?// 如何計算一個類實例化出的對象的大小,計算成員變量之和,并且考慮內存對齊規則
?? ?// 沒有成員變量的類的大小是1,面試題:為什么是1,而不是0。開1個字節不是為了存數據,而是占位
?? ?cout << sizeof(A1) << endl;
?? ?cout << sizeof(A2) << endl;
?? ?cout << sizeof(A3) << endl;

?? ?return 0;
}


實例化 -》就是用自己定義的類型定義出對象
?1、內置類型,基本類型 int/char/double
?2、自定義類型,class/struct

class Date
{
?? ?// this是誰調用這個成員函數,this就指向誰
public:
?? ?void Init(int year, int month, int day)//void Init(Date* this, int year, int month, int day)
?? ?{
?? ??? ?_year = year;
?? ??? ?_month = month;
?? ??? ?_day = day;
?? ?}

?? ?void Print()//void Print(Date* this)
?? ?{
?? ??? ?cout << _year << "-" << _month << "-" << _day << endl;
?? ?}
private:
?? ?int _year;
?? ?int _month;
?? ?int _day;
};

int main()
{
?? ?Date d1;
?? ?d1.Init(2025, 2, 20); //(&d1,2025,2,20);
?? ?d1.Print(); ? ? ? ? ? //(&d1);
?? ?return 0;
}


this指針存在哪里? (也就是存在進程地址空間的哪個區域?)
答:棧上的,因為它是一個形參。(ps:vs下是在ecx這個寄存器,來傳遞)

?1、下面程序能編譯通過嗎?
?2、下面程序會崩潰嗎?在哪里崩潰?
class A
{
public:
?? ?void PrintA()
?? ?{
?? ??? ?cout << _a << endl;
?? ??? ?//cout << this->_a << endl;//會對空指針this進行解引用,會導致程序崩潰
?? ?}

?? ?void Show()
?? ?{
?? ??? ?cout << "Show()" << endl;
?? ?}
private:
?? ?int _a;
};
int main()
{
?? ?A* p = nullptr; //因為p->PrintA();用的是指針,所以p->Print(p)傳的也是指針p
?? ?p->PrintA(); ?//崩潰
?? ?p->Show(); ? ?//正常運行
?? ?//成員函數存在公共的代碼段,所有p->Show()這里不會去p指向的對象上找
?? ?//訪問成員函數,才會去找

?? ?A a;
?? ?a.PrintA();//p->Print(&a);這個地方a是對象,所以傳的是&a,反正傳的都是對象的地址
?? ?return 0;
}


構造函數是特殊的成員函數,需要注意的是,構造函數雖然名稱叫構造,但是構造函數的主要任
務并不是開空間創建對象,而是初始化對象。
1. 函數名與類名相同。
2. 無返回值。
3. 對象實例化時編譯器自動調用對應的構造函數。
4. 構造函數可以重載。

class Date
{
public:
?? ?//構造函數-》在對象構造時調用的函數,這個函數完成初始化工作
?? ?Date(int year, int month, int day)//構造函數沒有返回值
?? ?{
?? ??? ?_year = year;
?? ??? ?_month = month;
?? ??? ?_day = day;
?? ?}

?? ?Date()//函數重載
?? ?{
?? ??? ?_year = 0;
?? ??? ?_month = 1;
?? ??? ?_day = 1;
?? ?}

?? ?void Print()
?? ?{
?? ??? ?cout << _year << "-" << _month << "-" << _day << endl;
?? ?}
private:
?? ?int _year;
?? ?int _month;
?? ?int _day;
};
int main()
{
?? ?//對象實例化時自動調用
?? ?Date d1(2025, 2, 20);
?? ?d1.Print();

?? ?Date d2;//Date d2();不能加括號,調無參的不需要加括號,否則編譯器不認識
?? ?d2.Print();
?? ?return 0;
}

5. 如果類中沒有顯式定義構造函數,則C++編譯器會自動生成一個無參的默認構造函數,一旦
用戶顯式定義編譯器將不再生成。
class Time
{
public:
?? ?Time()
?? ?{
?? ??? ?cout << "Time()" << endl;
?? ??? ?_hour = 0;
?? ??? ?_minute = 0;
?? ??? ?_second = 0;
?? ?}
private:
?? ?int _hour;
?? ?int _minute;
?? ?int _second;
};

class Date
{
public:
?? ?// 如果用戶顯式定義了構造函數,編譯器將不再生成
?? ?// 我們沒有顯式定義的構造函數,這里編譯器生成無參默認的構造函數(語法雙標)
?? ?// 1、針對內置類型的成員變量沒有做處理
?? ?// 2、針對自定義類型的成員變量,調用它的構造函數初始化
?? ?void Print()
?? ?{
?? ??? ?cout << _year << "-" << _month << "-" << _day << endl;
?? ?}
private:
? 基本類型(內置類型)
?? ?int _year;
?? ?int _month;
?? ?int _day;
? 自定義類型
?? ?Time _t;
};

int main()
{
?? ?Date d1;//調用編譯器生成的構造函數
?? ?d1.Print();
?? ?return 0;
}


7. 無參的構造函數和全缺省的構造函數都稱為默認構造函數,并且默認構造函數只能有一個。
注意:無參構造函數、全缺省構造函數、我們沒寫編譯器默認生成的構造函數,都可以認為是默認構造函數。
class Date
{
public:
?? ?//更好的方式:全缺省
?? ?Date(int year = 0, int month = 1, int day = 1)
?? ?{
?? ??? ?_year = year;
?? ??? ?_month = month;
?? ??? ?_day = day;
?? ?}

?? ?//不能和全缺省同時出現,因為調用的時候會出現歧義,Date d1;
?? ?//Date()//函數重載
?? ?//{
?? ?//?? ?_year = 0;
?? ?//?? ?_month = 1;
?? ?//?? ?_day = 1;
?? ?//}

?? ?void Print()
?? ?{
?? ??? ?cout << _year << "-" << _month << "-" << _day << endl;
?? ?}
private:
?? ?int _year;
?? ?int _month;
?? ?int _day;
};

int main()
{
?? ?Date d1;//調用默認構造函數 -》1、自己實現無參的構造函數 ?2、自己實現的全缺省構造函數?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//3、編譯器自動實現的構造函數 Date d1;的特點是不用傳參數?
?? ?d1.Print();
?? ?Date d1(2025, 3, 20);
?? ?d1.Print();
?? ?return 0;
}


class Date
{
public:
?? ?更好的方式:全缺省
?? ?Date(int year = 0, int month = 1, int day = 1)
?? ?{
?? ??? ?_year = year;
?? ??? ?_month = month;
?? ??? ?_day = day;
?? ?}

?? ?不能和全缺省同時出現,因為調用的時候會出現歧義,Date d1;
?? ?Date()//函數重載
?? ?{
?? ??? ?_year = 0;
?? ??? ?_month = 1;
?? ??? ?_day = 1;
?? ?}

?? ?void Print()
?? ?{
?? ??? ?cout << _year << "-" << _month << "-" << _day << endl;
?? ?}
private:
?? ?int _year;
?? ?int _month;
?? ?int _day;
};

int main()
{
?? ?Date d1;
?? ?Date d2;
?? ?return 0;
}

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

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

相關文章

nginx 部署前端vue項目

?? 主頁&#xff1a; ?? 感謝各位大佬 點贊?? 收藏 留言?? 加關注! ?? 收錄于專欄&#xff1a;前端工程師 文章目錄 一、??什么是nginx&#xff1f;二、??nginx 部署前端vue項目步驟 2.1 ??安裝nginx 2.1.1 ??windows環境安裝2.1.2 ??linux環境安裝 2.2 …

藍橋杯備考策略

備賽策略 (1-2周):基礎算法數據結構 (3-5周):動態規劃/貪心圖論 (6-8周):全真模擬查漏補缺 階段1:基礎鞏固(第1-2周) **目標:**掌握基礎數據結構和必考算法&#xff0c;熟悉藍橋杯題型。 學習內容: 數據結構:數組、字符串、棧、隊列、哈希表、二叉樹(遍歷與基本操作)。 基礎…

tmux和vim的基本操作

Tmux Tmux 的核心功能 多窗口和多面板&#xff1a; 在一個終端中創建多個窗口&#xff08;Windows&#xff09;&#xff0c;每個窗口可以運行不同的任務。 在每個窗口中&#xff0c;可以進一步分割成多個面板&#xff08;Panes&#xff09;&#xff0c;實現分屏操作。 會話…

Lineageos 22.1(Android 15) 開機向導制作

一、前言 開機向導原理其實就是將特定的category的Activity加入ComponentResolver&#xff0c;如下 <category android:name"android.intent.category.SETUP_WIZARD"/>然后我們開機啟動的時候&#xff0c;FallbackHome結束&#xff0c;然后啟動Launcher的時候…

【二分搜索 C/C++】洛谷 P1873 EKO / 砍樹

2025 - 02 - 19 - 第 55 篇 Author: 鄭龍浩 / 仟濹(CSND) 【二分搜索】 文章目錄 洛谷 P1873 EKO / 砍樹題目描述輸入格式輸出格式輸入輸出樣例 #1輸入 #1輸出 #1 輸入輸出樣例 #2輸入 #2輸出 #2 說明/提示題目中的部分變量思路代碼 洛谷 P1873 EKO / 砍樹 題目描述 伐木工人…

DeepSeek系列模型發展:從LLM到V3、R1的技術突破與優化各階段的重要論文匯總(附下載地址)

DeepSeek 系列模型從最初的 LLM 版本發展到最新的 V3 和 R1 版本&#xff0c;在架構設計、訓練效率和推理能力方面不斷取得進步。以下是各版本按時間倒序的詳細信息&#xff1a; 1. DeepSeek-R1 發布時間&#xff1a;2025年1月 論文標題&#xff1a;DeepSeek-R1: Incentivizi…

HTTP SSE 實現

參考&#xff1a; SSE協議 SSE技術詳解&#xff1a;使用 HTTP 做服務端數據推送應用的技術 一句概擴 SSE可理解為&#xff1a;服務端和客戶端建立連接之后雙方均保持連接&#xff0c;但僅支持服務端向客戶端推送數據。推送完畢之后關閉連接&#xff0c;無狀態行。 下面是基于…

推薦一款AI大模型托管平臺-OpenWebUI

推薦一款AI大模型托管平臺-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官網地址&#xff1a;https://openwebui.com/ GitHub地址&#xff1a; https://github.com/open-webui/open-webui Open WebUI 是一個可擴展、功能豐富且用戶友好的自托管 AI 平臺&#xff0c;旨在完全離…

js中常用方法整理

數據類型 typeOf()Number&#xff08;&#xff09;parseInt()parseFloat()- * / %檢測數據類型轉換為數字轉換為整數類型轉換為浮點類型非加法的數字運算toString()Boolean()String()轉換為字符串&#xff0c;不能轉換undefined/null字符串拼接轉換為布爾類型轉換為字符串、所有…

java練習(33)

ps:題目來自力扣 最強回文子串 給你一個字符串 s&#xff0c;找到 s 中最長的 回文 子串。 class Solution {public String longestPalindrome(String s) {if (s null || s.length() < 1) {return "";}int start 0, end 0;for (int i 0; i < s.length();…

本地部署DeepSeek大模型

環境&#xff1a;nuc工控機器 x86架構 ubuntu20.04 1、瀏覽器打開Download Ollama on Linux&#xff0c;復制命令。 2.打開終端&#xff0c;輸入命令。 curl -fsSL https://ollama.com/install.sh | sh 等待安裝&#xff0c;安裝完成后&#xff0c;終端輸入 ollama&#xff…

Nginx 常用命令和部署詳解及案例示范

一、Nginx常用命令 1.1 啟動 Nginx 要啟動 Nginx 服務&#xff0c;可以使用以下命令&#xff1a; sudo systemctl start nginx1.2 停止 Nginx 如果需要停止 Nginx 服務&#xff0c;可以使用以下命令&#xff1a; sudo systemctl stop nginx1.3 重啟 Nginx 在修改了 Nginx…

2025鴻蒙開發面試題匯總——通俗易懂

問題和通俗易懂的答案&#xff0c;覆蓋鴻蒙開發的核心知識點和實際場景&#xff0c;方便面試時快速評估候選人能力&#xff1a; 一、基礎概念&#xff08;必問&#xff09; 鴻蒙和安卓最大的區別是什么&#xff1f;舉個實際例子。 答案&#xff1a;鴻蒙是“分布式操作系統”&am…

Kotlin 優雅的接口實現

1. 日常遇到的冗余的接口方法實現 日常開發中&#xff0c;經常會要實現接口&#xff0c;但是很多場景中&#xff0c;只需要用到其中一兩個方法&#xff0c;例如 ActivityLifecycleCallbacks&#xff0c;它有很多個接口需要實現&#xff0c;但是很多時候我們只需要用到其中的一…

Java List 自定義對象排序 Java 8 及以上版本使用 Stream API

從 Java 8 開始&#xff0c;你可以使用 Stream API 對 List 進行排序&#xff0c;這種方式更加簡潔和靈活。 以下是一個示例代碼&#xff1a; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors;// 自定…

【Spring詳解一】Spring整體架構和環境搭建

一、Spring整體架構和環境搭建 1.1 Spring的整體架構 Spring框架是一個分層架構&#xff0c;包含一系列功能要素&#xff0c;被分為大約20個模塊 Spring核心容器&#xff1a;包含Core、Bean、Context、Expression Language模塊 Core &#xff1a;其他組件的基本核心&#xff…

Linux內核讀寫鎖與讀寫信號量的區別及選用

在Linux內核中&#xff0c;讀寫鎖&#xff08;rwlock_t&#xff09;和讀寫信號量&#xff08;struct rw_semaphore&#xff09;是兩種不同的同步機制&#xff0c;適用于不同的場景。以下是它們的區別和選用建議&#xff1a; 核心區別 特性讀寫鎖 (rwlock_t)讀寫信號量 (struct…

用openresty和lua實現壁紙投票功能

背景 之前做了一個隨機壁紙接口&#xff0c;但是不知道大家喜歡對壁紙的喜好&#xff0c;所以干脆在實現一個投票功能&#xff0c;讓用戶給自己喜歡的壁紙進行投票。 原理說明 1.當訪問http://demo.com/vote/時&#xff0c;會從/home/jobs/webs/imgs及子目錄下獲取圖片列表&…

LLaMA 3.1 模型在DAMODEL平臺的部署與實戰:打造智能聊天機器人

文章目錄 前言 一、LLaMA 3.1 的特點 二、LLaMA3.1的優勢 三、LLaMA3.1部署流程 &#xff08;一&#xff09;創建實例 &#xff08;二&#xff09;通過JupyterLab登錄實例 &#xff08;3&#xff09;部署LLaMA3.1 &#xff08;4&#xff09;使用教程 總結 前言 LLama3…

【Python爬蟲(25)】解鎖Python爬蟲:數據存儲的最優選擇與高效策略

【Python爬蟲】專欄簡介&#xff1a;本專欄是 Python 爬蟲領域的集大成之作&#xff0c;共 100 章節。從 Python 基礎語法、爬蟲入門知識講起&#xff0c;深入探討反爬蟲、多線程、分布式等進階技術。以大量實例為支撐&#xff0c;覆蓋網頁、圖片、音頻等各類數據爬取&#xff…