欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > cpp学习笔记2--class

cpp学习笔记2--class

2025/5/7 14:23:41 来源:https://blog.csdn.net/qq_61911942/article/details/147729459  浏览:    关键词: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

确实是这样的

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词