条款05:了解C++默默编写并调用哪些函数
如果没有为类定义构造函数、析构函数、拷贝构造函数、重载赋值操作符,并且这些函数被需要(调用)时,编译器会为类生成默认的函数,而这些函数是public inline的。
需要主意的是带引用成员的类和带const成员的类。
带引用成员的类,如果不为其主动编写operator=,则对象之间的赋值操作是不能编译通过的;
带const成员的类,如果不为其编写operator=,则对象之间的赋值是不能通过编译的。
条款06:若不想使用编译器自动生成的函数,就该明确拒绝
根据条款05我们知道编译器会为类(在一定条件下)创建默认的构造、析构、拷贝构造、operator=函数,而当我们明确不需要编译器自作多情时,就该明确告诉编译器:别费劲了,老子有主了~ 即把这些函数声明(可以只声明而不定义)为private的。
当然这种方法并不保险,因为成员函数和friend函数仍然可以访问到这些函数,我们可以谨慎的不在成员函数和friend函数中对其进行调用(这一点,当只声明而不定义这些函数的时候,linker会帮助我们把不期望的调用找出来)。
另一种方法:
定义一个基类,该基类的作用是把不想让编译器自动生成的函数在该基类中声明为private的,然后让其他类继承该基类。
当客户端在我们的类没有主动定义一个这样的函数的时候去调用这些函数事,则编译器会自动生成对应的函数,而其【编译器生成版本】会尝试调用基类的对应兄弟而就会被决绝(private)。
时间: 2024-10-09 10:01:58