【C++】面向对象开发基础要点-上(最全)

本文详述了C++面向对象编程的基础要点,包括构造函数、常成员、静态成员、析构函数、类的友元、组合与聚合、类的派生、多态性等概念。通过实例介绍了类的构造、析构顺序,以及如何利用多态性实现代码重用。此外,还讨论了抽象类和多继承的作用及其在实际编程中的应用。
摘要由CSDN通过智能技术生成

20200714@C语言学习第23天,C++学习第6天
(声明:本文中部分代码来源于MOOC中国农业大学公开课)
面向对象的语言相对结构化语言,引入了分类、封装、继承和多态的思想。面向对象的语言有利于更好地组织、管理与重用代码。本文介绍了C++面向对象开发的全部基础要点,其中对难点多态记录尤其详细。
喜欢可以给星星支持!

面向对象程序设计

一、构造函数

构造函数是一种定义在类中的函数。
为了方便其他程序员调用类的时候可以直接在()中初始化变量,可以定义构造函数。

🌰1:
任务:编写一个模拟银行存款账户管理的C++程序
分析:为了编写程序,程序员首先应分析清楚该程序涉及到哪些数据
需要对这些数据进行哪些处理。
银行存款账户应包含账号、账户名、存款金额等数据。
管理银行存款账户应能够进行开户、存款、取款、查询余额等操作。

  • (1)首先写一个头文件来声明类

代码1

