首页 > 编程语言 >c++面向对象的两种格式

c++面向对象的两种格式

时间:2024-10-16 14:17:18浏览次数:9  
标签:std BankAccount string double c++ 面向对象 initialBalance 格式 balance

        面向对象编程(OOP)是C++的一个重要特性,它允许你将代码组织成类(class)和对象(object),从而提高代码的可读性、可维护性和复用性。所以,在项目开发中使用面向对象编程是非常重要的,即便函数也可以提高封装性,但是,类的使用通俗来说,直接将函数封装,同时可以通过继承父类来大大提高了封装的效率。下面,我将会通过一个简单的例子来介绍面向对象编程。

        一般,在进行面向对象编程时会包括两部分,private和public部分。private部分一般只能被类的成员函数、友元函数或派生类(在继承的情况下)访问;public部分可以被类的外部用户直接访问。一般情况下,类的属性是在private中定义的。如下:

class Test {
private:
 
    pass;

public:

    pass;

        面向对象编程一般有2种格式书写,根据不同的习惯可以分为类的定义和实现分离或者类的定义和实现在一起。一般,前者一般应用于大型或复杂的项目中,通常会使代码更加模块化、可维护性和可读性更高;后者一般应用在小型或简单的项目中,减少文件数量。

      下面,将通过一个案例来详细介绍一下这两种格式。

类的定义和实现分离

#include <iostream>  
#include <string>  
  
// 类定义开始  
class BankAccount {  
private:  
    std::string owner;  
    double balance;  
  
public:  
    // 构造函数声明,声明类的传入参数
    BankAccount(std::string name, double initialBalance);  
  
    // 成员函数声明  
    std::string getOwner() const;  
    double getBalance() const;  
    void deposit(double amount);  
    void withdraw(double amount);  
}; 



 
BankAccount::BankAccount(std::string name, double initialBalance) {  
    owner = name;  
    if (initialBalance > 0) {  
        balance = initialBalance;  
    } else {  
        balance = 0.0;  
        std::cerr << "Error: Initial balance must be positive." << std::endl;  
    }  
}  
  
// 成员函数实现
std::string BankAccount::getOwner() const {  
    return owner;  
}  
  
double BankAccount::getBalance() const {  
    return balance;  
}  
  
void BankAccount::deposit(double amount) {  
    if (amount > 0) {  
        balance += amount;  
    } else {  
        std::cerr << "Error: Deposit amount must be positive." << std::endl;  
    }  
}  
  
void BankAccount::withdraw(double amount) {  
    if (amount > 0 && amount <= balance) {  
        balance -= amount;  
    } else if (amount > balance) {  
        std::cerr << "Error: Insufficient funds." << std::endl;  
    } else {  
        std::cerr << "Error: Withdrawal amount must be positive." << std::endl;  
    }  
}  
// 实现部分结束  
  
// 主程序部分  
int main() {  
    BankAccount account1("Alice", 1000.0);  
    BankAccount account2("Bob", 500.0);  
  
    std::cout << "Account1 owner: " << account1.getOwner() << ", balance: " << account1.getBalance() << std::endl;  
    std::cout << "Account2 owner: " << account2.getOwner() << ", balance: " << account2.getBalance() << std::endl;  
  
    account1.deposit(200.0);  
    account2.withdraw(100.0);  
  
    std::cout << "After deposit and withdrawal:" << std::endl;  
    std::cout << "Account1 balance: " << account1.getBalance() << std::endl;  
    std::cout << "Account2 balance: " << account2.getBalance() << std::endl;  
  
    return 0;  
}

        这种格式一般在项目中使用的较多,对于经常做项目的应该了解更多,同时维护和可读性也更高。一般来说,代码中上面类的定义会放在头文件.h中,根据不同人的习惯也都可以。同时,上面格式在成员函数实现时需要采用void BankAccount::withdraw(double amount)这种形式,需要加上类的声明。此外,我们发现在实例化类时,往类里面进行传参了,如下:

BankAccount account1("Alice", 1000.0);

        这是因为我们在上面进行了类的参数定义。

 // 构造函数声明,声明类的传入参数
    BankAccount(std::string name, double initialBalance); 

类的定义和实现在一起:

#include <iostream>  
#include <string>  

// 定义一个银行账户类  
class BankAccount {
private:
    std::string owner;
    double balance;

public:
    // 构造函数  
    BankAccount(std::string name, double initialBalance) {
        owner = name;
        if (initialBalance > 0) {
            balance = initialBalance;
        }
        else {
            balance = 0.0;
            std::cerr << "Error: Initial balance must be positive." << std::endl;
        }
    }

    // 获取账户所有者  
    std::string getOwner() const {
        return owner;
    }

    // 获取账户余额  
    double getBalance() const {
        return balance;
    }

