实验四:继承与派生练习,运算符[]重载练习
一:实验结论
/*问题描述*/
1. 车辆基本信息管理 问题场景描述如下: 为了对车量基本信息进行管理,对现实世界车量基本信息抽象后,抽象出Car类、ElectricCar类、Battery类, 它们之间的关系描述如下:基于Car类派生出ElectricCar类,派生类ElectricCar中新增数据成员为Battery类 对象。
/*代码如下*/
1 #pragma once 2 #ifndef BATTERY_H 3 #define BATTERY_H 4 5 class battery { 6 private: 7 int batterySize; 8 double using_time; 9 public: 10 battery(int batterySize0=70):batterySize(batterySize0){} 11 void get_batterySize(); 12 void get_using_time(); 13 }; 14 15 #endif // !BATTERY_H
1 #include"battery.h" 2 #include<iostream> 3 using namespace std; 4 5 void battery::get_batterySize() { 6 cout << batterySize << "—KWH"; 7 } 8 9 void battery::get_using_time() { 10 using_time = batterySize / 60.0;//自己规定一下每小时需要60的能量。 11 cout << using_time << "h " << "请注意及时充能"; 12 }
1 #pragma once 2 #ifndef CAR_H 3 #define CAR_H 4 #include<string> 5 using namespace std; 6 class car { 7 private: 8 string maker; 9 string model; 10 int year; 11 double odometer; 12 double sum_meters = 100000.0; 13 public: 14 car(string maker0, string model0, int year0, double odometer0 = 0.0) :maker(maker0), model(model0), year(year0), odometer(odometer0) {} 15 car(){} 16 friend ostream & operator<<(ostream &out, const car &c);//重载<<运算符。 17 void update_odometer(double meters);//更新行车总里程数。 18 }; 19 20 #endif // !CAR_H
1 //坑,在为<<重载的时候,只在头文件中用了using std::string ,否则无法识别string,但是friend没有飘红, 2 //在我进行函数体实现的时候出了问题,然后我意识到可能是名称空间的问题,改成using namespace std就好了。 3 #include"car.h" 4 #include<iostream> 5 #include<string> 6 using namespace std; 7 8 void car::update_odometer(double meters) { 9 double odometer1 = odometer; 10 odometer1 += meters; 11 if (odometer > odometer1) { 12 cout << "WANNING,Failed to Update Odometer" << endl; 13 } 14 if (sum_meters - odometer1 <= 10000) { 15 cout << "里程数已接近汽车极限,行驶请注意安全" << endl; 16 } 17 odometer = odometer1; 18 } 19 20 ostream & operator<<(ostream &out,const car &c) { 21 cout << "汽车制造商:" << c.maker << endl 22 << "汽车型号:" << c.model << endl 23 << "生产年份:" << c.year << endl 24 << "总里程数:" << c.odometer << "km" << endl; 25 return out; 26 }
1 #pragma once 2 #ifndef ELECTRICCAR_H 3 #define ELECTRICCAR_H 4 #include"car.h" 5 #include"battery.h" 6 #include<iostream> 7 #include<string> 8 using namespace std; 9 10 class electricCar :private car, private battery { 11 private: 12 battery b1;//新增成员 13 public: 14 electricCar(string maker0, string model0, int year0, double odometer0 = 0.0, battery b0 = 70) :b1(b0), car(maker0, model0, year0, odometer0) {} 15 friend ostream & operator<<(ostream &out, electricCar &e);//<<重载声明 16 void update_odometer(double meters);//里程数更新 17 }; 18 19 #endif // !ELECTRICCAR_H
1 //坑,主要遇到的坑是不知道如何在派生类中引用基类的友元函数,然后仔细思考了一下,考虑<<重载返回值的类型,翻了翻工具书,解决了嘻嘻嘻。 2 #include"electricCar.h" 3 #include<iostream> 4 #include<string> 5 using namespace std; 6 7 void electricCar::update_odometer(double meters) { 8 car::update_odometer(meters);//调用派生类的成员函数 9 } 10 11 ostream & operator<<(ostream &out, electricCar &e) {//<<重载实现 12 out << (const car &)e;//调用基类中的友元函数. 13 cout << "剩余能量:"; 14 e.b1.get_batterySize(); 15 cout << endl << "可使用时长:"; 16 e.b1.get_using_time(); 17 return out; 18 }
1 #include <iostream> 2 #include<string> 3 using namespace std; 4 5 #include "car.h" 6 #include "electricCar.h" 7 8 int main() { 9 // 测试Car类 10 car oldcar("Audi", "a4", 2016); 11 cout << "--------oldcar's info--------" << endl; 12 oldcar.update_odometer(25000); 13 cout << oldcar << endl; 14 15 // 测试ElectricCar类 16 electricCar newcar("Tesla", "model s", 2016); 17 cout << "\n--------newcar's info--------\n"; 18 newcar.update_odometer(91000);//老师提供的这个语句放错了位置,line17与line18应交换,否则出现提示的位置感觉不太对。 19 cout << newcar << endl; 20 21 system("pause"); 22 23 return 0; 24 }
/*运行截图*/
/*问题描述*/
2、重载运算符[]为一维动态整形数组类ArrayInt的成员函数,使得通过动态整形数组对象名和下标可以 访问对象中具体元素。
/*代码如下*/
1 #ifndef ARRAY_INT_H 2 #define ARRAY_INT_H 3 4 class ArrayInt{ 5 public: 6 ArrayInt(int n, int value=0); 7 ~ArrayInt(); 8 // 补足:将运算符[]重载为成员函数的声明 9 int& operator[](int i); 10 void print(); 11 private: 12 int *p; 13 int size; 14 }; 15 16 #endif
1 #include "arrayInt.h" 2 #include <iostream> 3 #include <cstdlib> 4 using std::cout; 5 using std::endl; 6 7 ArrayInt::ArrayInt(int n, int value): size(n) { 8 p = new int[size]; 9 10 if (p == nullptr) { 11 cout << "fail to mallocate memory" << endl; 12 exit(0); 13 } 14 15 for(int i=0; i<size; i++) 16 p[i] = value; 17 } 18 19 ArrayInt::~ArrayInt() { 20 delete[] p; 21 } 22 23 void ArrayInt::print() { 24 for(int i=0; i<size; i++) 25 cout << p[i] << " "; 26 cout << endl; 27 } 28 29 // 补足:将运算符[]重载为成员函数的实现 30 int& ArrayInt::operator[](int i) { 31 return p[i]; 32 }
1 #include <iostream> 2 using namespace std; 3 4 #include "arrayInt.h" 5 6 int main() { 7 // 定义动态整型数组对象a,包含2个元素,初始值为0 8 ArrayInt a(2); 9 a.print(); 10 11 // 定义动态整型数组对象b,包含3个元素,初始值为6 12 ArrayInt b(3, 6); 13 b.print(); 14 15 // 通过对象名和下标方式访问并修改对象元素 16 b[0] = 2; 17 cout << b[0] << endl; 18 b.print(); 19 20 system("pause"); 21 22 return 0; 23 }
/*运行截图*/
/*拓展部分*/
等我考完离散和英语补上去。(渣渣无力的微笑(透露着疲惫))
二:实验总结与体会
1、第一个问题在敲的过程中出现的问题会比较多,课本上的知识有限,无法避免地需要查找工具书如《C++ Primer 》等,在查找过程中会更好地学习到更多的东西,个人觉得发现问题&自我思考&解决问题,会得到更好地学习效果。
2、世上本没有路,不代表不能出现路。
三:互评地址
1、
2、
3、