C++ 数据共享与保护学习记载【代码】

打印 上一主题 下一主题

主题 810|帖子 810|积分 2430

一.项目一

1.头文件.h

  1. //A.h
  2. #pragma once
  3. //防止头文件被重复包含(重复包含会被重复编译,也就是该类会被重复定义)
  4. #ifndef HEAD_H
  5. //等价于( #if !defined(HEAD_H) )
  6. //defined是一个预处理操作符,相当于一个表达式
  7. #define HEAD_H
  8. class A
  9. {
  10. public:
  11.         static void f(A a);
  12.         static void show();
  13.         //构造函数
  14.         //只能在初始化列表初始化常数据成员
  15.         A(int x, int conx) :x(x), conx(conx) { x2++; }
  16. private:
  17.         int x;
  18.         static int x2;
  19.         const int conx;
  20. };
  21. //必须有结束指令
  22. #endif
复制代码
  1. //Clock.h
  2. #pragma once
  3. #include<string>
  4. using namespace std;
  5. class Clock
  6. {
  7. public:
  8.     Clock();
  9.     void setTime(int newH, int newM, int newS, string newN);
  10.     void showTime() const;
  11.     //友元类
  12.     friend class Point;
  13. private:
  14.     int hour, minute, second;
  15.     string name;
  16.     //类的静态常量如果有整数类型或枚举类型,可以在定义中指定常量值(不分配内存,只是简单替换)
  17.     static const int b = 10;
  18. };
  19. //内联函数不用分配内存(定义在头文件中)
  20. inline int add(int a, int b) {
  21.     return a + b;
  22. }
复制代码
  1. //Point.h
  2. #pragma once
  3. #include"Clock.h"
  4. class Point
  5. {
  6. public:
  7.         Point(int x = 0, int y = 0) :x(x), y(y) {}
  8.         int getX() const{ return x; }
  9.         int getY() const{ return y; }
  10.         //友元函数
  11.         friend float dist(Point& p1, Point& p2);
  12.         //作为Clock的友元类,可以访问其私有成员
  13.         void show_Clock(Clock& c);
  14. private:
  15.         int x, y;
  16. };
复制代码
2.源文件.cpp

  1. //A.cpp
  2. #include "A.h"
  3. #include<iostream>
  4. using namespace std;
  5. //外部变量只能放在.cpp下,不能在.h下(定义型声明)(文件作用域)
  6. extern int j = 20;
  7. //外部函数(不声明,文件作用域)
  8. void showing(){
  9.         cout << "Hello Extern Function!--NOT--DEFINE" << endl;
  10. }
  11. //外部函数(声明为全局)
  12. extern void showed() {
  13.         cout << "Hello Extern Function!--DEFINE" << endl;
  14. }
  15. //静态函数(不能被其他编译单元引用)(静态生存期)
  16. void static shows() {
  17.         cout << "Hello Static Function!" << endl;
  18. }
  19. //必须在类外使用类名进行定义式声明(初始化)
  20. int A::x2 = 0;
  21. void A::f(A a) {
  22.         // cout << x; //不能在静态成员函数中直接访问非静态成员,必须与特定成员相对
  23.         cout << "a.x:" << a.x << endl;
  24.         cout << "x2:" << x2 << endl; // 可以直接访问静态成员
  25. }
  26. void A::show() {
  27.         cout << "x2:" << x2 << endl;
  28. }
复制代码
  1. //Clock.cpp
  2. #include "Clock.h"
  3. #include<iostream>
  4. #include<string>
  5. using namespace std;
  6. //文件作用域(没有声明,但是在main函数中引用性声明,值也相同)
  7. int i = 10;
  8. Clock::Clock() :hour(0), minute(0), second(0) {
  9.     cout << "调用构造函数" << endl;
  10. }
  11. void Clock::setTime(int newH, int newM, int newS, string newN) {
  12.     name = newN;
  13.     hour = newH;
  14.     minute = newM;
  15.     second = newS;
  16. }
  17. void Clock::showTime() const {
  18.     cout << hour << ":" << minute << ":" << second << endl;
  19.     cout << name << endl;
  20. }
