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

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

时间:2024-10-16 14:17:18浏览次数:12  
标签: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

相关文章

  • 阿里 C++面试,算法题没做出来,,,
    我本人是非科班学C++ 后端和嵌入式的。在我面试的过程中,竟然得到了阿里​C++研发工程师的面试机会。因为,阿里主要是用Java比较多,C++的岗位比较少​,所以感觉这个机会还是挺难得的。阿里C++研发工程师面试考了我一道类似于快速排序算法的算法题,虽然我算法题又一次没做......