【C++再学习】【05】有关类的一些知识点整理
2014-04-16 17:30
309 查看
默认构造函数问题
只有在没有自定义的任何构造函数的情况下,编译器才会提供默认构造函数,如果程序员有为类设计了构造函数,那么程序员也必须提供默认构造函数。如果不提供,像这种声明将会是非法的: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);
只有在没有自定义的任何构造函数的情况下,编译器才会提供默认构造函数,如果程序员有为类设计了构造函数,那么程序员也必须提供默认构造函数。如果不提供,像这种声明将会是非法的: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);
相关文章推荐
- C++学习笔记—类6-有关继承的一些东西
- 【C++再学习】【02】C部分一些整理
- c++ 有关webBrowser控件的一些整理
- C++ Standard Stl -- SGI STL源码学习笔记(05) stl_vector 与 一些问题的细化 1
- c++学习总结(一些零碎的小知识点)
- c++学习(知识点整理)
- C++:一些常见知识点的区别(整理)
- 有关数据备份、存储全路径、备份设备的一些知识点(文件级备份、块备份)整理
- 学习过程中整理的有关centos的一些安装笔记
- C++中有关的复合类型变量的知识点的一些见解
- 记录整理入门的JavaScript学习一些重要知识点
- 有关fragment与Activity生命周期的知识点学习
- 近期的一些学习计划整理
- sqlserver知识点汇总(这段时间复习和回顾了一下sqlserver的一些知识),供大家参考和学习!
- 学习继承和多态的一些知识点
- 学习C和C++ 的一些资料
- [置顶] 【C/C++学习】之十一、指针一些事
- 学习linux下elf文件的一些整理
- 学习delphi过程中收集的一些功能代码(整理中)
- 之前跳槽面试时整理的一些知识点