您的位置:首页 > 编程语言 > C语言/C++

C++构造函数的调用

2015-08-19 12:46 543 查看
很快就要找工作笔试面试啥的了,昨晚又有问我关于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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: