c++的類開發第一篇

来源:https://www.cnblogs.com/ivanlee717/p/18008529
-Advertisement-
Play Games

class_1 什麼是介面? 類就是一種公共介面,公眾(public)是使用類的程式,交互系統由類對象組成,而介面由編寫類的人提供的方法組成。介面讓程式員能夠編寫與類對象交互的代碼,從而讓程式能夠使用類對象。例如,要計算 string 對象中包含多少個字元,您無需打開對象,而只需使用string類提 ...


class_1

什麼是介面?

類就是一種公共介面,公眾(public)是使用類的程式,交互系統由類對象組成,而介面由編寫類的人提供的方法組成。介面讓程式員能夠編寫與類對象交互的代碼,從而讓程式能夠使用類對象。例如,要計算 string 對象中包含多少個字元,您無需打開對象,而只需使用string類提供的size()方法。類設計禁止公共用戶直接訪問類,但公眾可以使用方法size()。

oop風格

OOP(面向對象編程)是一種編程範式,它將程式組織為相互交互的對象。這種編程風格基於對象的概念,其中對象是通過封裝數據和操作數據的方法(即類中的成員函數)來表示的。

OOP 風格的編程主要關註以下幾個核心概念:

  1. 封裝(Encapsulation):將數據和對數據的操作封裝到一個類中,通過限制對數據的直接訪問來保護數據的完整性。只有類中定義的方法可以訪問和修改數據,外部無法直接訪問數據。
  2. 繼承(Inheritance):通過繼承機制,子類可以繼承父類的屬性和方法,並且可以在此基礎上進行擴展或修改。繼承可以提高代碼的重用性和可維護性。
  3. 多態(Polymorphism):多態允許對象根據所處的上下文環境以不同的方式進行操作。通過多態,可以通過基類指針或引用調用派生類中的方法,實現動態綁定和運行時多態性。
  4. 抽象(Abstraction):抽象是指從具體的事物中抽取出共同的特征和行為,形成類的概念。通過抽象,可以定義介面和基類,隱藏具體實現細節,提高代碼的可擴展性和靈活性。

OOP 風格的編程可以使代碼更具有模塊化、可維護性和可擴展性。它將現實世界中的事物和關係映射到程式設計中,使得代碼更貼近問題領域的語義,更易於理解和維護。

在使用 OOP 風格編程時,通常會定義類、對象、繼承關係和介面等概念來描述問題和解決方案。C++ 是一種支持面向對象編程的語言,並且提供了類、繼承、多態等特性以支持 OOP 風格的編程。

無論類成員是數據成員還是成員函數,都可以在類的公有部分或私有部分中聲明它。但由於隱藏數據是OOP主要的目標之一,因此數據項通常放在私有部分,組成類介面的成員函數放在公有部分:否則,就無法從程式中調用這些函數。正如Stock聲明所表明的,也可以把成員函數放在私有部分中。不能直接從程式中調用這種函數,但公有方法卻可以使用它們。通常,程式員使用私有成員函數來處理不屬於公有介面的實現細節。不必再類聲明的時候使用關鍵字private,因為這是類對象的預設訪問控制

頭文件的類聲明

在C++中,.h 文件通常是用於聲明類、函數、變數和其他代碼實體的頭文件(header file)。頭文件的作用是提供一種將程式的聲明與定義分離的機制,在不暴露實現細節的情況下,讓其他源文件可以訪問和使用這些聲明。

頭文件通常包含以下內容:

  1. 類的聲明:頭文件中可以包含類的聲明,包括成員變數和成員函數的原型(聲明)。
  2. 函數的聲明:頭文件可以包含函數的原型(聲明),使得其他源文件可以調用這些函數。
  3. 常量和巨集定義:頭文件中可以定義常量和巨集,以供其他源文件使用。
  4. 類型定義和類型別名:頭文件中可以進行類型定義和類型別名的聲明,以提供更具有可讀性和可維護性的代碼。

頭文件通常與對應的源文件(.cpp 文件)配合使用。源文件包含類的實現和函數的具體定義,而頭文件則包含對類和函數的聲明。通過包含頭文件,其他源文件可以在編譯時瞭解到需要使用的類、函數或常量的結構和介面,從而能夠正確地進行鏈接和調用。

為了避免頭文件被重覆包含造成編譯錯誤,通常會在頭文件的開頭添加預處理器指令,如下所示:

#ifndef HEADER_NAME_H
#define HEADER_NAME_H

