阿鑫来了  

类的6个默认成员函数

如果一个类中什么成员都没有 , 简称为空类 . 但空类中并不是什么都没有 , 而是会

自动生成6个默认成员函数 .

1 . 构造函数主要完成初始化工作 ;

2 . 析构函数主要完成清理工作 ;

3 . 拷贝构造是使用同类对象初始化创建对象 ;

4 . 赋值重载主要是把一个对象赋值给另一个对象 ; 

5 .                                                                    

 

类的6个默认成员函数

如果一个类中什么成员都没有 , 简称为空类 . 但空类中并不是什么都没有 , 而是会

自动生成6个默认成员函数 .

1 . 构造函数主要完成初始化工作 ;

2 . 析构函数主要完成清理工作 ;                                                                                      

3 . 拷贝构造是使用同类对象初始化创建对象 ;

4 . 赋值重载主要是把一个对象赋值给另一个对象 ; 

5 . 主要是普通对象和const对象取地址 .     

 

构造函数 :

构造函数是特殊的成员函数 , 构造函数的主要任务并不是开空间创建对象,而是初始化对象 .

   特征 :                                                                                                                                         

     1 . 函数名与类名相同 ;

     2 . 无返回值 ;

     3 . 对象实例化时编译器自动调用对应的构造函数 ; 

     4 . 构造函数可以重载 . 

 

创建对象时 , 编译器自动调用构造函数 , 不能显式调用 ;

如果没有显式定义构造 , 则编译器自动生成无参构造 ;

默认构造 : 只能有一个

                 无参构造 / 全缺省

如果有自定义成员 , 则构造函数会自动调用自定义成员的默认构造 .

#include<stdio.h>
#include<iostream>

using namespace std;

class A{
public:
    int _a;
    A(int a=10){
        _a = a;
        cout << "A()" << endl;
    }
};

class Date{
public:
    //无参的默认构造
    Date(){
        cout << "Date()" << endl;
    }

    //有参的构造函数
    Date(int year, int month, int day){
        _year = year;
        _month = month;
        _day = day;
        cout << "Date(int int int)" << endl;
    }

    //全缺省:也是默认构造
    /*Date(int year = 1, int month = 1, int day = 1){
        _year = year;
        _month = month;
        _day = day;
        cout << "Date(int int int)" << endl;
    }*/

private:
    int _year;
    int _month;
    int _day;

    //自定义类型成员
    A _a;
};


void test(){
    /*任何一个构造函数(包括编译器自动生成的)都会自动调用
        自定义成员的默认构造,如果没有默认构造,编译器会报错*/

    /*当前类的构造函数会自动调用自定义成员的默认构造;
    完成自定义成员的初始化;*/
    /*只能调用一个默认构造,*/
    Date d;

    Date d2(2021, 4, 23);

}

int main(){
    test();
    system("pause");
    return 0;
}

 

析构函数 : 

是一个特殊的成员函数.

    特征 :

     1.析构函数名是在类名的前面加上字符 ~  ;

     2.无参数无返回值 ;

     3.一个类有且只有一个析构函数 , 若未显式定义 , 系统会自动生成默认的析构函数 ;

     4.对象生命周期结束时 , C++编译系统自动调用析构函数 .  

如果当前对象中没有资源需要清理可以不写析构函数

#include<stdio.h>
#include<iostream>

using namespace std;

typedef int DataType;

class SeqList{
public:
    SeqList(int capacity = 10){
        _pData = (DataType*)malloc(capacity*sizeof(DataType));

        _size = 0;
        _capacity = capacity;
        cout << "malloc" << endl;
    }

    ~SeqList(){
        if (_pData){
            free(_pData);
            _pData = NULL;
            _size = 0;
            _capacity = 0;
        }
        cout << "~SeqList" << endl;
    }


    int* _pData;
    size_t _size;
    size_t _capacity;

};


void test(){
    SeqList sq(10);
    cout << sizeof(sq) << endl;
}

int main(){
    test();
    system("pause");
    return 0;
}

 

拷贝构造函数 :

用已存在的类型对象创建新对象时由编译器自动调试 , 只有单个形参 , 该形参是对本类类型对象的引用(一般常用const修饰) .

编译器自动生成的拷贝构造 : 完成对象内容的拷贝 , 或者称为字节序的拷贝 , 这种情况我们称为浅拷贝(不会拷贝对象的资源) .

有资源的类 , 必须显示定义拷贝构造 ;  

      特征 : 

      1.拷贝构造函数是构造函数的一个重载形式 ;

      2.拷贝构造函数的参数只有一个且必须使用 引用 传参 , 使用值传参会引发无穷递归调用 .       

#include<stdio.h>
#include<iostream>

using namespace std;

class data{
public:
    data(int year = 1, int month = 1, int day = 1){
        _year = year;
        _month = month;
        _day = day;
        cout << "data(int int int)" << endl;
    }

    //如果不显式定义拷贝构造,编译器会自动生成
    data(const data& d){
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }

private:
    int _year;
    int _month;
    int _day;
};
void test(){
    data d(2021, 4, 23);
    data copy(d);
}

int main(){ 
    test();
    system("pause");
    return 0;
}

 

 

                                

 

posted on 2021-04-23 19:49  阿鑫来了  阅读(210)  评论(0)    收藏  举报