C++ 數據共享與保護學習記錄【代碼】

一.項目一

1.頭文件.h

//A.h
#pragma once
//防止頭文件被重復包含(重復包含會被重復編譯,也就是該類會被重復定義)
#ifndef HEAD_H
//等價于( #if !defined(HEAD_H) )
//defined是一個預處理操作符,相當于一個表達式
#define HEAD_H
class A
{
public:static void f(A a);static void show();//構造函數//只能在初始化列表初始化常數據成員A(int x, int conx) :x(x), conx(conx) { x2++; }
private:int x;static int x2;const int conx;
};
//必須有結束指令
#endif
//Clock.h
#pragma once
#include<string>
using namespace std;
class Clock
{
public:Clock();void setTime(int newH, int newM, int newS, string newN);void showTime() const;//友元類friend class Point;
private:int hour, minute, second;string name;//類的靜態常量如果有整數類型或枚舉類型,可以在定義中指定常量值(不分配內存,只是簡單替換)static const int b = 10;
};
//內聯函數不用分配內存(定義在頭文件中)
inline int add(int a, int b) {return a + b;
}
//Point.h
#pragma once
#include"Clock.h"
class Point
{
public:Point(int x = 0, int y = 0) :x(x), y(y) {}int getX() const{ return x; }int getY() const{ return y; }//友元函數friend float dist(Point& p1, Point& p2);//作為Clock的友元類,可以訪問其私有成員void show_Clock(Clock& c);
private:int x, y;
};

2.源文件.cpp

//A.cpp
#include "A.h"
#include<iostream>
using namespace std;//外部變量只能放在.cpp下,不能在.h下(定義型聲明)(文件作用域)
extern int j = 20;//外部函數(不聲明,文件作用域)
void showing(){cout << "Hello Extern Function!--NOT--DEFINE" << endl;
}
//外部函數(聲明為全局)
extern void showed() {cout << "Hello Extern Function!--DEFINE" << endl;
}
//靜態函數(不能被其他編譯單元引用)(靜態生存期)
void static shows() {cout << "Hello Static Function!" << endl;
}//必須在類外使用類名進行定義式聲明(初始化)
int A::x2 = 0;void A::f(A a) {// cout << x; //不能在靜態成員函數中直接訪問非靜態成員,必須與特定成員相對cout << "a.x:" << a.x << endl;cout << "x2:" << x2 << endl; // 可以直接訪問靜態成員}void A::show() {cout << "x2:" << x2 << endl;
}
//Clock.cpp
#include "Clock.h"
#include<iostream>
#include<string>
using namespace std;
//文件作用域(沒有聲明,但是在main函數中引用性聲明,值也相同)
int i = 10;
Clock::Clock() :hour(0), minute(0), second(0) {cout << "調用構造函數" << endl;
}void Clock::setTime(int newH, int newM, int newS, string newN) {name = newN;hour = newH;minute = newM;second = newS;
}
void Clock::showTime() const {cout << hour << ":" << minute << ":" << second << endl;cout << name << endl;
}
//Point.cpp
#include "Point.h"
#include<iostream>
#include<cmath>
using namespace std;
//友元函數實現
float dist(Point& p1, Point& p2) {double x = p1.x - p2.x;double y = p1.y - p2.y;//static_cast是一種類型轉換運算符,用于在編譯時進行類型轉換return static_cast<float>(sqrt(x * x + y * y));
}void Point::show_Clock(Clock& c) {cout << "This is showed by Point" << this->x << " " << this->y << endl;cout << c.name << endl;
}

3.主函數.cpp

