C++中的构造函数与析构函数

在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;
}

原文链接: https://www.cnblogs.com/null00/archive/2011/03/14/2065087.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/22274

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午12:14
下一篇 2023年2月8日 上午12:14

相关推荐