    // 存款  
    void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
        }
        else {
            std::cerr << "Error: Deposit amount must be positive." << std::endl;
        }
    }

    // 取款  
    void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
        }
        else if (amount > balance) {
            std::cerr << "Error: Insufficient funds." << std::endl;
        }
        else {
            std::cerr << "Error: Withdrawal amount must be positive." << std::endl;
        }
    }
};

int main() {
    // 创建银行账户对象  
    BankAccount account1("Alice", 1000.0);
    BankAccount account2("Bob", 500.0);

    // 打印初始余额  
    std::cout << "Account1 owner: " << account1.getOwner() << ", balance: " << account1.getBalance() << std::endl;
    std::cout << "Account2 owner: " << account2.getOwner() << ", balance: " << account2.getBalance() << std::endl;

    // 进行存款和取款操作  
    account1.deposit(200.0);
    account2.withdraw(100.0);

    // 打印新的余额  
    std::cout << "After deposit and withdrawal:" << std::endl;
    std::cout << "Account1 balance: " << account1.getBalance() << std::endl;
    std::cout << "Account2 balance: " << account2.getBalance() << std::endl;

    return 0;
}

        第二种格式如上,我们发现并没有类方法的定义,而方法的实现是在类里面,对比第一种很容易发现不够清晰可读。所以,建议大家学习时多采用第二种格式来书写。同时在采用第二种方式时,如果需要在其他文件中实例化这个类还需要转成第一种的格式。

最后的运行结果如下,大家可以根据结果带入代码来理解代码。

标签:std,BankAccount,string,double,c++,面向对象,initialBalance,格式,balance
From: https://blog.csdn.net/2301_76181257/article/details/142978806

相关文章

  • Python实现K近邻算法:面向对象的思路与详细案例解析
    目录Python实现K近邻算法:面向对象的思路与详细案例解析引言一、K近邻算法的基本原理1.1K近邻算法的核心思想1.2距离度量1.3K的选择二、面向对象的KNN实现2.1类设计2.2Python代码实现2.3代码详解三、案例分析3.1案例一:鸢尾花分类问题描述数据准备模型训练与预测......
  • Python实现朴素贝叶斯算法:面向对象的思路与详细案例解析
    目录Python实现朴素贝叶斯算法:面向对象的思路与详细案例解析引言一、朴素贝叶斯算法的基本原理1.1贝叶斯定理1.2朴素假设二、面向对象的朴素贝叶斯实现2.1类设计2.2Python代码实现朴素贝叶斯分类器实现2.3代码详解三、案例分析3.1案例一:鸢尾花分类问题描述数据......
  • 南沙C++信奥赛陈老师解一本通题 1943:【08NOIP普及组】排座椅
    ​ 【题目描述】上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的DD对同学上课时会交头接耳。同学们在教室中坐成了MM行NN列,坐在第ii行第jj列的同学的位置是(i,ji,j......
  • 每日OJ题_牛客_礼物的最大价值_路径dp_C++_Java
    目录牛客_礼物的最大价值_路径dp题目解析C++代码Java代码牛客_礼物的最大价值_路径dp礼物的最大价值_牛客题霸_牛客网(nowcoder.com)描述:        在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子......
  • 【C++】C++ STL 树形结构容器全解析:map、set、multimap、multiset 的使用与区别
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriority......
  • GESP2024年9月认证C++四级( 第一部分选择题(1-5))
    题三代码:#include<iostream>usingnamespacestd;//全局变量var,初始化为100intvar=100;//函数定义voidfunction(){//局部变量var,只在这个函数内部可见,初始化为200intvar=200;//输出局部变量var的值,即200......
  • C++ STL迭代器、resize和reserve区别、map和unordered_map区别,vector和List区别、map
    1.STL迭代器删除元素迭代器失效是指在对容器进行修改时,原有的迭代器可能变得不可用。正确删除元素的方法是使用erase,并返回新的有效迭代器。示例代码#include<iostream>#include<vector>intmain(){  std::vector<int>vec={1,2,3,4,5};  //输出......
  • 实验1 现代C++编程初体验
    四。实验结论1.实验任务1#include<iostream>#include<string>#include<vector>#include<algorithm>usingnamespacestd;//声明//模板函数声明template<typenameT>voidoutput(constT&c);//普通函数声明voidtest1();voidtest2();voi......
  • 实验1 现代C++基础编程
    任务1源代码task1.cpp//本例用到以下内容://1.字符串string,动态数组容器类vector、迭代器//2.算法库:反转元素次序、旋转元素//3.函数模板、const引用作为形参#include<iostream>#include<string>#include<vector>#include<algorithm>usingnamespacestd......
  • 阿里 C++面试,算法题没做出来,,,
    我本人是非科班学C++ 后端和嵌入式的。在我面试的过程中,竟然得到了阿里​C++研发工程师的面试机会。因为,阿里主要是用Java比较多,C++的岗位比较少​,所以感觉这个机会还是挺难得的。阿里C++研发工程师面试考了我一道类似于快速排序算法的算法题,虽然我算法题又一次没做......