中的构造函数与析构函数

电子版,     
在C++中,当类中涵盖指针类型的多少时,咱们反复要用到二种构造函数,即一般构造函数、拷贝构造函数、赋值构造函数,而且在析构函数中,要科学析构相应的内部存款和储蓄器。

      上面以代码为实例举办出现说法,同时引进大家看看林锐博士的《高品质C++/C
编制程序指南》,个中对编制程序规范和有个别广阔的难题展开了深度解析,《高品质C++/C
编程指南》电子版下载地址为http://download.csdn.net/source/3091633。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

class B
{
public:
    char* str;

    explicit B(char *s = NULL)
    {
        cout << "调用了B普通构造函数" << endl;
        if (s != NULL) {
            str = new char[strlen(s) + 1];
            strcpy(str, s);
        } else {
            str = NULL;
        }
    }

    //拷贝构造函数
    B(const B& temp)
    {
        cout << "调用B拷贝构造函数" << endl;
        str = new char[strlen(temp.str) + 1];
        strcpy(str, temp.str);
    }
    //赋值构造函数
    B & operator = (const B& x)
    {
        cout << "调用B赋值运算符重载" << endl;
        if(this == &x)
            return *this;
        delete [] str;
        str = new char [strlen(x.str) + 1];
        strcpy(str, x.str);
        return *this;
    }
    ~B()
    {
        printf("~B\n");
        delete [] str;
        str = NULL;
    }
};

class A
{
public:
    B b;
    A(){}
    A(B bb)
    {
        cout << "A()构造函数" << endl;
        b = bb;
    }
    ~A()
    {
        printf("~A\n");
    }
};
int main()
{
    char* str = new char[5];
    for(int i = 0; i < 4; i++)
        str[i] = 'a' + i;
    str[4] = '\0';
    //这是第一个B
    B* b = new B(str);
    printf("%s\n", b->str);
    //括弧里的*objectB先调用B的拷贝构造函数
    // 然后在A内调用了B的=运算符重载。
    A* a = new A(*b);
    printf("%s\n", b->str);
    //delete A,然后A里的B也被析构了。 
    delete a;
    //delete 这是第一个B。
    delete b;

    //default constructor
    B *b2 = new B();
    delete b2;

    return 0;
}

 

相关文章