C++构造函数的调用

很快就要找工作笔试面试啥的了,昨晚又有问我关于C++构造函数的调用问题。

C++98/03标准中有三个特殊的构造函数,默认构造函数,拷贝构造函数和赋值构造函数;C++11/14中海油基于移动语义的移动拷贝构造函数和移动赋值函数。

一般的,对于一个类的构造函数,假如原型如下

MyClass(T1 val1, T2 val2 = value);

那么实际使用的时候,这样写

MyClass obj(value1, value2);
就是构造函数的显示调用了,并不需要写成普通函数的调用形式,需要把函数名和括号写出来的那种  func(arg1, arg2)。

MyClass obj = MyClass(value1, value2);
而且这么写,语义上是先调用了上边的构造函数,然后再调用拷贝构造函数(实际上编译器会做优化,省掉拷贝构造函数的调用)。这就是构造函数特殊的地方,就像拷贝构造函数的调用和赋值构造函数的调用不是以是否用等号来区别的,而是初始化和赋值的区别。

在C++中,隐式的调用构造函数的情况是那种支持单参数的构造函数,比如上边的构造函数由于有一个缺省的参数,所以可以只用带一个参数,于是

MyClass obj = value1;
这里就是构造函数的隐式调用(把最上边的构造函数定义为explicit 这里会报错),先用value1 构造一个临时对象,然后来拷贝构造对象obj,当然现在C++支持统一的大括号初始化,所以在构造函数的调用过程中,使用大括号和使用小括号的效果是一样的。

注意,对于单独出现的(value1, value2), 这是一个逗号表达式,表达式的值为value2!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值