C++构造函数讲解

构造函数的种类

    如果创建一个类没写构造函数,则系统会自动生成一个默认构造函数,该构造函数没有参数,函数为空,什么都不做。只要写了如下某一个构造函数,则系统不会生成默认构造函数

1.无参构造函数

A()

{
    i = 0;
    j = 0;
}

2.一般构造函数

A(int v1, int v2)

{
    i = v1;
    j = v2;
}

3. 复制构造函数

A(const A& a)

{
    i = a.i;
    j = a.j;
}

    若没有显式的写构造函数,则系统会创建一个默认复制构造函数,

4.类型转换构造函数

A(int v)

{
    i = v;
    j = 0;
}

    根据指定类型的对象创建一个本类对象

5.等号运算符重载

A &operator = (const A& a)

{
    if(this == &a)
        return *this;
    
    this->i = a.i;
    this->j = a.j;
 
    return*this;
}

    它不属于构造函数,如果没有显式的写=运算符重载,则系统会默认一个,只做基本的拷贝工作。return *this是为了支持连等a=b=c,首先运行b=c,然后运行a=(b=c的返回值,即复制了c的b的对象)

构造函数使用用例

1.调用无参数构造函数

A a1,a2;

2.调用一般构造函数

A a3(1); 或者 A a3 = A(1);

3.把a3赋给a1

a1 = a3;

    由于a1已经被提前创建,所以这里不会调用任何构造函数,只调用=运算符重载函数

4.调用类型转换构造函数

a2 = 1;

    先调用转换构造函数将1创建为一个本类的临时对象,再调用=运算符重载

5,调用拷贝构造函数

A  a4(a1); 或者 A a4 = a1;

    这里有区别于=运算符重载,因为a4并未提前创建,所以调用拷贝构造函数

深拷贝和浅拷贝
    如上所述,如果没有显式的写复制构造函数,则系统默认一个,这个默认的的复制构造函数只是简单的进行赋值,这时如果类里有一个成员变量是指针,或者有成员在构造函数中分配了资源,这时如果只进行简单的赋值,则会出现新对象的指针所指向的地址与被拷贝对象的指针所指向的地址是同一个地址,会造成错误,这就涉及到深拷贝和浅拷贝。
    浅拷贝是指在对象复制时,只对对象中的成员变量进行赋值,默认赋值构造函数进行的就是浅拷贝;深拷贝是指对象复制时,对对象中的动态成员重新分配内存。
//示例

class Person
{
public:
    Person(char *pN)
    {
        m_pName = new char[strlen(pN) + 1];
        if(m_pName != NULL)
        {
            strcpy(m_pName, pN);
        }
    }
    //默认复制构造函数,只做模式拷贝
    Person(const Person& p)
    {
        m_pName = p.m_pName;
    }

    ~Person()
    {
        delete m_pName;
    }
private:
    char * m_pName;
}
 
void main()
{
    Person man("lily");
    Person woman(man);
}

    导致man和woman的指针指向了同一地址,调用析构函数时,同一地址被delete了两次,下面自己设计复制拷贝构造函数,实现深拷贝
 

    Person(const Person& p)
    {
        m_pName = new char[strlen(pN) + 1];
        if(m_pName)
        {
            strcpy(m_pName, p.m_pName);
        }
    }

欢迎关注同名微信公众号

猜你喜欢

转载自blog.csdn.net/xiaoshisande/article/details/88027738