繁体   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