//main.cpp
#include"Clock.h"
#include"A.h"
#include"Point.h"
#include<iostream>
#include<string>
using namespace std;
// 定義未指定初值的基本類型靜態生存期變量,會被以0值初始化
// 聲明具有靜態生存期的對象
Clock globalClock;int main() {//生存期cout << "生存期" << endl;cout << "First:" << endl;globalClock.showTime();globalClock.setTime(8, 30, 30, "theclock");Clock myClock(globalClock);cout << "Second:" << endl;myClock.showTime();//靜態成員  A a1(100,100);A a2(99,100);//調用靜態成員函數cout << "調用靜態成員函數" << endl;A::f(a1);A::f(a2);A::show();//友元函數cout << "友元函數" << endl;Point myp1(1, 1), myp2(4, 5);cout << "The distance is:" << endl;cout << dist(myp1, myp2);//友元類//友元關系:不可傳遞,單向,不被繼承//友元函數不僅可以是普通的函數,也可以是另外一個類的成員函數cout << "通過友元類輸出私有類成員:" << endl;myp1.show_Clock(myClock);//調用內聯函數cout << "4 + 5 = " << add(4, 5) << endl;//外部變量extern定義(引用性聲明)extern int i;cout << "外部變量 i = " << i << endl;//在源文件中聲明后還要再聲明,此時值一致extern int j;cout << "外部變量 j = " << j << endl;//外部函數(使用要包含文件+函數聲明)void showing();//extern void showing();//也可showing();void showed();showed();//不能訪問其他編譯單元靜態函數//void shows();//shows();return 0;
}

4.輸出

調用構造函數
生存期
First:
0:0:0Second:
8:30:30
theclock
調用靜態成員函數
a.x:100
x2:2
a.x:99
x2:2
x2:2
友元函數
The distance is:
5通過友元類輸出私有類成員:
This is showed by Point1 1
theclock
4 + 5 = 9
外部變量 i = 10
外部變量 j = 20
Hello Extern Function!--NOT--DEFINE
Hello Extern Function!--DEFINE

二.個人銀行賬戶管理系統

(主要添加靜態數據成員static,常成員const,條件預編譯,并且實現頭文件源文件文件分離)

1.頭文件.h

//account.h
#pragma once
//條件預編譯指令
#ifndef __ACCOUNT_H__
#define __ACCOUNT_H__
class SavingsAccount
{
private:int id; //賬號double balance; //余額double rate; //存款的年利率int lastDate; //上次變更余額的時期double accumulation; //余額按日累加之和static double total;	//所有賬戶總余額//記錄一筆賬, date為日期, amount為金額, desc為說明void record(int date, double amount);//獲得到指定日期為止的存款金額按日累積值double accumulate(int date) const {return accumulation + balance * (date - lastDate);}
public:SavingsAccount(int date, int id, double rate); //構造函數int getId() const { return id; }double getBalance() const { return balance; }double getRate() const { return rate; }static double getTotal() { return total; }void deposit(int date, double amount); //存入現金void withdraw(int date, double amount); //取出現金//結算利息,每年1月 1日調用一次該函數void settle(int date);//顯示賬戶信息void show() const;//友元函數friend void show_items(SavingsAccount& s1);//友元類friend class AnotherAccount;
};
#endif
//AnotherAccount.h
#pragma once
#include"account.h"
class AnotherAccount
{
//成員函數可以訪問SavingsAccount的保護和私有成員
private:SavingsAccount S1;SavingsAccount S2;
public:AnotherAccount(SavingsAccount& s1,SavingsAccount& s2):S1(s1),S2(s2) {}void showing() const;
};

2.源文件.cpp

