当前位置: 首页 > java >正文

cpp学习笔记2--class

 今天继续学习类

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

确实是这样的

http://www.xdnf.cn/news/4303.html

相关文章:

  • STL详解 - map和set
  • tinyrenderer笔记(Shader)
  • OpenCV进阶操作:角点检测
  • WebGIS架构中,各部分承担的角色
  • MySQL 8.0 单节点部署与一主两从架构搭建实战
  • C++ 重载
  • 双口万兆光纤网卡:高性能网络的基石与应用展望
  • 端口安全基本配置
  • AI数据分析中的伪需求场景:现状、挑战与突破路径
  • 内存的位运算
  • 从设计到应用:大尺寸PCB打样的关键领域解析
  • CEF格式说明
  • 深入理解Python异步编程:从协程到高性能IO密集型应用
  • 基于【抖音弹幕抓取数据推送】——制作抖音消息分类查看界面
  • 消失的两个数字 --- 位运算
  • MySQL中的约束
  • 基于STM32、HAL库的SST26VF064B NOR FLASH存储器驱动应用程序设计
  • Python __new__ 一个特殊的静态方法
  • 理清缓存穿透、缓存击穿、缓存雪崩、缓存不一致的本质与解决方案
  • 依赖注入详解与案例(前端篇)
  • 基于ASP.NET+MySQL实现待办任务清单系统
  • 信奥赛CSP-J复赛集训(DP专题)(37):P4170 [CQOI2007] 涂色
  • [学习]RTKLib详解:rtkcmn.c与rtkpos.c
  • 学习Python的第二天之网络爬虫
  • cephadm部署ceph集群
  • php案列
  • QML ProgressBar控件详解
  • G919-GAS软件 JSON格式数据通讯协议-阵列数据解析
  • SQLark可以支持PostgreSQL了,有哪些新功能?
  • C++ Avl_Tree