构造函数的目的在于初始化数据,并不鼓励调用默认构造函数(默认拷贝构造函数是浅拷贝,会有野指,且不是所有情况都会调用默认构造函数)

自己编写的构造函数大概分为

1、无参构造函数

2、有参构造函数

3、拷贝构造函数(复制构造函数)

还有一个

a、赋值函数(这个不算构造函数,容易与拷贝构造函数混淆)

#ifndef AREA_H
#define AREA_H

#include<iostream>
using namespace std;//大项目不鼓励这么写,不然命名空间将失去作用,造成变量冲突
class Area
{
public:
    Area();                    //无参构造函数
    Area(int len,int wid);  //有参构造函数
    Area(const Area &temp);            //拷贝构造函数(复制构造函数)
    ~Area();
    Area &operator= (const Area &other);  //赋值函数  这个不是构造函数(有返回值)
private:
    int length;
    int width;
};

#endif
#include "Area.h"
#include <iostream>
using namespace std;
Area::Area()
{
    length = 0;
    width = 0;
    cout << "调用无参构造函数" << endl;
}
Area::Area(int len,int wid)
{
    length = len;
    width = wid;
    cout << "调用有参构造函数" << endl;
}
Area::Area(const Area &temp)
{
    length = temp.length;
    width = temp.width;
    cout << "调用拷贝构造函数" << endl;
}
Area::~Area()
{
    cout << "调用析构函数" << endl;
}
Area& Area::operator= (const Area &other)//注意到这个是有返回值的
{
    length = other.length;
    width = other.width;
    cout << "调用赋值函数" << endl;
    return *this;
}
#include "Area.h"
#include<iostream>
using namespace std;
int main()
{
    Area a;        //调用无参构造函数
    Area b(2,3);//调用有参构造函数
    Area c(b);    //调用拷贝构造函数,复制初始化
    Area d=b;    //调用拷贝构造函数,赋值初始化
    a = b;        //调用赋值函数
    return 0;
}

下面为运行结果

 

下面讲一下深拷贝与浅拷贝:

浅拷贝(位拷贝):只考虑所有成员的值(如果堆分配空间,指针指向这个堆空间,那么浅拷贝就是简单赋值,俩个指针指向一块内存,一个释放,另外一个就是野指了)

深拷贝(值拷贝):复制引用对象本身(如果堆分配空间,指针指向这个堆空间,那么深拷贝会分配新的空间给新对象的指针变量)

举例说明:

class Area
{
public:
    Area();                    //无参构造函数
    Area(int len,int wid);  //有参构造函数
    Area(const Area &temp);            //拷贝构造函数(复制构造函数)
    ~Area();
    Area &operator= (const Area &other);  //赋值函数  这个不是构造函数(有返回值)
private:
    int length;
    int width;
    int n_count;
    int *n_ptr;
};
Area::Area(const Area &temp)
{
    n_count = temp.n_count;
    n_ptr = temp.n_ptr;
    cout << "调用浅拷贝构造函数" << endl;
}
Area::Area(const Area &temp)
{
    n_count = temp.n_count;
    n_ptr = new int[n_count];
    for(int i=0;i<n_count;i++)
    {
        n_ptr[i] = temp.n_ptr[i];
    }
    cout << "调用深拷贝构造函数" << endl;
}