class copy-constructor和指向成员的函数

时间:2015-03-18 14:44:51

标签: c++ member-function-pointers default-copy-constructor

我有一个大程序,其中一些类使用指向成员函数。一般代码结构是:

#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

但我认为这可以由编译器默认给出。另外,由于涉及指针,我不确定默认的析构函数。

2 个答案:

答案 0 :(得分:0)

默认复制构造函数在每个成员变量上调用复制构造函数,因此它会自动生成以下代码:

Foo::Foo(const Foo& p)
    : PointFun(p.PointFun)
{}

每个析构函数(包括默认的析构函数)会自动在每个成员变量上调用析构函数。对于原始指针,它什么都不做。

由于您的代码没有动态分配,您只需获取方法指针,它就能正常工作。

答案 1 :(得分:0)

  

在这种情况下,我是否需要定义复制构造函数和/或析构函数?

没有。成员函数指针是可复制的,在销毁之前不需要任何特殊处理。默认函数将做正确的事。

  

我不确定默认的析构函数,因为涉及指针。

如果指针指向需要手动清理的某个资源,则只需要存在指针的析构函数;例如,如果您使用new分配了某些内容。在这种情况下,你可能根本不需要一个指针,而是一个智能指针,容器或其他RAII对象,而不是玩弄指针并希望你不要丢弃它。