目录
10 对象和类
(1)什么是类?
(2)类如何实现抽象、封装和数据隐藏?
(3)对象和类之间的关系?
(4)除了是函数之外,类函数成员与类数据成员之间的区别是什么?
(5)定义一个类来表示银行帐户。
(7)给出复习题5中的银行账户类的构造函数的代码。
(8)什么是默认构造函数,拥有默认构造函数的好处?
(9)修改Stock类的定义。
(10)this和*this是什么?
11 使用类
(1)使用成员函数为Stonewt类重载乘法运算符。
(2)友元函数与成员函数之间的区别是什么?
(3)非成员函数必须是友元才能访问类成员吗?
(4)使用友元函数为Stonewt类重载乘法运算符。
(5)哪些运算符不能重载?
(6)在重载运算符=、( )、[ ]和->时,有什么限制?
(7)为Vector类定义一个转换函数。
参考文章:《C++ Primer Plus》第十章 对象和类-小结、复习题详解_simon_fighting的博客-CSDN博客
类是用户自己定义的数据类型,里面包括了想要描述操作的数据和数据存储形式以及操作数据要用的方法和函数即接口函数。
抽象:类表示人们可以类方法的公有接口对类对象执行的操作,这是抽象。
封装:类的数据成员可以是私有的,也就是说只能通过成员函数来访问这些数据,这就是数据隐藏。实现的具体细节都是隐藏的,这就是封装。
数据隐藏:类里面定义private部分,私有部分只有通过成员函数才能访问类的成员数据。
类定义了一种数据类型,包括如何使用它。对象是一个变量或其它数据对象,并根据类定义被创建和使用。类和对象之间的关系同标准类型与变量之间的关系相同。
如果创建给定类的多个对象,则每个对象都有其自己的数据内存空间;但所有的对象都使用同一组成员函数(通常,方法是公有的,而数据是私有的,但这只是策略方面的问题,而不是对类的要求)。
数据成员包括储户姓名、 账号(使用字符串) 和存款。 成员函数执行如下操作:
class BankAccount
{
private:
char name[50];
char accountnum[50];
double balance;
public:
BankAccount(const char *client, const char *num, double bal = 0.0);//创建对象并且初始化
void show(void) const;
void deposit(double cash);
void withdraw(double cash);
};
(6)类构造函数在何时被调用?类析构函数呢?
在创建类对象或显式调用构造函数时,类的构造函数都将被调用。当对象过期时,类的析构函数将被调用。
BankAccount::BankAccount(const char *client, const char *num, double bal) //定义形参不添加默认参数
{
name = client;
accountnum = num;
balance = bal;
}
默认构造函数是没有参数或所有参数都有默认值的构造函数。拥有默认构造函数后,可以声明对象而不初始化它,即使已经定义了初始化构造函数。它还使得能够声明数组。
使之包含返回各个数据成员值的成员函数。 注意: 返回公司名的成员函数不应为修改数组提供便利, 也就是说, 不能简单地返回string引用。
#ifndef __STOCK20_H__
#define __STOCK20_H__
#include
//类只作函数的声明
class Stock
{
private:
std::string company;//公司名称
long shares; //股票支数
double share_val;//每支股票的价格
double total_val;//一共股票的总价格
void set_tot() {total_val = shares * share_val;}//比较简短就设置为内联函数
public:
Stock();
// Stock(const std::string &co = "Error", long n= 0, double pr =0.0); //默认构造函数
Stock(const std::string &co , long n, double pr);//获取哪家公司的股票,买多少支股票,每支股票价格
~Stock();
void buy(long num , double price);//购买股票的数量和价格
void sell(long num , double price);//出售股票的数量和价格
void update(double price);//更新股票的价格
void show() const;//显示股票当前信息
//函数返回值是const 类型的引用,函数名为topval,不允许通过this指针隐式访问对象
const Stock &topval(const Stock &s) const;
const string &company_name() const{return company;}
long num_shares() const {return share;}
double shareval() const {return share_val;}
double totalval() const {return total_val;}
};
#endif
this指针是类方法可以使用的指针,它指向用于调用方法的对象。因此,this是对象的地址,*this就是对象本身。
该运算符将数据成员与double类型的值相乘。注意,用英石和磅表示时,需要进位。也就是说,将10英石8磅乘以2等于21英石2磅。 (一英石等于14磅)
// prototype
Stonewt operator*(double mult);
// definition - let constructor do the work
Stonewt Stonewt::operator*(double mult)
{
return Stonewt(mult * pounds);
}
要访问私有成员,它必须是友元,但要访问公有成员,可以不是友元。
该运算符将double值与Stone值相乘。
// 使用友元函数为Stonewt类重载乘法运算符,该运算符将double值与Stone值相乘。
friend Stonewt operator*(double mult, const Stonewt & s);
// definetion - let constructor do the work
Stonewt operator*(double mult, const Stonewt & s)
{
return Stonewt(mult * s.pounds);
}
【sizeof】【.】【.*】【::】【?:】
这些运算符必须使用成员函数来定义。
将Vector类转换为一个double类型的值,后者表示矢量的长度。
operator double() {return mag;}