来源:远方网络 | 2006-1-6 | (有2034人读过)
对于上面的那个"尴尬"问题,我们可以在构造函数头的后面加上:号并指定调用哪那个类成员的构造函数来解决!
教程写到这里的时候对比了很多书籍,发现几乎所有的书都把这一章节叫做构造类成员,笔者在此觉得有所不妥,因为从读音上容易混淆概念,所以把这一小节的名称改为构造类的成员比较合适!
代码如下:
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> using namespace std; class Teacher { public: Teacher(char *temp) { director = new char[10]; strcpy(director,temp); } ~Teacher() { cout<<"释放堆区director内存空间1次"; delete[] director; cin.get(); } char *show(); protected: char *director; }; char *Teacher::show() { return director; } class Student { public: Student(char *temp):teacher(temp) { number = 1; score = 100; } void show();
protected: int number; int score; Teacher teacher;
};
void Student::show() { cout<<teacher.show()<<endl<<number<<endl<<score<<endl; } void main() { Student a("王大力"); a.show(); //Student b[5]("王大力"); //这里这么用是不对的,数组不能够使用带参数的构造函数,以后我们将详细介绍vector类型 // for(int i=0; i<sizeof(b)/sizeof(Student); i++) //{ // b[i].show(); //} cin.get(); }
大家可以发现最明显的改变在这里
Student(char *temp):teacher(temp)
冒号后的teacher就是告诉调用Student类的构造函数的时候把参数传递给成员teacher的Teacher类的构造函数,这样一来我们就成功的在类体外对teacher成员进行了初始化,既方便也高效,这种冒号后指定调用某成员构造函数的方式,可以同时制定多个成员,这一特性使用逗号方式,例如:
Student(char *temp):teacher(temp),abc(temp),def(temp)
由冒号后可指定调用哪那个类成员的构造函数的特性,使得我们可以给类的常量和引用成员进行初始化成为可能。
我们修改上面的程序,得到如下代码:
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> #include <string> using namespace std; class Teacher { public: Teacher(char *temp) { director = new char[10]; strcpy(director,temp); } ~Teacher() { cout<<"释放堆区director内存空间1次"; delete[] director; cin.get(); } char *show(); protected: char *director; }; char *Teacher::show() { return director; } class Student { public: Student(char *temp,int &pk):teacher(temp),pk(pk),ps(10) { number = 1; score = 100; } void show();
protected: int number; int score; Teacher teacher; int &pk; const int ps;
};
void Student::show() { cout<<teacher.show()<<endl<<number<<endl<<score<<endl<<pk<<endl<<ps<<endl; } void main() { char *t_name="王大力"; int b=99; Student a(t_name,b); a.show(); cin.get(); }
改变之处最重要的在这里Student(char *temp,int &pk):teacher(temp),pk(pk),ps(10)
调用的时候我们使用
Student a(t_name,b);
我们将b的地址传递给了int &pk这个引用,使得Student类的引用成员pk和常量成员ps进行了成功的初始化。
但是细心的人会发现,我们在这里使用的初始化方式并不是在构造函数内进行的,而是在外部进行初始化的,的确,在冒号后和在构造函数括号内的效果是一样的,但和teacher(temp)所不同的是,pk(pk)的括号不是调用函数的意思,而是赋值的意思,我想有些读者可能不清楚新标准的c++对变量的初始化是允许使用括号方式的,int a=10和int a(10)的等价的,但冒号后是不允许使用=方式只允许()括号方式,所以这里只能使用pk(pk)而不能是pk=pk了。
|