默认构造函数问题
只有在没有自定义的任何构造函数的情况下,编译器才会提供默认构造函数,如果程序员有为类设计了构造函数,那么程序员也必须提供默认构造函数。如果不提供,像这种声明将会是非法的:Person ligang;
const成员函数问题
注意如果类的成员函数不需要修改调用对象,那么就尽量将其设计成const成员函数,格式是在函数的最后加上const关键字,例如:
char* Person::getName( ) const
this指针问题
下边讲解一下this指针相关的问题,还是以上边这个函数为例,实际上在编译器处理类的成员函数时,会自动添加一个参数Person* const register this作为成员函数的第一个参数,所以上边这个函数的原型变成这样:
char* Person::getName( Person* const register this) const
来个应用:
Person ligang;
ligang.getName( );
第二行调用成员函数编译器会编译成这样的形式Person::getName(&ligang );
所以我们可以把this指针就看做是函数里的一个普通的参数,在每一个成员函数内部都可以直接使用,指向调用该成员函数的对象。
操作符重载问题
1)首先需要在类声明中声明:Time operator+ ( const Time & t)const;
2)其次在类实现中实现函数功能:
Time Time::operator+ ( const Time & t)const
{
......
}
上边这种方法是采用成员函数实现的,还有一种方法是采用友元函数来实现。不过有几个操作符只能通过成员函数的方式实现:赋值操作符=、函数调用操作符( )、下标操作符[ ]、箭头操作符->,下边用友元函数来重载+运算符。
1)首先需要在类声明中声明:friend Time operator+ (const Time & t1, const Time & t2 );
2)其次在类实现中实现函数功能(注意此时不需要关键字friend):
Time operator+ (const Time & t1, const Time & t2 )
{
.....
}
自定义类的类型转换问题
1)内置的基本类型转换为自定义类类型:
比如有一个跟重量有关的类Stonewt,主要用于表示重量,所以可以将一些整数或者浮点数转换为Stonewt对象,C++中采用具有相应参数的构造函数来完成此项功能。如果类提供了一个Stonewt (double t)这样的构造函数,那么就可以将double类型的转换为Stonewt,如可以这样用:
Stonewt wt;
wt = 20.5;
执行wt = 20.5的过程实际上是这样的,程序使用上述构造函数Stonewt(double t)创建一个临时对象,然后将临时对象以赋值的方式赋值给wt对象。
2)自定义类类型转换为内置的基本类型:
还是上边的例子,现在想把一个Stonewt对象转换为double类型的值,在这种情况下,需要提供转换函数。首先需要在类中声明转换函数,这种函数没有返回类型没有参数,样子有点怪,例子:
operator double ( )const;//将Stonewt对象转换为double类型
然后在类定义中实现函数:Stonewt::double( )const{......}
有了转换函数之后就可使用强制类型转换了,比如:
Stonewt wt(222.2);
double dd = double(wt);