今天解决了一个困扰我长达几个星期的问题,感觉很有成就感,于是记下这件事以资鼓励。
就在几个星期之前,我在读C++的过程中读到了如下一段程序:
#include<string>
#include<iostream>
using namespace std;
class Examinfo{
public:
Examinfo(string name,char grade):name(name),mode(GRADE),grade(grade){}
Examinfo(string name,bool pass):name(name),mode(PASS),pass(pass){}
Examinfo(string name,int percent):name(name),mode(PERCENTAGE),percent(percent){}
void show();
private:
string name;
enum{
GRADE,
PASS,
PERCENTAGE
}mode;
union{
char grade ;
bool pass;
int percent ;
};
};
void Examinfo::show(){
cout<<name<<":";
switch(mode){
case GRADE:cout<<grade;
break;
case PASS: cout<<(pass?"pass":"FALL");break;
case PERCENTAGE: cout<<percent;break;
}
cout<<endl;
}
int main()
{
Examinfo course1("english",'b');
Examinfo course2("calcus",true);
Examinfo course3("c++ programming",85);
course1.show();
course2.show();
course3.show();
return 0;
当时我对那三个重载的构造函数就是理解不了,因为就在不久前刚刚看过类的组合的知识,类的组合的构造函数的一般形式是:类名::类名(形参):内嵌对象1(参数),内嵌对象2(参数)……。而之前看构造函数的知识时,书上并没有给出构造函数的形式,只给了几个例子,而且这几个例子也是普通的构造函数的形式:类名::类名(形参列表){}。而直到今天我才悟出来这个问题出在这儿了。
我之前一直把那三个构造函数和类的组合的构造函数知识联系到一块,就是想不通,于是我开始在论坛上求助,虽说没有立即解决,但是这却给我提供了灵感吧,再加上今天又读了一段程序又发现了类似的现象,我突然灵光一现,想到了这个问题可能跟类的组合没联系,应该和构造函数本身的形式有关系,于是我就上网上搜了一下,没想到还真是这样,原来书上没有给出构造函数的形式,其实构造函数除了常规形式外,还有一种形式就是:类名::类名(形参):数据1(参数),数据2(参数),……。
查完后,恍然大悟,终于读懂了。
其实我感觉这种通过自己领悟的方式去学习很重要,因为这一个过程会给你留下很深的印象,而且会提升你的自信心,一举两得。
通过这个再发现构造函数的历程,让我又更进一步认识了构造函数,而且让我养成了善于思考的习惯,我觉得这是很重要的,于是记下来这个历程。