[英]class copy-constructor and pointer-to-member functions
我有一個大型程序,其中有些類使用指針成員函數。 通用代碼結構為:
#include <iostream>
using namespace std;
/**** CLASS FOO ****/
class Foo {
public:
Foo(); //constructor
void Fun(){ /* stuff */ }; //some function
void (Foo::*PointFun)(); //pointer-to-member function
inline void POINTFUN() //for readability when calling PointFun
{
return (this->*PointFun)();
}
};
/**** Foo constructor ****/
Foo::Foo()
{
PointFun = &Foo::Fun; //define PointFun
}
/**** main program ****/
int main()
{
Foo p; //calls constructor
p.Fun(); //calls some function
p.POINTFUN(); //calls PointFun
return 0;
}
此代碼按原樣編譯。 但是,我的問題是:在這種情況下是否需要定義復制構造函數和/或析構函數?
例如,我可以定義
Foo::Foo(const Foo& p) //Foo copy-constructor
{
PointFun = p.PointFun;
}
Foo::~Foo() {} //Foo destructor
但是我認為編譯器可以默認提供它。 另外,由於涉及到指針,因此我不確定默認的析構函數。
默認的復制構造函數在每個成員變量上調用復制構造函數,因此它將自動生成以下代碼:
Foo::Foo(const Foo& p)
: PointFun(p.PointFun)
{}
每個析構函數(包括默認析構函數)都會在每個成員變量上自動調用析構函數。 對於原始指針,則不執行任何操作。
由於您的代碼沒有動態分配,因此您只需獲取方法的指針,它將可以正常工作。
在這種情況下,是否需要定義復制構造函數和/或析構函數?
否。成員函數指針是可復制的,銷毀之前不需要任何特殊處理。 默認功能將做正確的事。
我不確定默認析構函數,因為其中涉及一個指針。
如果該指針指向您需要手動清除的某些資源,則僅在該指針存在的情況下需要析構函數。 例如,如果您使用new
分配了一些東西。 在這種情況下,您可能根本不需要指針,而是智能指針,容器或其他RAII對象,而不是弄亂指針並希望您不要將其刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.