//头文件:account.h
class Account //类声明部分
{
   
public:
    int no;           //账号(变量)
    char name[10];    //账户名(变量)
    float money;      //存款金额(变量)
    void Deposit();   //存款(操作)
    void Withdraw()//取款(操作)
    void Show();      //显示余额(操作)
  • (2)然后定义函数
    代码2
//源程序文件:Account.cpp
#include <iostream>
using namespace std;
#include "account.h"  //插入头文件account.h,声明银行账户类Account
//类实现部分
void Account::Deposit() //存款操作
{
   
    cout << "请输入存款金额";
    float x;  cin >> x;
    money += x;
    Show();  //显示存款后的账户余额
}
void Account::Withdraw()  //取款操作
{
   
    cout << "请输入取款金额";
    float x; cin >> x;
    if(money < x) cout << "账户余额不足。";
    else money -= x;
    Show();  //显示取款后的账户余额
}
void Account::Show()  //显示余额操作
{
   
    cout << "账号" << no << "的账户余额为:" << money << "元\n\n";
}
  • (3)编写主函数

代码3

#include <iostream>
using namespace std;
#include "account.h"  //插入头文件account.h,声明银行账户类Account
#include <string.h>
int main()
{
   
    //键盘输入账号、账户名和存款金额等待开户信息,先定义3个临时变量
    cout << "请输入开户信息(账号账户名与金额:";
    int x; char str[10]; float y;
    cin >> x >> str >> y;
    
    //创建账户
    Account obj; //定义一个银行账户类Account的对象obj
    obj.no = x; strcpy[obj.name,str]; obj.money = y;

    //管理账户
    int choice;
    while(true)
    {
   
        cout << "1-存款\n2-取款\n3-查询余额\n0-推出\n请选择\n";
        cin >> choice;
        if(choice == 0) break;
        if(choice == 1) obj.Deposit();
        else if(choice == 2) obj.Withdraw();
        else if(choice == 3) obj.Show();
    }
return 0;
}
  • (4)代码的完善与优化

在类定义中设置访问权限
代码4

class Account 
{
   
private:
    int no;
    char name[10];
    float money;
public:
    void Deposit();
    void Withdraw();
    void Show();
    Account(int iniNo, char*iniName, float iniMoney); 
}

定义构造函数
代码5

Account::Account(int iniNo,char*iniName,float iniMoney)
{
   
    no = iniNo; strcpy(name,iniName); money = iniMoney;
}

程序员乙调用的时候就可以直接初始化变量

代码6

Account obj(x,str,y);

二、类中的常成员

首先来看一串简单的养鱼池工程造价计算的代码

代码7

#include<iostream>
using namespace std;
class CirclePool 
{
   
private:
    double price;   //圆形水池建造单价(10元/m^2)
    double r;       //半径(m)
public:
    CirclePool(double p1=, double p2 = 0){
   price = p1;r = p2;} //构造函数
    void SetPrice(double x)   //设置建造单价
    {
   
        if(x<=0){
   price = 0; cout<<""<<endl;}   //数据合法性检查
        else price = x;
    }
    double GetPrice(){
   return price;}   //读取建造单价
    void SetRadius(double x)           //设置半径
    {
   
        if(x<=0){
   r=0;cout<<""<<endl;   //数据合法性检查
        else r = x;
    }
    double GetRadius(){
   return r;}      //读取半径
    double GetCost(){
   return(3.14*r*r*price);}    //计算圆形水池的造价
};
int main()          //主函数:测算养鱼池工程总造价
{
   
    double totalCost = 0;
    double r1,r2; cin>>r1>>r2; //先输入圆形清水池和污水池的半径r1、r2
    CirclePool pool1,pool2;    //定义圆形清水池对象pool1、圆形污水池对象pool2
    pool1.SetPrice(10);
    pool1.SetRadius(r1);
    totalCost += pool1.GetCost();
    pool2.SetPrice(10);
    pool2.SetRadius(r2);
    totalCost += pool2.GetCost();
    cout<<totalCost<<endl;
    return 0;
} 
  • 常数据成员

上面造价price和半径r都定义成私有变量
因此外界访问时需要通过共有函数函数成员
SetPrice、GetPrice、SetRadius和GetRadius
来赋值与访问私有变量。
这样可以方便数据检查。

定义类时,使用Const关键字进行限定的成员称为常成员。
数据成员和函数成员都可以定义成常成员。
定义常成员的目的是保护数据成员不被修改
如果一个变量初始化后不再改变
就可以定义成常成员

注:类中的所有成员,都不能在声明时直接赋初始值
必须通过构造函数进行初始化

上面那段代码将price改成常成员,就可以将【代码7】中的
double price;
改为
const double price;

同时,将构造函数
CirclePool(double p1=, double p2 = 0) { price = p1 ; r = p2 ; }
改成
CirclePool(double p1=, double p2 = 0) : price(p1) { r = p2 ; }

在主函数中,定义清水池pool1、pool2必须初始化
CirclePool pool1(10,r1) , pool2(10,r2);
后面也不能用SetPrice函数修改单价

代码8

#include<iostream>
using namespace std;
class CirclePool 
{
   
private:
    const double price;   //圆形水池建造单价(10元/m^2)
    double r;       //半径(m)
public:
    CirclePool(double p1=, double p2 = 0):price = p1{
   r = p2;} //构造函数
    double GetPrice(){
   return price;}   //读取建造单价
    void SetRadius(double x)           //设置半径
    {
   
        if(x<=0){
   r=0;cout<<""<<endl;   //数据合法性检查
        else r = x;
    }
    double GetRadius(){
   return r;}      //读取半径
    double GetCost(){
   return(3.14*r*r*price);}    //计算圆形水池的造价
};
int main()          //主函数:测算养鱼池工程总造价
{
   
    double totalCost = 0;
    double r1,r2; cin>>r1>>r2; //先输入圆形清水池和污水池的半径r1、r2
    CirclePool pool1(10,r1),pool2(10,r2);    //定义圆形清水池对象pool1、圆形污水池对象pool2
    pool1.SetRadius(r1);
    totalCost += pool1.GetCost();
    pool2.SetRadius(r2);
    totalCost += pool2.GetCost();
    cout<<totalCost<<endl;
    return 0;
} 
  • 常函数成员
    只能读类中的数据成员,不能修改赋值

内联函数,就是在类声明大括号内定义函数:

double GetCost() const{
   return(3.14*r*r*price);}

非内联函数也是在声明部分添加const,然后实现时添加完整函数代码。

double GetCost() const; //声明
double CirclePool :: GetCost() const  //实现
{
    return(3.14*r*r*price);}

三、类中的静态成员

  • 静态数据成员

在定义类时,只需要初始值的变量,可以设置成静态数据成员,以节约内存。
一种方法是定义成全局变量

#include<iostream>
using namespace std;
double price = 10;
class CirclePool
{
   
private:
    double r;
public:
    CirclePool(double p1 = 0){
   r = p1;}
    //...
}
int main()
{
   ...}

面向对象的设计建议将全局变量归属到某个类中进行统一管理。
这种特殊的成员就是静态数据成员

#include<iostream>
using namespace std;
class CirclePool
{
   
private:
    static double price;   //修改1:声明时使用“static”关键字
    double r;
public:
    CirclePool(double p1 
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值