正在阅读:C++面向对象编程入门:构造函数与析构函数C++面向对象编程入门:构造函数与析构函数

2005-03-08 15:56 出处:PConline 作者:管宁 责任编辑:xietaoming

  前面我们已经简单的说了类的构造函数和析构函数,我们知道一个类的成员可以是另外一个类的对象,构造函数允许带参数,那么我们可能会想到上面的程序我们可以在类中把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++为了解决此问题,有一个很独特的方法,下一小节我们将介绍。

  对于上面的那个"尴尬"问题,我们可以在构造函数头的后面加上:号并指定调用哪那个类成员的构造函数来解决!

  教程写到这里的时候对比了很多书籍,发现几乎所有的书都把这一章节叫做构造类成员,笔者在此觉得有所不妥,因为从读音上容易混淆概念,所以把这一小节的名称改为构造类的成员比较合适!

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品