复制代码
  1. //Point.cpp
  2. #include "Point.h"
  3. #include<iostream>
  4. #include<cmath>
  5. using namespace std;
  6. //友元函数实现
  7. float dist(Point& p1, Point& p2) {
  8.         double x = p1.x - p2.x;
  9.         double y = p1.y - p2.y;
  10.         //static_cast是一种类型转换运算符,用于在编译时进行类型转换
  11.         return static_cast<float>(sqrt(x * x + y * y));
  12. }
  13. void Point::show_Clock(Clock& c) {
  14.         cout << "This is showed by Point" << this->x << " " << this->y << endl;
  15.         cout << c.name << endl;
  16. }
复制代码
3.主函数.cpp

  1. //main.cpp
  2. #include"Clock.h"
  3. #include"A.h"
  4. #include"Point.h"
  5. #include<iostream>
  6. #include<string>
  7. using namespace std;
  8. // 定义未指定初值的基本类型静态生存期变量,会被以0值初始化
  9. // 声明具有静态生存期的对象
  10. Clock globalClock;
  11. int main() {
  12.     //生存期
  13.     cout << "生存期" << endl;
  14.     cout << "First:" << endl;
  15.     globalClock.showTime();
  16.     globalClock.setTime(8, 30, 30, "theclock");
  17.     Clock myClock(globalClock);
  18.     cout << "Second:" << endl;
  19.     myClock.showTime();
  20.     //静态成员  
  21.     A a1(100,100);
  22.     A a2(99,100);
  23.     //调用静态成员函数
  24.     cout << "调用静态成员函数" << endl;
  25.     A::f(a1);
  26.     A::f(a2);
  27.     A::show();
  28.     //友元函数
  29.     cout << "友元函数" << endl;
  30.     Point myp1(1, 1), myp2(4, 5);
  31.     cout << "The distance is:" << endl;
  32.     cout << dist(myp1, myp2);
  33.     //友元类
  34.     //友元关系:不可传递,单向,不被继承
  35.     //友元函数不仅可以是普通的函数,也可以是另外一个类的成员函数
  36.     cout << "通过友元类输出私有类成员:" << endl;
  37.     myp1.show_Clock(myClock);
  38.     //调用内联函数
  39.     cout << "4 + 5 = " << add(4, 5) << endl;
  40.     //外部变量extern定义(引用性声明)
  41.     extern int i;
  42.     cout << "外部变量 i = " << i << endl;
  43.     //在源文件中声明后还要再声明,此时值一致
  44.     extern int j;
  45.     cout << "外部变量 j = " << j << endl;
  46.     //外部函数(使用要包含文件+函数声明)
  47.     void showing();
  48.     //extern void showing();//也可
  49.     showing();
  50.     void showed();
  51.     showed();
  52.     //不能访问其他编译单元静态函数
  53.     //void shows();
  54.     //shows();
  55.     return 0;
  56. }
复制代码
4.输出

  1. 调用构造函数
  2. 生存期
  3. First:
  4. 0:0:0
  5. Second:
  6. 8:30:30
  7. theclock
  8. 调用静态成员函数
  9. a.x:100
  10. x2:2
  11. a.x:99
  12. x2:2
  13. x2:2
  14. 友元函数
  15. The distance is:
  16. 5通过友元类输出私有类成员:
  17. This is showed by Point1 1
  18. theclock
  19. 4 + 5 = 9
  20. 外部变量 i = 10
  21. 外部变量 j = 20
  22. Hello Extern Function!--NOT--DEFINE
  23. Hello Extern Function!--DEFINE
复制代码
二.个人银行账户管理系统

