一个简单的类设计
class IntCell{
public:
explicit IntCell(int init = 0):val(init){}
int read() const{ return val; }
void write(int x){val = x;}
private:
int val;
}
知识点1
:所有的单参数构造函数必须是 explicit
修饰,避免隐式类型转化。例如:
IntCell obj;
obj = 37; //无法赋值,由于构造函数的限制,37不能创建一个临时对象
obj.write(37); //ok
编译器试图
obj = 37;
转换为
IntCell temporary(37); obj = temporary;
知识点2
:const
修饰成员函数,将修声明为访问函数。
int read() const { return val; }
const
修饰在函数名的括号后,表示当前函数为访问函数,而不是修改函数,无法修改成员变量值。
const
修饰在函数名的括号后,是函数签名的一部分。也就是说,可以存在两个同名同参数列表的一个const一个非const函数。const的类对象无法访问非const的成员函数。
知识点3
:三大函数:拷贝构造、拷贝赋值、析构函数
拷贝构造函数的调用时刻
//声明对象的同时初始化
IntCell B = C; //也是拷贝构造,而不是拷贝赋值
IntCell B(C);
拷贝构造函数定义
IntCell::IntCell(const IntCell & rhs):val(rhs.val) {}
拷贝赋值函数定义
const IntCell & IntCell::operator=(const IntCell & rhs){
if(this != &rhs) //避免自我赋值
val = rhs.val;
return *this;
}
返回值的考虑:返回一个对象可以满足链式赋值:
a = b = c;
析构函数定义
IntCell::~IntCell(){
// 如果有指针成员变量,应该 delete 指针
}
完全的类声明
class IntCell
{
public:
explicit IntCell(int val = 0);
IntCell(const IntCell & rhs);
~IntCell();
const IntCell & operator=(const IntCell & rhs);
int read() const;
void write(int x);
private:
int *val;
};
IntCell::IntCell(int val){
val = new int(val);
}
IntCell::IntCell(const IntCell & rhs){
val = new int (*rhs.val);
}
const IntCell & IntCell::operator=(const IntCell & rhs){
if(this != &rhs)
*val = *rhs.val; //在构造函数时,就定义了内存空间,因此直接赋值即可
return *this;
}
int IntCell::read() const{
return val;
}
void IntCell::write(int x){
*val = x;
}
题 1.13
题目描述:设计一个类模板Collection
,来存储Object
对象的集合(在一个数组中),以及该集合当前的大小。提供public
型的函数isEmpty
makeEmpty
insert
remove
contains
。当且仅当该集合中存在等于x
的一个Object
时,contains(x)
返回true
。
题目先供大家思考,之后补上我的设计。可以一起讨论。