1.构造函数中初始化对象的成员变量。掌握这种方法。
CAT():
ItsAge(5),
ItsWeight(8)
{}
2.复制构造函数在每次复制一个对象时调用。所有的复制构造函数均有一个参数,即对同一个类的对象的引用。使这个引用成为常量最好,这样构造函数就不必改变传递进来的对象。如:
CAT(const CAT& theCat);
3.一般的复制构造函数,执行的是成员复制,简单的将成员变量复制到新的对象中,这样容易造成内存泄漏(迷途指针)。因此,复制构造函数采取开辟新的内存区来避免这种问题的发生,这也叫深层复制。如:
CAT(const CAT& rhs)
{itsAge=new int;itsWeight=new int;
*itsAge=rhs.GetAge();*itsWeight=rhs.GetWeight();}
4.运算符重载。让对象之间(其实是对象的成员变量)可以直接进行加减乘除等运算。
重载前置运算符的格式:returnType operator op;这里op是要重载的运算符(+、—等)。如
void operator ++(){++itsVal;}
在生成的对象i进行自加执行简单的命令:++i;
如果要将自加后的对象赋给其他的对象,则只需修改函数返回值的类型为类对象。
几种不同的前置运算符的声明方法,注意返回值的类型:
classType operator ++(){++itsVal;return classType(itsVal);}
const classType& operator ++(){++itsVal;returh *this;}
在效率方面,最后一个声明语句较好。
5.后置运算符的声明。同前置运算符的区别在于加入一个整型参数。如:
void operator ++(int flag){itsVal++;}
其中参数flag并不参加任何运算,只是标明是后置运算符的声明。
6.重载加号运算符。声明如下:
classType operator+ (const classType& rhs){return classType(itsVal+rhs.GetVal());}
这样可以对实例化的两个对象进行加法运算。
7.赋值运算符。声明如下:
classType operator= (classType& rhs);
为避免对象对自身的赋值,必须检查赋值运算符的右边是否是对象的本身。实现如下:
{if(*this==rhs) return;
..........................
return *this;}
8.处理数据类型的转换。比如将一个数据类型变量如int或unsigned int赋给用户自定义的对象。如果没有其他构造函数,编译器会报错。
为完成这种类型转换,需要添加一个用此种数据类型的变量做参数的构造函数。如
CAT(it val);
这个构造函数从整型变量创建一个CAT对象。
要注意,所有的运算符重载均是以同样的方式进行的——用operator声明重载运算符。对于双目运算符(如=或+),右边的变量变成了参数。这是由构造函数完成的。如:
a=b;
变成
a.operator=(b);
评论