// 頭文件內容

#endif

這些預處理器指令會檢查是否已定義頭文件的標識符(HEADER_NAME_H),如果沒有定義,則對頭文件進行包含,否則跳過頭文件的內容。這樣可以確保同一個頭文件不會被重覆包含。

總結來說,.h 文件是用於聲明類、函數、變數和其他代碼實體的頭文件,在編程中起到了提供介面和分離聲明與定義的作用。

#pragma once
#ifndef STOCK00_H_
#define STOCK00_H_

#include <string>
using namespace std;
class Stock {
private:
	string company;
	long shares;
	double share_val;
	double total_val;
	void set_total() {
		total_val = shares * share_val;
	}
public:
	void acquire(const string& co, long n, double pr);
    /*const string& co 中的 & 符號表示該參數是一個引用。使用引用作為函數參數可以避免在函數調用時進行額外的拷貝操作,提高了性能和效率。

const 關鍵字表示對傳入的 co 參數進行只讀操作,即在函數內部不會修改該參數的值。這樣設計是為了保證在函數調用中不會無意間修改傳入的字元串對象。

將參數聲明為引用類型有以下幾個優點:

避免了不必要的拷貝:如果不使用引用,而是直接傳遞 string 對象作為參數,那麼在函數調用時會進行一次拷貝操作,將實參的值複製給形參。對於較大的字元串,拷貝操作可能會帶來較大的開銷,使用引用可以避免這種開銷。
可以修改傳入的對象:雖然在這個例子中 co 被聲明為 const 引用,不可修改,但通常情況下,如果不使用 const 修飾符,函數可以通過引用修改傳入的對象的值,從而達到傳入參數的輸出效果。
簡化函數調用語法:使用引用作為參數類型時,可以直接傳遞對象而無需取地址或者使用指針。這樣可以簡化函數調用的語法,使代碼更加簡潔。
綜上所述,使用 const string& 作為函數參數類型可以提高性能和效率,並且在函數調用時更加方便和簡潔。*/
	void buy(long num, double price);
	void sell(long num, double price);
	void update(double price);
	void show();
};

#endif
  1. 定義成員函數時,使用作用域解析運算符(::)來標識函數所屬的類;
  2. 類方法可以直接訪問類的private組件
#include<iostream>
using namespace std;
#include "stock00.h"

void Stock::acquire(const string& co, long n, double pr) {
	company = co;
	if (n < 0) {
		cout << "number of shares can not be negative; "
			<< company << "shares set to 0\n";
	}
	else {
		shares = n;
	}
	share_val = pr;
	set_total();

}

void Stock::buy(long num, double price) {
	if (num < 0) {
		cout << "number of shares purchased can not be negative. "
			<< "transaction is abouted. \n";
	}
	else {
		shares += num;
		share_val = price;
		set_total();
	}
}

void Stock::sell(long num, double price) {
	if (num < 0) {
		cout << "number of shares sold can not be negative. "
			<< "transaction is abouted. \n";
	}
	else if (num > shares) {
		cout << "you can not sell more than you have! "
			<< "transaction is abouted. \n";
	}
	else {
		shares -= num;
		share_val = price;
		set_total();
	}
}

void Stock::update(double price) {
	share_val = price;
	set_total();
}

void Stock::show() {
	cout << "Company: " << company
		<< "Shares: " << shares << '\n'
		<< "Share Price: $" << share_val
		<< "Total Worth: $" << total_val << endl;
}

這樣子對於一個類的聲明和方法都已經寫好了。其實簡單一點也能放在一起寫,但是這樣寫更符合開發習慣。

//useStock.cpp
#include<iostream>
using namespace std;
#include "stock00.h"

int main() {
	Stock regina;
	regina.acquire("ivanlee", 20, 12.5);
	regina.show();
	regina.buy(20, 12.7);
	regina.show();
	regina.sell(400, 20);
	regina.show();
	regina.buy(127717, 40.127);
	regina.show();
	regina.sell(127717, 40.128);
	regina.show();
	return 0;
}

image-20240205153233564

但是這個科學計數法讓我們不知道具體數字,可以定義cout.setf(ios_base::fixed, ios_base::floatfield);

image-20240205153613587

普通設置一個類

設計立方體類(Cube),求出立方體的面積( 2ab + 2ac + 2bc )和體積( a * b * c),分別用全局函數和成員函數判斷兩個立方體是否相等image-20240205153715533基本類的使用就算是明白了

