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

确实是这样的

相关推荐
f狐0狸x1 分钟前
【C++修炼之路】C++string的用法
开发语言·c++·string
阿豪只会阿巴5 分钟前
【多喝热水系列】从零开始的ROS2之旅——Day9 初识话题通信:基本命令
c++·笔记·python·ubuntu·ros2
崎岖Qiu17 分钟前
【OS笔记44】:磁盘存储管理
笔记·操作系统·os
周周记笔记31 分钟前
ESP32-S3 :开发方式笔记(五)
笔记·单片机·嵌入式硬件
June bug32 分钟前
【实习笔记】Fiddler学习笔记
笔记·学习·fiddler
googleccsdn33 分钟前
ENSP Pro Lab笔记:配置BGP EVPN VXLAN双栈(2)
网络·笔记·网络协议
我怕是好33 分钟前
学习STM32 ESP8266
stm32·嵌入式硬件·学习
码小猿的CPP工坊40 分钟前
C++弱引用智能指针std::weak_ptr使用介绍
开发语言·c++
JeffDingAI1 小时前
【Datawhale学习笔记】动手学RNN及LSTM
笔记·rnn·学习
暮色_年华1 小时前
随想3:关于语音采集线程 使用 CFS 调度或者 SCHED_FIFO 的思考
c++