从汇编看c++的默认operator=操纵
添加时间:2013-5-14 点击量:
在c++中,若是没有定义operator=操纵,编译器会供给一个默认的operator=操纵。因为operator=操纵和拷贝机关函数的功能类似,都履行拷贝操纵。是以,编译器也分供给无用的默认operator=操纵和非无用的默认operator=操纵。并且什么时辰供给非无用的默认operator=操纵和无用的等操纵的景象也和拷贝机关函数类似。(具体解析过程请参考《从汇编看c++的默认拷贝函数》)
对于一个类,编译器会供给非无用的operator=操纵的景象:
1 该类是含有虚成员函数(持续自虚基类,或者持续的基类含有虚成员函数也属于这种景象)
2 该类持续的基类自定义了operator=操纵(若是基类没有自定义operator=操纵,然则编译器会为基类供给非无用的默认operator=操纵,也属于这种景象。这就是说,只要基类有一个非无用的operator=操纵就行,不管这个非无用operator=操纵是自定义的,还是编译器供给的都行)
3 该类含有成员对象,该成员对象自定义了operator=操纵(若是成员对象没有自定义operator=操纵,然则编译器会为成员对象变量供给非无用的默认operator=操纵,也属于这种景象。这就是说,只要成员对象变量有一个非无用的operator=操纵,不管这个非无用的operator=操纵是自定义的,还是编译器供给的,都行)
并且,若是类自定义了operator=操纵,编译器只是负责调用,不会额外供给任何拷贝过程;对于编译器供给的默认operator=操纵,不管是无用的还长短无用的,都只履行浅拷贝。
在c++中,若是没有定义operator=操纵,编译器会供给一个默认的operator=操纵。因为operator=操纵和拷贝机关函数的功能类似,都履行拷贝操纵。是以,编译器也分供给无用的默认operator=操纵和非无用的默认operator=操纵。并且什么时辰供给非无用的默认operator=操纵和无用的等操纵的景象也和拷贝机关函数类似。(具体解析过程请参考《从汇编看c++的默认拷贝函数》)
对于一个类,编译器会供给非无用的operator=操纵的景象:
1 该类是含有虚成员函数(持续自虚基类,或者持续的基类含有虚成员函数也属于这种景象)
2 该类持续的基类自定义了operator=操纵(若是基类没有自定义operator=操纵,然则编译器会为基类供给非无用的默认operator=操纵,也属于这种景象。这就是说,只要基类有一个非无用的operator=操纵就行,不管这个非无用operator=操纵是自定义的,还是编译器供给的都行)
3 该类含有成员对象,该成员对象自定义了operator=操纵(若是成员对象没有自定义operator=操纵,然则编译器会为成员对象变量供给非无用的默认operator=操纵,也属于这种景象。这就是说,只要成员对象变量有一个非无用的operator=操纵,不管这个非无用的operator=操纵是自定义的,还是编译器供给的,都行)
并且,若是类自定义了operator=操纵,编译器只是负责调用,不会额外供给任何拷贝过程;对于编译器供给的默认operator=操纵,不管是无用的还长短无用的,都只履行浅拷贝。