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

确实是这样的

相关推荐
慕容青峰4 分钟前
【2025牛客五一集训派对day4 C】题解
c++·算法·sublime text
星夜9827 分钟前
C++回顾 Day4
开发语言·数据结构·c++
W_Sherlock_Henry1 小时前
AtCoder Regular Contest 197 Div2 A,B题解
c语言·c++·算法
A旧城以西1 小时前
MySQL----数据库的操作
java·开发语言·数据库·sql·学习·mysql
珹洺2 小时前
C++从入门到实战(十三)C++函数模板与类模板初阶讲解
开发语言·数据结构·c++·算法
Green1Leaves2 小时前
从零开始学习人工智能(Python高级教程)Day6-Python3 正则表达式
python·学习·正则表达式
hzj67 小时前
Sentinel学习
分布式·学习·sentinel
強云7 小时前
内存池(C++)
c++
独行soc8 小时前
2025年渗透测试面试题总结-某战队红队实习面经(附回答)(题目+回答)
linux·运维·服务器·学习·面试·职场和发展·渗透测试
JANYI20188 小时前
在c++中老是碰到string&,这是什么意思?
开发语言·c++