前面我们已经简单的说了类的构造函数和析构函数,我们知道一个类的成员可以是另外一个类的对象,构造函数允许带参数,那么我们可能会想到上面的程序我们可以在类中把Student类中的teacher成员用带参数的形式调用Student类的构造函数,不必要再在Teacher类中进行操作,由于这一点构想我们把程序修改成如下形式: #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() { 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]; for(int i=0; i<sizeof(b)/sizeof(Student); i++) { b[i].show(); } cin.get(); } 可是很遗憾,程序不能够被编译成功,为什么呢?
因为:类是一个抽象的概念,并不是一个实体,并不能包含属性值(这里来说也就是构造函数的参数了),只有对象才占有一定的内存空间,含有明确的属性值!
这一个问题是类成员初始化比较尴尬的一个问题,是不是就没有办法解决了呢?呵呵。。。。。。
c++为了解决此问题,有一个很独特的方法,下一小节我们将介绍。 对于上面的那个"尴尬"问题,我们可以在构造函数头的后面加上:号并指定调用哪那个类成员的构造函数来解决!
教程写到这里的时候对比了很多书籍,发现几乎所有的书都把这一章节叫做构造类成员,笔者在此觉得有所不妥,因为从读音上容易混淆概念,所以把这一小节的名称改为构造类的成员比较合适!
|