簡體   English   中英

類復制構造函數和指向成員的指針函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM