C++ 构造函数详解

1.有时候需要构造函数初始化列表

有些成员必须在构造函数初始化列表中初始化,对于这样的成员,在构造函数函数体没法对它们进行赋值,包括:任何const成员,引用类型成员以及没有默认构造函数的类类型成员。如下count必须在初始化列表中初始化,而不能在构造函数函数体中进行赋值,而name可以在初始化列表中初始化,也可以在函数体中初始化:

class Item{
public:
Item(const string& strName="test"):count(10){name="hello";};
string name;
const int count;
};

注意:成员的初始化顺序就是定义成员的顺序。

2.默认构造函数

只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数,通常我们需要定义一个默认的构造函数。

3.复制构造函数

只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。当将该类型对象传递给函数或从函数返回该类型对象时,将隐式使用复杂构造函数。

当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。

如果我们没有定义复制构造函数,编译器会为我们合成一个。合成复制构造函数的行为是,执行逐个成员初始化,将新对象初始化为原对象的副本。一般只包含类类型成员或内置类型(但不是指针类型)成员的类,无须显式地定义复制构造函数,也可以复制。

如果类想要禁止复制,则类必须显式声明其复制构造函数为private,如果想要连友元和成员中的复制也禁止,就可以声明一个private复制构造函数而不对它进行定义。如果定义了复制构造函数,也必须定义默认构造函数。

4.赋值操作符

通过定义名为operator=的函数,我们可以对赋值进行定义。当操作符为成员函数时,它的第一个操作数隐式绑定到this指针。

对于复制和赋值操作符可以看作一个单元,如果需要其中一个,我们几乎也肯定需要另一个。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值