class_1 什麼是介面? 類就是一種公共介面,公眾(public)是使用類的程式,交互系統由類對象組成,而介面由編寫類的人提供的方法組成。介面讓程式員能夠編寫與類對象交互的代碼,從而讓程式能夠使用類對象。例如,要計算 string 對象中包含多少個字元,您無需打開對象,而只需使用string類提 ...
class_1
什麼是介面?
類就是一種公共介面,公眾(public)是使用類的程式,交互系統由類對象組成,而介面由編寫類的人提供的方法組成。介面讓程式員能夠編寫與類對象交互的代碼,從而讓程式能夠使用類對象。例如,要計算 string 對象中包含多少個字元,您無需打開對象,而只需使用string類提供的size()方法。類設計禁止公共用戶直接訪問類,但公眾可以使用方法size()。
oop風格
OOP(面向對象編程)是一種編程範式,它將程式組織為相互交互的對象。這種編程風格基於對象的概念,其中對象是通過封裝數據和操作數據的方法(即類中的成員函數)來表示的。
OOP 風格的編程主要關註以下幾個核心概念:
- 封裝(Encapsulation):將數據和對數據的操作封裝到一個類中,通過限制對數據的直接訪問來保護數據的完整性。只有類中定義的方法可以訪問和修改數據,外部無法直接訪問數據。
- 繼承(Inheritance):通過繼承機制,子類可以繼承父類的屬性和方法,並且可以在此基礎上進行擴展或修改。繼承可以提高代碼的重用性和可維護性。
- 多態(Polymorphism):多態允許對象根據所處的上下文環境以不同的方式進行操作。通過多態,可以通過基類指針或引用調用派生類中的方法,實現動態綁定和運行時多態性。
- 抽象(Abstraction):抽象是指從具體的事物中抽取出共同的特征和行為,形成類的概念。通過抽象,可以定義介面和基類,隱藏具體實現細節,提高代碼的可擴展性和靈活性。
OOP 風格的編程可以使代碼更具有模塊化、可維護性和可擴展性。它將現實世界中的事物和關係映射到程式設計中,使得代碼更貼近問題領域的語義,更易於理解和維護。
在使用 OOP 風格編程時,通常會定義類、對象、繼承關係和介面等概念來描述問題和解決方案。C++ 是一種支持面向對象編程的語言,並且提供了類、繼承、多態等特性以支持 OOP 風格的編程。
無論類成員是數據成員還是成員函數,都可以在類的公有部分或私有部分中聲明它。但由於隱藏數據是OOP主要的目標之一,因此數據項通常放在私有部分,組成類介面的成員函數放在公有部分:否則,就無法從程式中調用這些函數。正如Stock聲明所表明的,也可以把成員函數放在私有部分中。不能直接從程式中調用這種函數,但公有方法卻可以使用它們。通常,程式員使用私有成員函數來處理不屬於公有介面的實現細節。不必再類聲明的時候使用關鍵字private,因為這是類對象的預設訪問控制
頭文件的類聲明
在C++中,.h
文件通常是用於聲明類、函數、變數和其他代碼實體的頭文件(header file)。頭文件的作用是提供一種將程式的聲明與定義分離的機制,在不暴露實現細節的情況下,讓其他源文件可以訪問和使用這些聲明。
頭文件通常包含以下內容:
- 類的聲明:頭文件中可以包含類的聲明,包括成員變數和成員函數的原型(聲明)。
- 函數的聲明:頭文件可以包含函數的原型(聲明),使得其他源文件可以調用這些函數。
- 常量和巨集定義:頭文件中可以定義常量和巨集,以供其他源文件使用。
- 類型定義和類型別名:頭文件中可以進行類型定義和類型別名的聲明,以提供更具有可讀性和可維護性的代碼。
頭文件通常與對應的源文件(.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
- 定義成員函數時,使用作用域解析運算符(::)來標識函數所屬的類;
- 類方法可以直接訪問類的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;
}
但是這個科學計數法讓我們不知道具體數字,可以定義cout.setf(ios_base::fixed, ios_base::floatfield);
普通設置一個類
設計立方體類(Cube),求出立方體的面積( 2ab + 2ac + 2bc )和體積( a * b * c),分別用全局函數和成員函數判斷兩個立方體是否相等基本類的使用就算是明白了
#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