#include<iostream>
using namespace std;
class Cube {
private:
	double high;
	double wid;
	double length;
public:
	void set_high(double n) { high = n; }
	void set_wid(double n) { wid = n; }
	void set_length(double n) { length = n; }
	double get_high() { return high; }
	double get_wid() { return wid; }
	double get_length() { return length; }
	double calculate_V() { return high * wid * length; }
	double calculate_S() { return 2 * (high * wid + high * length + wid * length); }
	bool Compare_V(Cube C) {
		if (C.calculate_V() == calculate_V()) {
			return true;
		}
		return false;
	}
	bool Compare_S(Cube C) {
		if (C.calculate_S() == calculate_S()) {
			return true;
		}
		return false;
	}

};

bool compare_V(Cube a, Cube b) {
	if (a.calculate_V() == b.calculate_V()) {
		return true;
	}
	else { return false; }
}
bool compare_S(Cube a, Cube b) {
	if (a.calculate_S() == b.calculate_S()) {
		return true;
	}
	else { return false; }
}

int main() {
	Cube regina;
	Cube ivan;
	regina.set_high(1);
	regina.set_length(2);
	regina.set_wid(7);
	ivan.set_high(1);
	ivan.set_length(7);
	ivan.set_wid(7);

	if (ivan.Compare_S(regina)) {
		cout << "ivan_S" << endl;
	}
	else {
		cout << "regina_S" << endl;
	}
	if (regina.Compare_V(ivan)) {
		cout << "regina_V" << endl;
	}
	else {
		cout << "ivan_V" << endl;
	}
	return 0;	
}

本文來自博客園,作者:ivanlee717,轉載請註明原文鏈接:https://www.cnblogs.com/ivanlee717/p/18008529


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、java鎖存在的必要性 要認識java鎖,就必須對2個前置概念有一個深刻的理解:多線程和共用資源。 對於程式來說,數據就是資源。 在單個線程操作數據時,或快或慢不存在什麼問題,一個人你愛乾什麼乾什麼。 多個線程操作各自操作不同的數據,各乾各的,也不存在什麼問題。 多個線程對共用數據進行讀取操作, ...
  • 讀了啥 周志明的深入理解Java虛擬機中的調優案例。 第一個案例 背景 一個網站部署在JVM上,而Java堆大小固定在了12G,但是總會出現長時間無法響應的情況。 使用了吞吐量優先收集器:可能是Parallel Scavenge和Parallel Old收集器。 問題 網站直接從磁碟拷貝文檔到堆記憶體 ...
  • 電腦網路作為一門電腦專業課,平時都是各種抽象的協議和各種發送接收,很難具體的去感受其含義,因此也是藉助wireshark對發送的包進行一個分析。 ...
  • 大家好,我是你們的老伙計秀才!今天帶來的是[深入淺出Java多線程]系列的第九篇內容:synchronized與鎖。大家覺得有用請點贊,喜歡請關註!秀才在此謝過大家了!!! ...
  • 本文全面深入地探討了對象存儲服務(OSS)的核心技術、基礎知識和高級功能。從媒體存儲到數據備份,再到數據倉庫與數據湖,我們不僅解析了OSS在各種應用場景下的關鍵角色,還深入討論了其與機器學習、多媒體處理以及日誌和監控等多個開發場景的結合。 關註【TechLeadCloud】,分享互聯網架構、雲服務技 ...
  • 通過本文,我們使用Python編寫了一個簡單的日曆程式。在Python官方文檔中,我們找到了一個名為"calendar"的模塊,它可以輕鬆實現一個簡易的日曆,滿足基本需求。此外,我們還介紹了Tkinter和PyQt兩個常用的圖形用戶界面庫,以及borax庫和其他一些開源項目來實現更多功能和用戶體驗的... ...
  • wmproxy wmproxy已用Rust實現http/https代理, socks5代理, 反向代理, 負載均衡, 靜態文件伺服器,websocket代理,四層TCP/UDP轉發,內網穿透等,會將實現過程分享出來,感興趣的可以一起造個輪子 項目地址 國內: https://gitee.com/ti ...
  • 1. 我遇到了什麼問題 我在學習springboot,其中在編寫CRUD時發現訪問數據的函數執行下去返回值是null但是其它部分正常。 下麵是我的錯誤代碼 pojo public class Bot { @TableId(type = IdType.AUTO ) private Integer id ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...