class 复制构造函数和指向成员的指针函数
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;
}
此代码按原样编译。但是,我的问题是:在这种情况下,我是否需要定义一个复制构造函数 and/or 析构函数?
例如,我可以定义
Foo::Foo(const Foo& p) //Foo copy-constructor
{
PointFun = p.PointFun;
}
Foo::~Foo() {} //Foo destructor
但我认为这可能是由编译器默认给出的。另外,我不确定默认的析构函数,因为涉及到一个指针。
默认复制构造函数在每个成员变量上调用复制构造函数,因此它会自动生成以下代码:
Foo::Foo(const Foo& p)
: PointFun(p.PointFun)
{}
每个析构函数(包括默认析构函数)自动调用每个成员变量的析构函数。对于原始指针,这什么都不做。
由于您的代码没有任何动态分配的内容,您只需获取方法指针,它就会正常工作。
Do I need to define a copy-constructor and/or destructor in this case?
没有。成员函数指针是可复制的,在销毁前不需要任何特殊处理。默认函数会做正确的事情。
I am not sure about the default destructor since there is a pointer involved.
如果指针指向您需要手动清理的某些资源,您只需要在存在指针的情况下使用析构函数;例如,如果你用 new
分配了一些东西。在这种情况下,您可能根本不需要指针,而是智能指针、容器或其他 RAII 对象,而不是摆弄指针并希望您不要丢弃它。
我有一个大程序,其中一些 类 使用指向成员函数的指针。一般的代码结构是:
#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;
}
此代码按原样编译。但是,我的问题是:在这种情况下,我是否需要定义一个复制构造函数 and/or 析构函数?
例如,我可以定义
Foo::Foo(const Foo& p) //Foo copy-constructor
{
PointFun = p.PointFun;
}
Foo::~Foo() {} //Foo destructor
但我认为这可能是由编译器默认给出的。另外,我不确定默认的析构函数,因为涉及到一个指针。
默认复制构造函数在每个成员变量上调用复制构造函数,因此它会自动生成以下代码:
Foo::Foo(const Foo& p)
: PointFun(p.PointFun)
{}
每个析构函数(包括默认析构函数)自动调用每个成员变量的析构函数。对于原始指针,这什么都不做。
由于您的代码没有任何动态分配的内容,您只需获取方法指针,它就会正常工作。
Do I need to define a copy-constructor and/or destructor in this case?
没有。成员函数指针是可复制的,在销毁前不需要任何特殊处理。默认函数会做正确的事情。
I am not sure about the default destructor since there is a pointer involved.
如果指针指向您需要手动清理的某些资源,您只需要在存在指针的情况下使用析构函数;例如,如果你用 new
分配了一些东西。在这种情况下,您可能根本不需要指针,而是智能指针、容器或其他 RAII 对象,而不是摆弄指针并希望您不要丢弃它。