(主要添加静态数据成员static,常成员const,条件预编译,而且实现头文件源文件文件分离)
1.头文件.h

  1. //account.h
  2. #pragma once
  3. //条件预编译指令
  4. #ifndef __ACCOUNT_H__
  5. #define __ACCOUNT_H__
  6. class SavingsAccount
  7. {
  8. private:
  9.         int id; //账号
  10.         double balance; //余额
  11.         double rate; //存款的年利率
  12.         int lastDate; //上次变更余额的时期
  13.         double accumulation; //余额按日累加之和
  14.         static double total;        //所有账户总余额
  15.         //记录一笔账, date为日期, amount为金额, desc为说明
  16.         void record(int date, double amount);
  17.         //获得到指定日期为止的存款金额按日累积值
  18.         double accumulate(int date) const {
  19.                 return accumulation + balance * (date - lastDate);
  20.         }
  21. public:
  22.         SavingsAccount(int date, int id, double rate); //构造函数
  23.         int getId() const { return id; }
  24.         double getBalance() const { return balance; }
  25.         double getRate() const { return rate; }
  26.         static double getTotal() { return total; }
  27.         void deposit(int date, double amount); //存入现金
  28.         void withdraw(int date, double amount); //取出现金
  29.         //结算利息,每年1月 1日调用一次该函数
  30.         void settle(int date);
  31.         //显示账户信息
  32.         void show() const;
  33.         //友元函数
  34.         friend void show_items(SavingsAccount& s1);
  35.         //友元类
  36.         friend class AnotherAccount;
  37. };
  38. #endif
复制代码
  1. //AnotherAccount.h
  2. #pragma once
  3. #include"account.h"
  4. class AnotherAccount
  5. {
  6. //成员函数可以访问SavingsAccount的保护和私有成员
  7. private:
  8.         SavingsAccount S1;
  9.         SavingsAccount S2;
  10. public:
  11.         AnotherAccount(SavingsAccount& s1,SavingsAccount& s2):S1(s1),S2(s2) {}
  12.         void showing() const;
  13. };
复制代码
2.源文件.cpp

  1. //account.cpp
  2. #include "account.h"
  3. #include<iostream>
  4. using namespace std;
  5. // 一定要在类外初始化静态本地变量,不然会报错
  6. double SavingsAccount::total = 0;
  7. // 友元函数实现
  8. void show_items(SavingsAccount& s1) {
  9.         cout << "id:" << s1.id << "          balance:" << s1.balance << "          lastDate:" << s1.lastDate << endl;
  10. }
  11. //SavingsAccount类相关成员函数的实现
  12. SavingsAccount::SavingsAccount(int date, int id, double rate)
  13.         : id(id), balance(0), rate(rate), lastDate(date), accumulation(0) {
  14.         cout << date << "\t#" << id << " is created" << endl;
  15. }
  16. void SavingsAccount::record(int date, double amount) {
  17.         accumulation = accumulate(date);
  18.         lastDate = date;
  19.         amount = floor(amount * 100 + 0.5) / 100; //保留小数点后两位(四舍五入)
  20.         balance += amount;
  21.         total += amount;
  22.         cout << date << "\t#" << id << "\t" << amount << "\t" << balance << endl;
  23. }
  24. void SavingsAccount::deposit(int date, double amount) {
  25.         record(date, amount);
  26. }
  27. void SavingsAccount::withdraw(int date, double amount) {
  28.         if (amount > getBalance())
  29.                 cout << "Error: not enough money" << endl;
  30.         else
  31.                 record(date, -amount);
  32. }
  33. void SavingsAccount::settle(int date) {
  34.         double interest = accumulate(date) * rate / 365; //计算年息
  35.         if (interest != 0)
  36.                 record(date, interest);
  37.         accumulation = 0;
  38. }
  39. void SavingsAccount::show() const{
  40.         cout << "#" << id << "\tBalance: " << balance;
  41. }
复制代码
  1. //AnotherAccount.cpp
  2. #include "AnotherAccount.h"
  3. #include<iostream>
  4. using namespace std;
  5. //访问SavingsAccount的私有成员
  6. void AnotherAccount::showing() const{
  7.         if (S1.balance > S2.balance) {
  8.                 cout << "The bigger is:" << S1.id << "   balance:" << S1.balance << endl;
  9.         }
  10.         else if (S1.balance < S2.balance) {
  11.                 cout<< "The bigger is:" << S2.id << "   balance:" << S2.balance << endl;
  12.         }
  13.         else {
  14.                 cout << "No one bigger than the other" << endl;
  15.         }
  16. }