//account.cpp
#include "account.h"
#include<iostream>
using namespace std;// 一定要在類外初始化靜態本地變量,不然會報錯
double SavingsAccount::total = 0;// 友元函數實現
void show_items(SavingsAccount& s1) {cout << "id:" << s1.id << "	  balance:" << s1.balance << " 	 lastDate:" << s1.lastDate << endl;
}//SavingsAccount類相關成員函數的實現
SavingsAccount::SavingsAccount(int date, int id, double rate): id(id), balance(0), rate(rate), lastDate(date), accumulation(0) {cout << date << "\t#" << id << " is created" << endl;
}
void SavingsAccount::record(int date, double amount) {accumulation = accumulate(date);lastDate = date;amount = floor(amount * 100 + 0.5) / 100; //保留小數點后兩位(四舍五入)balance += amount;total += amount;cout << date << "\t#" << id << "\t" << amount << "\t" << balance << endl;
}
void SavingsAccount::deposit(int date, double amount) {record(date, amount);
}
void SavingsAccount::withdraw(int date, double amount) {if (amount > getBalance())cout << "Error: not enough money" << endl;elserecord(date, -amount);
}
void SavingsAccount::settle(int date) {double interest = accumulate(date) * rate / 365; //計算年息if (interest != 0)record(date, interest);accumulation = 0;
}
void SavingsAccount::show() const{cout << "#" << id << "\tBalance: " << balance;
}
//AnotherAccount.cpp
#include "AnotherAccount.h"
#include<iostream>
using namespace std;
//訪問SavingsAccount的私有成員
void AnotherAccount::showing() const{if (S1.balance > S2.balance) {cout << "The bigger is:" << S1.id << "   balance:" << S1.balance << endl;}else if (S1.balance < S2.balance) {cout<< "The bigger is:" << S2.id << "   balance:" << S2.balance << endl;}else {cout << "No one bigger than the other" << endl;}
}

3.主函數.cpp

//5-11.cpp
#include<iostream>
#include"account.h"
#include"AnotherAccount.h"
using namespace std;int main() {//建立幾個賬戶cout << "建立賬戶:" << endl;SavingsAccount sa0(1, 1234567, 0.02);SavingsAccount sa1(5, 7654321, 0.025);//幾筆賬目cout << "記賬:" << endl;sa0.deposit(5, 670000);sa1.deposit(6, 700000);sa0.deposit(60, 5500);sa1.withdraw(70, 4000);//開戶后第100天到了銀行的計息日,結算所有賬戶的年息cout << "結息:" << endl;sa0.settle(100);sa1.settle(100);//輸出各個賬戶信息cout << "輸出各個賬戶信息:" << endl;sa0.show();cout << endl;sa1.show();cout << endl;cout << "利用靜態本地變量const唯一初始化性輸出total:" << endl;cout << "Total:" << SavingsAccount::getTotal() << endl;//利用友元函數輸出賬戶信息cout << "利用友元函數輸出賬戶信息:" << endl;show_items(sa0);show_items(sa1);//友元類cout << "友元類訪問私有成員然后輸出:" << endl;AnotherAccount s1(sa0,sa1);s1.showing();return 0;
}

4.輸出

建立賬戶:
1       #1234567 is created
5       #7654321 is created
記賬:
5       #1234567        670000  670000
6       #7654321        700000  700000
60      #1234567        5500    675500
70      #7654321        -4000   696000
結息:
100     #1234567        3499.73 679000
100     #7654321        4498.63 700499
輸出各個賬戶信息:
#1234567        Balance: 679000
#7654321        Balance: 700499
利用靜態本地變量const唯一初始化性輸出total:
Total:1.3795e+06
利用友元函數輸出賬戶信息:
id:1234567        balance:679000         lastDate:100
id:7654321        balance:700499         lastDate:100
友元類訪問私有成員然后輸出:
The bigger is:7654321   balance:700499

三.其他

1.限定作用域的enum枚舉類

//限定作用域的enum枚舉類
#include<iostream>
#include<string>
using namespace std;
enum color { red, yellow, green };
//enum color1 { red, yellow, green }; //錯誤,枚舉類型不能重復定義
enum class color2 { red, yellow, green }; // 正確 限定作用域的枚舉元素被隱藏
color c = red;
//color2 c1 = red; // color類型的值不能用來初始化color2類型實體
color c2 = color::red; // 顯式的訪問枚舉元素
color2 c3 = color2::red; // 使用color2枚舉元素
struct SColor {enum color { red, yellow, green };
};
SColor::color c = SColor::red; // 正確使用未限定作用域的枚舉元素

2.常成員函數舉例

