今天继续学习类
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
BankAccount a1;
a1.set(1.5, "Alice");
a1.print();
SavingsAccount s1;
s1.print();
s1.set(3.1, "Mike");
s1.print();
关于类中定义静态变量
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值应该都会改变。
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;
}
再验证一下。
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;
}
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
确实是这样的