C++默默编写的函数
编写一个空类Empty
class Empty {};
当经过C++处理过后,相当于你写了:
class Empty {
Empty(); //默认构造函数
Empty(const Empty& rhs); //复制构造函数
Empty& operator=(const Empty& rhs); //复制赋值操作
~Empty(); //析构函数
}
注意上面C++自动生成的函数只有在这些函数被调用才会被编译器创建出来。
执行下面代码将产出相应的函数:
//需要注意复制构造函数与赋值操作法的区别
Empty e1; //默认构造函数,析构函数
Empty e2(e1); //复制构造函数
e2=e1; //赋值操作符
为什么有了编译器为我们做的工作,还需要自己定义这些函数呢?
原因如下:
- 如果使用“缺省的无参数构造函数”和“缺省的析构函数”,等于放弃了自主“初始化”和“清除”的机会,默认的函数可能并不适用。
- 缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。
例题:以下代码共调用多少次拷贝构造函数:
Widget f(Widget u)
{
Widget v(u);
Widget w=v;
return w;
}
main(){
Widget x; //默认构造函数被调用
Widget y=f(f(x));
}
此题需要明白,什么时候使用复制构造函数:
1、当用类的一个对象初始化该类的另一个对象时
2、 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时.
3、如果函数的返回值是类的对象,函数执行完成返回调用者时.
4、需要产生一个临时类对象时
如果按照上述的分析,应该为9次,但是这里需要注意的是编译器做了优化。return之后一定会调用拷贝构造函数,这个返回的局部变量估计是编辑器直接优化给y了,和下一次的调用形参u。所以这里少了两次。(单步调试可以看得很清楚。)因此为7次。
参考:
https://www.nowcoder.com/profile/9705898/myFollowings/detail/1327367