zoukankan      html  css  js  c++  java
  • c++类的构造函数与析构函数

    为什么用构造函数与析构函数


    构造函数:

    c++目标是让使用类对象就像使用标准类型一样,但是常规化的初始化句法不适用与类类型。

     int year =2001; //基本类型
        struct thing {
            char *pn;
            int m;
        };
        thing amabob = {"jiang",-23}; //结构体的初始化,结构体默认的访问类型是public,可以直接访问

    类对象的数据部分的访问状态都是私有的,程序不能直接访问数据成员。

    程序只能通过成员函数才能访问数据成员,因此要设计合适的成员函数,才能成功的将对象初始化。

    析构函数:

    用构造函数创建对象后,程序负责跟踪该对象,直到过期为止,对象过期时,程序将自动调用一个特殊的成员函数,析构函数。如果构造函数用new来分配内存,则析构函数用delete来释放这些内存。

    如果大家还想了解的更多,可以参考陈树振老师的博文:http://blog.csdn.net/chenshuzhenteacher/article/details/8094577


    怎么用构造函数与析构函数


    构造函数

    c++提供了两种方法初始化对象的方式,第一种是显式的调用构造函数:

    Stock food = Stock ("World Cabbage",250,1.25);

    另外一种是隐式调用构造函数

    Stock garment("Furry Marson",50,2.5);

    每次创建类对象(甚至使用new动态分配内存)时,C++都会使用类的构造函数。

    Stock *pstock = new Stock("Elect",18,19);

    无法使用对象调用构造函数,因为构造函数构造对象之前,对象是不存在的,因此构造函数用来创建对象,而不能通过对象来调用。

    1. 默认构造函数
    2. 无参构造函数
    3. 有参构造函数
    4. 拷贝构造函数
    5. 赋值构造函数

    1.默认构造函数是在未提供显式的初始化值是被用来创建对象的构造函数,用于以下声明:

    Stock stock;

     创建stock对象,但不初始化成员,这和下面的语句

    int x;

    创建x,但没有提供值给他一样。默认构造函数没有参数,因此声明中不包含值。

    如果提供非默认构造函数(如Stock(const char* co,int n,double pr)),但没有提供默认构造函数,则下面的声明是错误的:

    Stock stock;

    如果想要创建对象,而不显式的初始化,必须定义不接受任何参数的默认构造函数,有两种方法。

    一种是给已有构造函数的所有参数提供默认值。Stock(const char *no = "ERROR",int n = 0 ,double pr = 0.0);

    另一种方式是通过函数重载来定义另一个构造函数 Stock();

    Stock first("dajdke"); //call constructor

    Stock second(); //declares a function

    Stock third;  //calls default constuctor

    第一个声明调用非默认构造函数,即接收参数的构造函数,第二个声明指出,second()是一个返回Stock对象的函数,隐式的调用函数默认构造函数,不要使用圆括号。

    2、无参构造函数

    Type();
    就是构造函数中没带参数。

    3、有参构造函数

    Type(int a );
    就是构造函数中含有参数。

    4、拷贝,赋值构造函数

    class String {
        
    private:
        char * m_data;
        
    public:
        String(const char *str = NULL);  //普通构造函数
        String(const String &other);     //拷贝构造函数
        String &operator = (const String &other);  //赋值函数
         ~String(void); //析构函数
    
    };
    
    String::String(const char *str)
    {
        cout<<"自定义构造函数"<<endl;
        if (str ==NULL) {
            m_data = new char[1];
            *m_data = '';
        }
        
        int length = sizeof(str);
        m_data = new char[length+1];
        strcpy(m_data, str);
    
    }
    String::String(const String &other)
    {
        cout<<"自定义拷贝构造函数"<<endl;
        int length = sizeof(other.m_data);
        m_data = new char [length + 1];
        strcpy(m_data, other.m_data);
        
    }
    String &String:: operator=(const String &other)
    {
        cout<<"自定义赋值"<<endl;
        if (this == &other) {
            return *this;
        }
        else
        {
            delete [] m_data;
            int length = sizeof(other.m_data);
            m_data = new char [length + 1];
            strcpy(m_data, other.m_data);
            return *this;
        }
    }
    
    String::~String()
    {
        cout<<"调用的析构函数"<<endl;
        delete [] m_data;
    }
    
    int main(int argc, const char * argv[])
    {
        cout<<"a("abc")"<<endl;
        String a("abc");//自定义构造函数
        String b("cde");//自定义构造函数
        String d = a;//自定义拷贝构造函数
        String c(b);//自定义拷贝构造函数
        c=a;// 自定义赋值
    }

    参考:http://blog.csdn.net/twlkyao/article/details/9104537

  • 相关阅读:
    非空约束
    leetcode208
    leetcode207
    leetcode395
    leetcode116
    leetcode105
    leetcode131
    leetcode73
    leetcode200
    leetcode17
  • 原文地址:https://www.cnblogs.com/ymonke/p/3344286.html
Copyright © 2011-2022 走看看