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

确实是这样的

相关推荐
linux kernel9 分钟前
第七讲:C++中的string类
开发语言·c++
Tipriest_22 分钟前
[数据结构与算法] 优先队列 | 最小堆 C++
c++·优先队列·数据结构与算法·最小堆
宛西南浪漫戈命35 分钟前
Centos 7下使用C++使用Rdkafka库实现生产者消费者
c++·centos·linq
饕餮争锋1 小时前
设计模式笔记_创建型_建造者模式
笔记·设计模式·建造者模式
萝卜青今天也要开心1 小时前
2025年上半年软件设计师考后分享
笔记·学习
amazinging2 小时前
北京-4年功能测试2年空窗-报培训班学测开-第四十七天
python·学习·selenium
吃货界的硬件攻城狮2 小时前
【STM32 学习笔记】SPI通信协议
笔记·stm32·学习
一个天蝎座 白勺 程序猿2 小时前
Python练习(1)Python基础类型操作语法实战:20道实战题解与案例分析(上)
开发语言·python·学习
帅_shuai_2 小时前
C++ 模板参数展开
c++
蓝染yy2 小时前
Apache
笔记