细说C++中构造函数

一、构造函数的定义与形式

C++中定义的与类名相同的成员函数,这种成员函数就叫做构造函数。

普通构造函数:
class 类名
{
    类名(形参)
    {
        函数的函数体
    }
};
//案例
class A()
{
public:
    A(int a)
    {
        this.a = a;
    }
private:
    int a;
};
拷贝构造函数:

由己存在的对象,创建新对象。也就是说新对象,不由构造器来构造,而是由拷贝 构造器来完成。拷贝构造器的格式是固定的。

class 类名
{
    类名(const 类名 &obj)
    {
        cout << "拷贝构造" << endl;
    }
};
//案例
class B
{
public:
    B(const B &obj)
    {
        cout << "这是拷贝构造函数" << endl;
    }
    ~B(){}
private:
};

2、构造函数的调用与规则

调用

自动调用:一般情况下C++编译器会自动调用构造函数.
手动调用:在一些情况下则需要手工调用构造函数.

规则
  • 在对象创建时自动调用,完成初始化相关工作。
  • 无返回值,与类名同,默认无参,可以重载,可默认参数。
  • 一经实现,默认不复存在。

3、构造函数的类别

我们都知道,构造函数分为无参构造,有参构造和拷贝构造。

形式与案例
class ABC
{
public:
    ABC()
    {
        a = 0;
        b = 0;
        cout << "这是无参构造函数" << endl;
    }

    ABC(int a, int b, int c)
    {
        this.a = a;
        this.b = b;
        this.c = c; 
        cout << "这是有参构造函数" << endl;
    }

    ABC(const ABC &another_obj)
    {
        cout << "这是拷贝构造函数" << endl
    }

    ~ABC()
    {
    }
private:
    int a;
    int b;
};

4、构造函数的应用场景

无参与有参构造场景
class A
{
public:
    A()
    {
        cout << "我是无参构造" << endl;
    }

    A(int a)
    {
        this a = a;
    }

    A(int a, int b =0)
    {
        this a = a;
        this.b = b;
    }

private:
    int a;
    int b;
};

int main()
{
    A a; //调用无参构造
    A a(10);调用只用一个参数的有参构造函数
    A a(100, 100), //调用有参构造
    return 0;
}
拷贝构造函数的应用场景
class NBA
{
public:
    NBA()
    {
        cout << "我是无参构造" << endl;
    }

    NBA(int a, int b)
    {
        this.a = a; 
        this.b = b;
        cout << "我是有参构造" << endl;
    }

    NBA(const NBA &obj)
    {
        cout << "我是拷贝构造" << endl;
        n = obj.n;
    }

    ~NBA()
    {
        cout << "我是析构函数" << endl;
    }

    void p_a()
    {
        cout << "我是普通成员函数" << endl;
        cout << "a="  << a << endl;
    }
private:
    int n;
};

//拷贝函数第一个应用场景
int mian01()
{
    NBA na(10);
    NBA nba = na;  //调用对象 na 初始化对象 nba  
    return 0;
}

//拷贝构造应用的第二个场景
int main02()
{
    NBA a(100);
    NBA nba(a);  //调用对象 na 初始化对象 nba  
    return 0;
}

//拷贝构造应用的第三个场景
void func(NBA nba) 
{
    nba.p_a();
}

int main03()
{
    NBA a(20); 
    func(a);
    return 0;
}

//拷贝构造应用的第四个场景
NBA func2(void)
{
    NBA temp(100, 200);
    temp.p_a();
    //在此刻 会创建一个匿名的对象来接收temp局部对象。
    //通过匿名的拷贝构造函数来构造匿名对象
    return temp;                
}

int main04()
{
    //func2 函数 的返回值是一个Test 是一个匿名的对象,
    // 当func2返回之后会有一个匿名对象生成,但是这个匿名对象没有任何变量接收,也没有使用 
    //编译器认为这个匿名没有意义,就会即可给他销毁
    func2(); 
    return 0;
}

//拷贝构造应用的第五个场景
int main05()
{
    //如果在fun2函数返回之后,会创建一个匿名对象, 如果在外部有一个变量给他接收
    //实际这个a 就是那个匿名对象, 匿名对象转正了,有了自己的名字叫a
    //匿名对象转正之后,编译器认为a是一个有意义的对象了,不会立刻销毁
    NBA a = func2();
    //在此刻销毁的 a
    return 0;
}

五、 二个特殊的构造函数

默认无参构造函数

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

默认拷贝构造函数

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

 注意:

当类中定义了拷⻉贝构造函数时,c++编译器不会提供⽆无参数构造数。
当类中定义了有参数构造函数是,c++编译器不会提供⽆无参数构造函数。
在定义类时,只要你写了构造函数,则必须要⽤用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Web3_社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值