zoukankan      html  css  js  c++  java
  • 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;
    }
    ---
    可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
  • 相关阅读:
    tensorflow2.0第1章 Tensorflow简介与环境搭建
    SIGAI机器学习第二十四集 聚类算法1
    SIGAI机器学习第二十三集 高斯混合模型与EM算法
    51nod1429 巧克力
    CTSC2018 Day2T1 Juice混合果汁
    CF1B Spreadsheets
    CF2B The least round way
    【模板】点分治
    【模板】AC自动机
    【模板】网络流-最大流 Dinic
  • 原文地址:https://www.cnblogs.com/null00/p/2065087.html
Copyright © 2011-2022 走看看