C++编译技巧——知道空类自动编写的函数以及拒绝方法

C++编译技巧——知道空类自动编写的函数以及拒绝方法

编码文章call10242025-09-08 14:05:354A+A-

C++的空类并不空,编译器会自动帮你实现四种函数——构造函数、析构函数、拷贝构造函数、赋值运算符重载函数。如下:

我们需要清楚的是:只有这些函数被调用时,编译器才会把它们创建出来,并且一定是创建在【public】中。

一、拷贝构造函数和赋值运算符重载函数的默认构建内容

编译器创建的拷贝构造函数和赋值运算符重载函数只是单纯的将非【static】成员变量拷贝到目标对象。且当你自己实现了这两个函数时,编译器就不再自动为你创建。

拷贝非【static】成员变量有两种方式,对于非内置类型,会调用其拷贝构造函数,而对于内置类型,会将每一个bit拷贝一份过去。

二、C++拒绝创建拷贝构造函数和赋值运算符重载函数的情况

非【static】成员变量中有引用成员时,C++不能让引用指向不同的对象,因此无法创建这两个函数。另一种情况是非【static】成员变量中有【const】成员,显然C++也不能修改【const】成员,因此也无法创建这两个函数。最后,如果类的基类的这两个函数被声明为【private】,因为C++无法调用派生类本身就无法调用的函数,所以也会拒绝创建这两个函数。

三、怎么明确拒绝C++自动创建的函数

如果创建一个指纹类,那么它的每个对象都不一样,因此会不希望用户调用拷贝构造函数和赋值运算符重载函数。这就有一个问题,如果不声明这两个函数,C++会自动创建,如果声明这两个函数,用户还是能调用到。

解决方案一就是将这两个函数声明在【private】之中。如此一来C++将不会在【public】中帮你创建,用户也无法调用这两个函数,因为编译器会报错。但是这样还有一个漏洞,友元函数和成员函数依然可以调用。其实只要只声明而不实现这两个函数即可,如此友元函数和成员函数调用时,链接器会不允许。

第二种解决方案是创建一个基类,这个基类使用解决方案一,再让指纹类继承这个基类。因为C++无法调用派生类本身就无法调用的函数,所以会拒绝创建指纹类的这两个函数。看起来方案二多此一举,但是它将原来只能链接器检查的错误,让编译器也能检查到了。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4