C ++中内置类型的自定义构造函数

时间:2018-09-15 09:45:48

标签: c++ constructor built-in-types

假设我定义了一个名为Entity的类,该类具有一个数据成员,该数据成员是一个指向int的指针。例如

class Entity {
public:
    int* ptr;
    // other stuff
};

是否可以给类型int*的构造函数一个Entity对象的构造方法?如果我有一个名为my_entity的Entity对象,我希望能够执行类似的操作

int* p(my_entity);

或这个

int* p = my_entity;

,这将要求编译器隐式调用int*的{​​{1}}的构造函数。

这可能吗? (我知道我可以在Entity类中定义一个公共Entity方法,并执行类似get_pointer()的操作,但这似乎很麻烦。)

2 个答案:

答案 0 :(得分:1)

好吧,没有基本指针的构造函数-从某种意义上说,没有隐式调用函数来初始化指针。

最接近的是使用用户定义的转换运算符功能

class Entity
{
     public:

          operator int *();
};

Entity::operator int *()
{
     // return something appropriate that is of type int *
}


//   sample usage in a function somewhere

int *p = some_entity;    // implicitly conversion that calls the operator int *()

int *another_p = static_cast<int *>(some_entity);    //  explicit conversion

int *yet_another_p = some_entity.operator int *();

此方法有多种变体,具体取决于所需的const限定形式(例如,如果运算符功能未更改其作用的对象,则应为const,并且可以定义为operator const int *())。

必须确保正确处理了运算符函数返回的指针。如果用户定义的运算符函数返回some_entity的成员,则一旦some_entity不再存在,就无法使用它。同样,如果使用动态内存分配(例如,返回new表达式的结果),则调用者必须显式释放该内存,以避免内存泄漏。

答案 1 :(得分:0)

您不能为基本类型创建构造函数。同样,也不需要使用构造函数来执行此操作,您可以只使用您已经提到的getter,也可以使用将Entityint传递并存储int到的函数Entity

此外,您也可以像某些程序员老兄所说的那样使用user-defined conversion并执行类似的操作:

int *p = (int*)my_entity;