复制代码
3.主函数.cpp

  1. //5-11.cpp
  2. #include<iostream>
  3. #include"account.h"
  4. #include"AnotherAccount.h"
  5. using namespace std;
  6. int main() {
  7.         //建立几个账户
  8.         cout << "建立账户:" << endl;
  9.         SavingsAccount sa0(1, 1234567, 0.02);
  10.         SavingsAccount sa1(5, 7654321, 0.025);
  11.         //几笔账目
  12.         cout << "记账:" << endl;
  13.         sa0.deposit(5, 670000);
  14.         sa1.deposit(6, 700000);
  15.         sa0.deposit(60, 5500);
  16.         sa1.withdraw(70, 4000);
  17.         //开户后第100天到了银行的计息日,结算所有账户的年息
  18.         cout << "结息:" << endl;
  19.         sa0.settle(100);
  20.         sa1.settle(100);
  21.         //输出各个账户信息
  22.         cout << "输出各个账户信息:" << endl;
  23.         sa0.show();
  24.         cout << endl;
  25.         sa1.show();
  26.         cout << endl;
  27.         cout << "利用静态本地变量const唯一初始化性输出total:" << endl;
  28.         cout << "Total:" << SavingsAccount::getTotal() << endl;
  29.         //利用友元函数输出账户信息
  30.         cout << "利用友元函数输出账户信息:" << endl;
  31.         show_items(sa0);
  32.         show_items(sa1);
  33.         //友元类
  34.         cout << "友元类访问私有成员然后输出:" << endl;
  35.         AnotherAccount s1(sa0,sa1);
  36.         s1.showing();
  37.         return 0;
  38. }
复制代码
4.输出

  1. 建立账户:
  2. 1       #1234567 is created
  3. 5       #7654321 is created
  4. 记账:
  5. 5       #1234567        670000  670000
  6. 6       #7654321        700000  700000
  7. 60      #1234567        5500    675500
  8. 70      #7654321        -4000   696000
  9. 结息:
  10. 100     #1234567        3499.73 679000
  11. 100     #7654321        4498.63 700499
  12. 输出各个账户信息:
  13. #1234567        Balance: 679000
  14. #7654321        Balance: 700499
  15. 利用静态本地变量const唯一初始化性输出total:
  16. Total:1.3795e+06
  17. 利用友元函数输出账户信息:
  18. id:1234567        balance:679000         lastDate:100
  19. id:7654321        balance:700499         lastDate:100
  20. 友元类访问私有成员然后输出:
  21. The bigger is:7654321   balance:700499
复制代码
三.其他

1.限定作用域的enum枚举类

  1. //限定作用域的enum枚举类
  2. #include<iostream>
  3. #include<string>
  4. using namespace std;
  5. enum color { red, yellow, green };
  6. //enum color1 { red, yellow, green }; //错误,枚举类型不能重复定义
  7. enum class color2 { red, yellow, green }; // 正确 限定作用域的枚举元素被隐藏
  8. color c = red;
  9. //color2 c1 = red; // color类型的值不能用来初始化color2类型实体
  10. color c2 = color::red; // 显式的访问枚举元素
  11. color2 c3 = color2::red; // 使用color2枚举元素
  12. struct SColor {
  13.     enum color { red, yellow, green };
  14. };
  15. SColor::color c = SColor::red; // 正确使用未限定作用域的枚举元素
复制代码
2.常成员函数举例

  1. //常成员函数举例
  2. #include<iostream>
  3. using namespace std;
  4. class R {
  5. public:
  6.         R(int r1, int r2) :r1(r1), r2(r2) {}
  7.         void print();
  8.         void print() const;
  9. private:
  10.         int r1, r2;
  11. };
  12. void R::print() {
  13.         cout << r1 << "---" << r2 << endl;
  14. }
  15. void R::print() const {
  16.         cout << r1 << "+++" << r2 << endl;
  17. }
  18. int main() {
  19.         R a(5, 4);
  20.         a.print(); //调用普通函数成员
  21.         const R b(20, 25);
  22.         b.print(); //调用常函数成员
  23.         return 0;
  24. }
复制代码
  1. //输出
  2. 5---4
  3. 20+++25
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表