电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

构造函数和析构函数

最近突发奇想,想学习学习Cpp,之前听说Cpp中的类啊,构造函数啊,析构函数啊什么的,完全不清楚,所以找了点资料来看看他们到底是什么含义。

[zz]

我们先说一下什么是构造函数。
  上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们始终是建立成员函数然后手工调用该函数对成员进行赋值的,那么在c++中对于类来说有没有更方便的方式能够在对象创建的时候就自动初始化成员变量呢,这一点对操作保护成员是至关重要的,答案是肯定的。关于c++类成员的初始化,有专门的构造函数来进行自动操作而无需要手工调用,在正式讲解之前先看看c++对构造函数的一个基本定义。
  1.C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。
  2.若没有提供任何构造函数,那么c++提供自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而不做任何赋值操作。
  3.只要类中提供了任意一个构造函数,那么c++就不在自动提供默认构造函数。
  4.类对象的定义和变量的定义类似,使用默认构造函数创建对象的时候,如果创建的是静态或者是全局对象,则对象的位模式全部为0,否则将会是随即的。
  我们来看下面的代码:

#include  
using namespace std;   
class Student 

    public: 
    Student()//无参数构造函数 
    { 
        number = 1; 
        score = 100; 
    } 
    void show(); 
 
    protected: 
    int number; 
    int score; 
 
}; 
 
void Student::show() 

    cout< 
using namespace std;   
class Teacher 

    public: 
    Teacher(char *input_name)//有参数的构造函数 
    { 
        name=new char[10]; 
        //name=input_name;//这样赋值是错误的 
        strcpy(name,input_name); 
    } 
    void show(); 
 
    protected: 
    char *name; 
 
}; 
 
void Teacher::show() 

    cout< 
using namespace std;   
class Teacher 

    public: 
    Teacher(char *input_name) 
    { 
        name=new char[10]; 
        //name=input_name;//这样赋值是错误的 
        strcpy(name,input_name); 
    } 
    Teacher()//无参数构造函数,进行函数重载 
    { 
     
    } 
    void show(); 
 
    protected: 
    char *name; 
 
}; 
 
void Teacher::show() 

    cout< 
using namespace std;   
class Teacher 

    public: 
    Teacher() 
    { 
        director = new char[10]; 
        strcpy(director,"王大力"); 
    } 
    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;//这个类的成员teacher是用Teacher类进行创建并初始化的 
 
}; 
 
void Student::show() 

    cout<<teacher.show()< 
#include  
using namespace std;   
class Teacher 

    public: 
    Teacher() 
    { 
        director = new char[10]; 
        strcpy(director,"王大力"); 
        //director = new string; 
        // *director="王大力";//string情况赋值 
    } 
    ~Teacher() 
    { 
        cout<<"释放堆区director内存空间1次"; 
        delete[] director; 
        cin.get(); 
    } 
    char *show(); 
    protected: 
    char *director; 
    //string *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()<   
#include    
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()<   
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()<   
#include    
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()<   
#include    
using namespace std;     
 
class Test 

public: 
    Test(int a) 
    { 
        kk=a; 
        cout<<"构造参数a:"<   
using namespace std;     
 
class Test 

public: 
    Test(int j):pb(j),pa(pb+5) 
    { 
         
    } 
public: 
    int pa; 
    int pb; 
}; 
void main() 

    Test a(10); 
    cout<<a.pa<<endl; 
    cout<<a.pb<<endl; 
    cin.get(); 
}

  上面的程序在代码上是没有任何问题的,但运行结果可能并不如人意。
  pa并没有得到我们所希望的15而是一个随机的任意地址的值。
  这又是为什么呢?
  类成员的构造是按照在类中定义的顺序进行的,而不是按照构造函数说明后的冒号顺序进行构造的,这一点需要记住!

博主
dolphin_benben
dolphin_benben's Blog
杂境杂界
点击跳转