一、类
类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程技术。
二、编写一个简单的类
首先我们先编写一个简单的类,当然你要对类的基础有些概念才容易理解。本次我们将会分为三个文件,结果如图所示。这里cqu_car.h是类的接口,而cqu_car.cpp是数据的实现部分,他们是分离开的,main.cpp中会调用这个类来实现一些功能。
./
├── include
│ └── cqu_car.h
└── src
├── cqu_car.cpp
└── main.cpp
现在依次展示代码
cqu_car.h
#ifndef CQU_CAR_H
#define CQU_CAR_H#include <iostream>
#include <string>class CQU_Car
{
//公有部分
public://构造函数CQU_Car(){}//析构函数~CQU_Car(){}int Set_Car_License(const std::string& s);std::string Check_Car_License();//私有部分
private:std::string car_license__;};#endif
cqu_car.cpp
//CQU_Car的实现部分
#include "cqu_car.h"int CQU_Car::Set_Car_License(const std::string& s) //这里传入引用可以避免不必要的复制
{car_license__ = s;return 0;
}std::string CQU_Car::Check_Car_License()
{std::cout << "car_license__ = " << car_license__ << std::endl;return car_license__;
}
main.cpp
//在这个示例程序中我们将使用我们之前写好的CQU_Car类#include <iostream>
#include <string>#include "cqu_car.h"int main(int argc , char* argv[])
{CQU_Car car_jiang;car_jiang.Set_Car_License("EA888888");std::cout << "i set a car" << std::endl;car_jiang.Check_Car_License();return 0;
}
那么通过该示例程序,你能知道如何使用类,对了如果您是使用CMakeList.txt的话
在main和cqu_car要放在一起来编译,不然会找不到类实现代码。
三、做一些优化修改
在类中我们的构造函数初始化列表可以帮助我们初始化一些常量,同时使用this指针也可以很方便的返回对象自己,最后使用const关键字做好变量的保护。
cqu_car.h
#ifndef CQU_CAR_H1
#define CQU_CAR_H1#include <iostream>
#include <string>class CQU_Car
{
friend double Show_Car_Value_(CQU_Car& car); //友元函数,使该函数可以访问类的私有部分
//公有部分
public://构造函数CQU_Car(const std::string &pro_time):production_time__(pro_time){if(production_time__.empty()) //这里的构造函数我建议给出异常检测来检测常量生产日期不会是奇怪的值{throw std::invalid_argument("production time error!");//检测手段有点简单,到时候可以加一点检测手段}}//析构函数~CQU_Car(){}int Set_Car_License(const std::string& s);std::string Check_Car_License();CQU_Car& PK_new_Car(CQU_Car& car);void Show_all_carinfo() const; //这个const意味着,在函数中一定不会修改变量的值。//私有部分
private:std::string car_license__; //车牌号码const std::string production_time__; //生产日期,使用了常量字符串,所以需要修改构造函数。//具体原因如下,const是一个需要再定义的时候初始化的,而每辆车的生产日期都不一样,所以我们要修改构造函数。};double Show_Car_Value_(CQU_Car& car);#endif
cqu_car.cpp
//CQU_Car的实现部分
#include "cqu_car1.h"int CQU_Car::Set_Car_License(const std::string& s) //这里传入引用可以避免不必要的复制
{car_license__ = s;return 0;
}std::string CQU_Car::Check_Car_License()
{std::cout << "car_license__ = " << car_license__ << std::endl;return car_license__;
}CQU_Car& CQU_Car::PK_new_Car(CQU_Car& car)
{if(car.production_time__ > this->production_time__ ){return car;}return *this;
}void CQU_Car::Show_all_carinfo() const
{std::cout << "show all info:" << std::endl;std::cout << "car_license__ = " << car_license__ << "\n"<< "production_time__ = " << production_time__ << std::endl;}double Show_Car_Value_(CQU_Car& car)
{if(car.production_time__ > "2024-11-02") //在类外定义的函数,但是通过友元可以访问类的私有部分。{return 3000.00;}return 2500.00;
}
mian.h
//在这个示例程序中我们将使用我们之前写好的CQU_Car类#include <iostream>
#include <string>
#include <iomanip> // 这个头文件是控制输出的头文件,在下面我们要求输出保留两位小数的使用使用。#include "cqu_car1.h"int main(int argc , char* argv[])
{CQU_Car car_jiang("2024-10-21");car_jiang.Set_Car_License("EA888888");std::cout << "i set a car" << std::endl;car_jiang.Check_Car_License();//CQU_Car car_wang(""); //在构造函数里面抛出异常来解决此情况CQU_Car car_yang("2024-12-24");car_yang.Set_Car_License("YB111111");(car_yang.PK_new_Car(car_jiang)).Check_Car_License(); //最左边的括号并无实际意义,让看的更清楚用的car_jiang.Show_all_carinfo();//car_jiang.Show_Car_Value_(); //友元函数并不能使用 对象实体.友元函数 来调用,而是直接 友元函数来使用的,所以在定义的时候也要加入参数。std::cout << std::fixed << std::setprecision(2) << "Value = " << Show_Car_Value_(car_jiang) << std::endl;;return 0;
}