//常成員函數舉例
#include<iostream>
using namespace std;class R {
public:R(int r1, int r2) :r1(r1), r2(r2) {}void print();void print() const;
private:int r1, r2;
};void R::print() {cout << r1 << "---" << r2 << endl;
}void R::print() const {cout << r1 << "+++" << r2 << endl;
}int main() {R a(5, 4);a.print(); //調用普通函數成員const R b(20, 25);b.print(); //調用常函數成員return 0;
}
//輸出
5---4
20+++25

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

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

相關文章

整理好了!2024年最常見 20 道分布式、微服務面試題(二)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常見 20 道分布式、微服務面試題&#xff08;一&#xff09;-CSDN博客 三、請解釋CAP定理及其含義。 CAP定理是分布式計算領域的一個基本概念&#xff0c;由計算機科學家Eric Brewer在2000年提出&#xff0c;并由科學家Se…

力扣76.最小覆蓋子串

力扣76.最小覆蓋子串 用哈希表記錄每個字母出現次數 枚舉右端點 判斷是否能全覆蓋如果可以 并且更短 就更新 j 縮小區間再判斷 class Solution {bool is_covered(int cnt_s[], int cnt_t[]) {for (int i A; i < Z; i) {if (cnt_s[i] < cnt_t[i]) {return false;}}fo…

上網操作的必要條件

一、 網卡 1、 為什么需要網卡 計算機為了實現網絡通信&#xff0c;必須都要有網卡這個東西&#xff0c;網卡是計算機眾多外部設備之一&#xff08;其它還有硬盤、鍵盤等&#xff09;&#xff0c;計算機將數據發給網卡&#xff0c;網卡負責將數據往外發送&#xff0c;通過IP定…

技術團隊的沖突管理: 谷歌亞里士多德項目的啟示

有效的沖突管理對于技術團隊保持高效和創新的工作環境至關重要。谷歌的亞里士多德項目是一項內部研究&#xff0c;旨在了解成功團隊的因素&#xff0c;強調了心理安全和開放溝通在促進團隊成員之間的合作和解決分歧方面的重要性。本文將探討受谷歌的亞里士多德項目和其他數據點…

工廠生產計劃難以執行的真正原因及對策

在制造業中&#xff0c;生產計劃的執行對于企業的運營至關重要。然而&#xff0c;許多工廠在生產計劃執行過程中面臨著諸多挑戰&#xff0c;尤其是物料齊套率低的問題。本文將探討工廠生產計劃難以執行的真正原因&#xff0c;并提出相應的解決對策。 一、生產計劃難以執行的真…

mysql optimizer_switch : 查詢優化器優化策略深入解析

碼到三十五 &#xff1a; 個人主頁 在 MySQL 數據庫中&#xff0c;查詢優化器是一個至關重要的組件&#xff0c;它負責確定執行 SQL 查詢的最有效方法。為了提供DBA和開發者更多的靈活性和控制權&#xff0c;MySQL 引入了 optimizer_switch 系統變量。這個強大的工具允許用戶開…

nginx配置WebSocket參數wss連接

目錄 一、原文連接 二、 配置參數 三、實踐 四、重啟nginx 五、連接websocket 一、原文連接 nginx配置websocket支持wss-騰訊云開發者社區-騰訊云 二、 配置參數 map $http_upgrade $connection_upgrade { default upgrade; close; } upstream websocket { se…

聚類的外部指標(Purity, ARI, NMI, ACC) 和內部指標(NCC,Entropy,Compactness,Silhouette Index)

在聚類分析中,外部指標和內部指標用于評估聚類結果的質量。外部指標需要知道真實的類別標簽,而內部指標則僅基于聚類結果本身進行評估。 外部指標 Purity (純度): 計算聚類結果中每個簇中最多數目的樣本所屬的類別,并計算所有簇的該類別樣本數之和占所有樣本數的比例。 Pyt…

【操作系統】進程與線程的區別及總結(非常非常重要,面試必考題,其它文章可以不看,但這篇文章最后的總結你必須要看,滿滿的全是干貨......)

目錄 一、 進程1.1 PID(進程標識符)1.2 內存指針1.3 文件描述符表1.4 狀態1.5 優先級1.6 記賬信息1.7 上下文 二、線程三、總結&#xff1a;進程和線程之間的區別&#xff08;非常非常非常重要&#xff0c;面試必考題&#xff09; 一、 進程 簡單來介紹一下什么是進程&#xf…

win 系統 cmd 命令從私庫上傳,下載jar包

1. 確保maven環境變量或者maven安裝無誤&#xff1b; 2.私庫下載 命令 mvn dependency:get -DgroupId<your_group_id> -DartifactId<your_artifact_id> -Dversion<your_version> -Dpackagingjar -Dfile<path_to_your_jar_file> -Durl<your_privat…

寫入文件內容

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在實例01中&#xff0c;雖然創建并打開一個文件&#xff0c;但是該文件中并沒有任何內容&#xff0c;它的大小是0KB。Python的文件對象提供了write()…

【電路筆記】-分貝

分貝 分貝是以 10 為底的對數比,用于表示電路中功率、電壓或電流的增加或減少。 1、概述 一般來說,分貝是響度的度量。 在設計或使用放大器和濾波器電路時,計算中使用的一些數字可能非常大或非常小。 例如,如果我們將兩個放大器級級聯在一起,功率或電壓增益分別為 20 和…

os和os.path模塊

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 目錄也稱文件夾&#xff0c;用于分層保存文件。通過目錄可以分門別類地存放文件。我們也可以通過目錄快速找到想要的文件。在Python中&#xff0c;并…

033.搜索旋轉排序數組

題意 整數數組 nums 按升序排列&#xff0c;數組中的值 互不相同 。 在傳遞給方法之前&#xff0c;nums 在預先未知的某個下標 k(0 < k < nums.length)上進行了旋轉&#xff0c;使數組變為 [nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]&…

古字畫3d立體在線數字展覽館更高效便捷

在數字時代的浪潮中&#xff0c;大連圖書館以嶄新的面貌躍然屏幕之上——3D全景圖書館。這座承載著城市文化精髓與豐富知識資源的數字圖書館&#xff0c;利用前沿的三維建模技術&#xff0c;為我們呈現了一個全新的知識世界。 隨時隨地&#xff0c;無論您身處何地&#xff0c;只…

獲得抖音商品評論 API 返回值

公共參數 名稱類型必須描述keyString是調用key&#xff08;獲取key和密鑰???????&#xff09;secretString是調用密鑰api_nameString是API接口名稱&#xff08;包括在請求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默認yes&am…

信息學奧賽初賽天天練-22-C++基礎關鍵字、進制轉換、結構體與聯合體的實用技巧大揭秘

PDF文檔公眾號回復關鍵字:20240607 單項選擇題&#xff08;共15題&#xff0c;每題2分&#xff0c;共計30分&#xff1a;每題有且僅有一個正確選項&#xff09; 1 在C中&#xff0c;下面哪個關鍵字用于聲明一個變量&#xff0c;其值不能被修改&#xff1f;&#xff08; &#…

二叉樹講解升級版

目錄 二叉樹的存儲結構 二叉樹結點的查找和修改 二叉樹結點的插入 二叉樹的創建 二叉樹的遍歷 先序遍歷 中序遍歷 后序遍歷 層序遍歷 重建二叉樹 二叉樹的靜態實現 二叉樹的存儲結構 一般來說&#xff0c;二叉樹使用鏈表來定義。和普通鏈表的區別是&#xff0c;由于…

【Java】解決Java報錯:StackOverflowError

文章目錄 引言1. 錯誤詳解2. 常見的出錯場景2.1 無限遞歸2.2 遞歸深度過大2.3 方法調用層次過深 3. 解決方案3.1 優化遞歸算法3.2 尾遞歸優化3.3 增加調用棧大小3.4 檢查遞歸終止條件 4. 預防措施4.1 使用迭代替代遞歸4.2 尾遞歸優化4.3 合理設計遞歸算法4.4 調整JVM參數4.5 定…

b端系統類管理平臺設計前端開發案例

b端系統類管理平臺設計前端開發案例