C++实现的银行账户管理系统

基本实现思路:以account类(账户)为主线,其与date类(日期)是组合关系以date类的对象作为数据成员。user类(用户)和list类(管理员)本质上是两个链表,它们都以account类作为链表结点。

主要功能

friend关键字/operator重载:

friend两种基本使用方法:

(1)A类中申明func()函数为friend,则func()可以使用A类的所有成员变量

(2)A类中申明B类为friend,则使用A类的所有成员变量

重载两种方式:

(1)如果一个重载运算符是类的成员函数,那么只有当与它一起使用的左操作数是该类的对象时,该运算符才会被调用;

(2)而如果该运算符的左操作数确定为其他的类型,则运算符必须被重载为全局函数;

#pragma once
#include<iostream>
using namespace std;
class date {
public:
	date(int y = 0, int m = 0, int d = 0);
	void setdate(int y, int m, int d);
	int gyear();
	int gmonth();
	int gday();
	date& operator=(const date& r);
	void display();
	bool operator>(const date& right);
	friend ostream& operator<<(ostream& out, date& r);// friend + 重载
    friend bool operator==(const date& a, const data& b);
protected:
	int year;
	int month;
	int day;
};
ostream& operator << (ostream &os , data a) {
    os << "your data is " << a.year << a.month << a.day << endl;
    return os;
}

bool date::operator>(const date& right) {//重载成员函数
	int t = 1;
	if (year > right.year)t = 0;
	else if (month > right.year)t = 0;
	else if (day > right.day)t = 0;
	return t;
}
bool operator==(const date& a, const data& b) {//重载全局函数
	if (a.year == b.year && a.month == b.month && a.day == b.day)return true;
}
 
int main() {
    data a;
    data b;
    cout << a;
    if(a>b) cout<<1;//相当于对象 a 调用函数“operator>”,把对象 b 作为一个参数传递给该函数
    if(a==b) cout<<0;//对象a,b都为bool operator==(...)的参数
    system("pause");
}

const

常量:用const修饰变量时,一定要给变量初始化,否则之后就不能再进行赋值了。

const int n=5;
int const n=5;
//变量n的值不能被改变

常量指针:指针指向的内容是常量,指针地址可变。

不能通过这个指针改变变量的值,可以通过其他的引用来改变变量的值。

int a = 5;
const int * b = &a;
//int const * b = &a;
a = 6;//b值可变

指针常量:指针本身是常量,指针地址不可变,指针内容可变。

int * const n;

修饰函数参数:

1)防止指针指向的内容被修改

void func( const int * a );

2)防止指针指向的地址被修改

void func(int * const a );

修饰函数的返回值:如果函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

const int * getf(...);
int * a = getf(...);//×
const int * b = getf(...);//√

const可用来修饰成员函数,使得该函数只能访问数据成员而不能修改数据成员
const可用来修饰对象,使得该对象只能调用const修饰的成员函数

static

静态局部变量:

无static:每调用一次fun(),val重新初始化

有static:val只初始化一次之后每次调用fun()都对val进行累加。变量的存储区域由栈变为静态常量区,生命周期由局部变为全局,直到程序运行结束以后才释放。

#include <stdio.h>

void fun()
{
	static int val = 0;   //static 修饰局部变量
	val++;
}
int main()
{
	for (int i = 0; i < 7; i++){
		fun();
	}
	return 0;
}

静态全局变量(≈static修饰函数):变量的作用域由整个程序变为当前文件。全局变量只能在定义变量的当前文件使用,不能在其余文件使用,即使extern外部声明也不行。

静态成员变量:

class A
{
public :
	A(){   //构造函数  静态成员变量无法在构造函数初始化列表进行初始化
		_count++;
	}
	A(const A& y){
		_count++;
	}
	static int GetCount(){    //静态成员函数
		return _count;
	}
public:  //静态成员变量也受访问限定符(public、protected、private)的限制。     
	int a;
	//静态成员变量在类中声明,在类外初始化
	static int _count;  
	static const int sa = 99;//const修饰的静态成员变量可以在类内初始化
	const static int sb;
	static const int sc;
};

int A::_count = 0;   //静态成员变量在使用前必须先初始化,在类外初始化,不用加static
const int A::sb = 88;
const int A::sc = 77;

void TestA() {
	cout << A::GetCount() << endl;  // 类静态成员通过 "类名::静态成员" 来访问
	A a1, a2; 
	A a3(a1);
    cout << A::GetCount() << endl;   
                          //静态成员为所有类对象所共享,并没有包含在具体的对象中。
	cout << a3.GetCount() << endl;   //或 类静态成员通过 "类对象名.静态成员" 来访问
}

静态成员函数:

1)静态成员函数没有隐藏的this指针,也不能定义成this成员函数。因为静态成员为所有类对象所共享,并没有包含在具体的对象中。

2)非静态成员可以访问静态成员,静态成员不可以访问非静态成员只能访问静态成员。

文件:系统实现采用文件的输入输出流对文本数据进行读取与写入。

单链表:对数据的存储组织使用了单向链表实现增、删、改、查、排序功能

排序:冒泡排序,要排序哪项内容就构造一个只赋予该项初始值的空对象,从头开始遍历链表,两两比较节点值大小,用三个指针指向待交换节点附近实现链表节点交换。

 实现排序时遇到的问题:

问题(1):链表的结点交换本质应是指针交换指向。一开始考虑过用交换结点内容的函数,但数据庞大;后来考虑用交换结点指针的函数,但需要知道待交换的两个指针的前后指针,比较复杂未能实现。

解决:直接在比较后就进行交换,省去调用函数来实现。设置了pre指针,实时跟着cur指针,指向了cur前面(其中cur和next为比较并待交换的指针),这样有了三个指向就可以实现两个指针之间的交换了。但用了pre指针有一点bug如下问题2来描述。

问题(2):由于要涉及到链表的指针结点交换,对于一个要与后邻结点交换的结点,要实现交换则还需要知道其前一个结点指针,所以无法将指针指向第一个结点开始冒泡排序。

解决:开辟了一个内容为空的结点加入头结点,让其后的结点(从第二个有效节点开始)进行冒泡排序,并从第二个结点开始输出链表。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_47827716

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值