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

确实是这样的

相关推荐
晨非辰8 分钟前
#C语言——刷题攻略:牛客编程入门训练(四):运算
c语言·开发语言·学习·学习方法·visual studio
键盘敲没电29 分钟前
【iOS】KVO
学习·macos·ios·objective-c·cocoa
爱掉发的小李36 分钟前
Linux 环境下 Docker 安装与简单使用指南
java·linux·运维·c++·python·docker·php
澄澈i1 小时前
设计模式学习[17]---组合模式
c++·学习·设计模式·组合模式
我命由我123452 小时前
Windows 操作系统 - Windows 设置始终使用 Windows 照片查看器打开图片
运维·windows·经验分享·笔记·学习·操作系统·运维开发
1白天的黑夜12 小时前
前缀和-1314.矩阵区域和-力扣(LeetCode)
c++·leetcode·前缀和
jdlxx_dongfangxing3 小时前
2023 年 NOI 最后一题题解
c++·noi
mailtolaozhao3 小时前
PPT写作五个境界--仅供学习交流使用
学习·ppt
Q741_1473 小时前
优选算法 力扣 202.快乐数 快慢双指针 解决带环问题 C++解题思路 每日一题
c++·算法·leetcode·快慢双指针·环形问题
R-G-B3 小时前
【C++ 初级工程师面试--4】形参带默认值的函数,特点,效率,注意事项
开发语言·c++·形参带默认值的函数·形参默认值特点,效率,注意事项·形参默认值特点·形参默认值效率·形参默认值注意事项