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 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...