cpp学习笔记2--class

今天继续学习类

cpp 复制代码
class BankAccount {
private:
    double balance;
protected:
    std::string accountNumber;
public:
    void deposit(double amount) {
        balance += amount;
    }
    double getBalance() const {
        return balance;
    }
    void set(double b,std::string x)
    {
        balance = b;
        accountNumber = x;
    }
    void print() const
    {
        std::cout << "balance:" << balance << std::endl;
        std::cout << "account:" << accountNumber << std::endl;
    }
};
// 派生类
class SavingsAccount : public BankAccount {
private:
    double interestRate;
public:
    // 新增功能
    void applyInterest() {
        deposit(getBalance() * interestRate);
    }

    // 可以访问基类的protected成员
    void setAccountNumber(const std::string& num) {
        accountNumber = num; // 允许访问基类的protected成员
    }

    // 不能直接访问基类的private成员
    // void setBalance(double b) {
    //     balance = b; // 错误!不能访问基类的private成员
    // }
};

double getBalance() const,首先这个const放在后面我是没见过的,它的意思是这个函数不允许修改除了mutable型之外的class的成员变量,无论是private还是protected。

protected有点像介于public和private之间,像private是因为BankAccount a1;a1.accountNumber是无法访问的,而同一类的public函数可以访问;像public是因为,派生类SavingsAccount可以直接访问pubilc和protected,却不能访问private。

接下来是派生类,它可以直接继承基类的public和protected,但是不会把值也继承了。如下的输出结果,还是要自己初始化的。需要注意的是,s1虽然无法访问balance,但是可以访问print,print可以访问balance,也就是private变量不可以直接访问,但可以间接访问。

balance:1.5

account:Alice

balance:0

account:

balance:3.1

account:Mike

cpp 复制代码
BankAccount a1;
a1.set(1.5, "Alice");
a1.print();
SavingsAccount s1;
s1.print();
s1.set(3.1, "Mike");
s1.print();

关于类中定义静态变量

cpp 复制代码
class SavingsAccount : public BankAccount {
private:
    double interestRate;
    static double bank;
    double road;
public:

    void s_print()
    {
        std::cout << "interest:" << &interestRate << std::endl;
        std::cout << "bank:" << &bank << std::endl;
        std::cout << "road:" << &road << std::endl;
    }
};

static变量在main.cpp中必须初始化,而且必须在main外,因为static是在存储区的,不在堆栈区。

下面的输出就是

interest:000000141DEFF820

bank:00007FF634185078

road:000000141DEFF828

s1:000000141DEFF7F8

cat:00007FF634185680

可以看到,bank的地址和interest、road乃至s1都不一样,只和cat是一类的,说明它不属于堆栈区。既然如此,那修改一个bank所有SavingsAccount类的bank值应该都会改变。

cpp 复制代码
double SavingsAccount::bank = 0.0;
double cat;
int main() {
    SavingsAccount s1;
    s1.s_print();
    std::cout << "s1:" << &s1 << std::endl;
    std::cout << "cat:" << &cat << std::endl;
    return 0;
}

再验证一下。

cpp 复制代码
void set_bank(double x)
{
    bank = x;
}

void s_print()
{
    std::cout << "interest:" << &interestRate << std::endl;
    std::cout << "bank:" << &bank << std::endl;
    std::cout << "road:" << &road << std::endl;
    std::cout << "bank value:" << bank << std::endl;
}
cpp 复制代码
SavingsAccount s1,s2;
s1.s_print();
std::cout << "s1:" << &s1 << std::endl;
std::cout << "cat:" << &cat << std::endl;
s2.s_print();
s1.set_bank(6.2);
s1.s_print();
s2.s_print();

输出

interest:000000141DEFF820

bank:00007FF634185078

road:000000141DEFF828

bank value:10

s1:000000141DEFF7F8

cat:00007FF634185680

interest:000000141DEFF7E8

bank:00007FF634185078

road:000000141DEFF7F0

bank value:10

interest:000000141DEFF820

bank:00007FF634185078

road:000000141DEFF828

bank value:6.2

interest:000000141DEFF7E8

bank:00007FF634185078

road:000000141DEFF7F0

bank value:6.2

确实是这样的

相关推荐
薛定e的猫咪1 分钟前
【ICML 2025】MODULI:基于扩散模型解锁离线多目标强化学习的偏好泛化
人工智能·学习·算法·机器学习
码农-阿杰2 分钟前
Java 线程中断机制深度解析:从 API 到底层 C++ 实现
java·开发语言·c++
咸鱼翻身小阿橙3 分钟前
Qt Quick 登录界面代码学习笔记
笔记·qt·学习
Brilliantwxx3 分钟前
【C++】priority_queue以及 仿函数 的学习
开发语言·c++·笔记·学习·算法
宠..12 分钟前
VS Code 修改 C++ 标准同时修改错误检测标准
java·linux·开发语言·javascript·c++·python·qt
小+不通文墨12 分钟前
树莓派4b-wiringpi库的安装和使用
驱动开发·经验分享·笔记·嵌入式硬件·学习
xuhaoyu_cpp_java27 分钟前
SpringMVC学习(三)
java·经验分享·笔记·学习·spring
学机械的鱼鱼44 分钟前
【学习笔记】XTDrone2 目录结构说明
笔记·学习
wuyoula1 小时前
如何在捷云鲸论坛高效获取高质量技术解答?
服务器·c++·人工智能·tcp/ip·源码
.YM.Z1 小时前
C++类和对象(中)
c++·类和对象