C++学习笔记11——对象的构造

构造函数

  • C++中可以定义与类名相同的特殊成员函数

  • 这种特殊的成员函数叫做构造函数

    • 构造函数没有任何返回类型的声明

    • 构造函数在对象调用时自动被调用

/*
    测试代码
*/

#include <stdio.h>

class Test
{
private:
    int i;
    int j;
public:
    Test()        // 构造函数
    {
        printf("Test() Begin\n");

        i = 1;
        j = 2;

        printf("Test() End\n");
    }

    int getI()
    {
        return i;
    }

    int getJ()
    {
        return j;
    }
};

int main()
{
    Test t;

    printf("t.i = %d\n", t.getI());
    printf("t.j = %d\n", t.getJ());

    return 0;
}

运行结果

Test() Begin
Test() End
t.i = 1
t.j = 2

带有参数的构造函数

  • 构造函数可以根据需要定义参数

  • 一个类中可以存在多个重载的构造函数

  • 构造函数的重载遵循C++重载的规则

/*
    测试代码
*/

#include <stdio.h>

class Test
{

public:
    Test()
    {
        printf("Test()\n");
    }

    Test(int v)
    {
        printf("Test(int v)\n");
    }
};

int main()
{
    Test t;        // 调用Test()

    Test t1(1);    // 调用Test(int v)

    Test t2 = 2;   // 调用Test(int v)

    return 0;
}

运行结果

Test()
Test(int v)
Test(int v)

构造函数的调用

  • 一般情况下, 构造函数在对象定义时被自动调用

  • 一些特殊情况下, 需要手工调用构造函数

/*
    测试代码
    手工调用构造函数
*/

#include <stdio.h>

class Test
{
private:
    int m_value;
public:
    Test()
    {
        printf("Test()\n");

        m_value = 0;
    }

    Test(int v)
    {
        m_value = v;
        printf("Test(int v), v = %d\n", v);


    }

    int getValue()
    {
        return m_value;
    }
};

int main()
{
    Test ta[3] = {Test(), Test(1), Test(2)};     // 手动调用构造函数

    for(int i=0; i<3; i++)
    {
        printf("ta[%d].getValue() = %d\n", i , ta[i].getValue());
    }

    return 0;
}

运行结果

Test()
Test(int v), v = 1
Test(int v), v = 2
ta[0].getValue() = 0
ta[1].getValue() = 1
ta[2].getValue() = 2

特殊的构造函数

  • 两个特殊的构造函数

    • 无参构造函数

      • 没有参数的构造函数

      • 当类中没有定义构造函数时, 编译器默认提供一个无参构造函数, 并且其函数体为空

    • 拷贝构造函数

      • 参数为 const class_name& 的构造函数

      • 当类中没有定义拷贝构造函数时, 编译器默认提供一个拷贝构造函数, 简单的进行成员变量的值复制

/*
    测试代码
*/

#include <stdio.h>

class Test
{
private:
    int i;
    int j;
public:
/*
    Test()
    {
    }

    Test(const Test& t)
    {
        i = t.i;
        j = t.j;
    }

*/
    int getI()
    {
        return i;
    }
    int getJ()
    {
        return j;
    }

};

int main()
{
    Test t1;
    Test t2 = t1;

    printf("t1.i = %d, t1.j = %d\n", t1.getI(), t1.getJ());
    printf("t2.i = %d, t2.j = %d\n", t2.getI(), t2.getJ());

    return 0;
}

运行结果

t1.i = -2, t1.j = 1970606434
t2.i = -2, t2.j = 1970606434
  • 拷贝构造函数的意义

    • 浅拷贝

      • 拷贝后对象的物理状态相同

      • 编译器默认提供的拷贝构造函数只进行浅拷贝

    • 深拷贝

      • 拷贝后对象的逻辑状态相同

      • 当对象中的成员代替了系统中的资源时, 需自定义拷贝构造函数进行深拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值