C ++重载转换运算符(C++ Overloading Conversion Operators)

2019-07-29 03:11发布

我想有一个类,允许隐式转换到某些内置的类型,如unsigned long int类型,因为我正在努力做到这一点尽可能正确(这是C ++我的第一个重要的项目),我已经打了一个怪关于const正确性问题:

这工作:

#include <iostream>

class CustomizedInt
{
private:
    int data;
public:
    CustomizedInt();
    CustomizedInt(int input);
    operator unsigned long int () const
    {
        unsigned long int output;
        output = (unsigned long int)data;
        return output;
    }
};

CustomizedInt::CustomizedInt()
{
    this->data = 0;
}

CustomizedInt::CustomizedInt(int input)
{
    this->data = input;
}

int main()
{
    CustomizedInt x;
    unsigned long int y = x;

    std::cout << y << std::endl;

    return 0;
}

但是这个:

#include <iostream>

class CustomizedInt
{
private:
    int data;
public:
    CustomizedInt();
    CustomizedInt(int input);
    operator unsigned long int () const;
};

CustomizedInt::CustomizedInt()
{
    this->data = 0;
}

CustomizedInt::CustomizedInt(int input)
{
    this->data = input;
}

CustomizedInt::operator unsigned long()
{
    unsigned long int output;
    output = (unsigned long int)data;
    return output;
}

int main()
{
    CustomizedInt x;
    unsigned long int y = x;

    std::cout << y << std::endl;

    return 0;
}

给我这个错误在Visual Studio 2010中: error C2511: 'CustomizedInt::operator unsigned long(void)' : overloaded member function not found in 'CustomizedInt'

现在,如果我从运营商定义中删除const关键字,一切都OK了。 这是一个错误? 我看,我应该使用const关键字每个(公共)方法/操作后,以明确指出它不以任何方式改变当前对象。

另外,我知道这样定义的操作可能是不良的做法,但我不知道我完全理解相关的注意事项。 可能有人请概述呢? 它会更好的做法是只定义了一个名为ToUnsignedLongInt公共方法?

Answer 1:

该函数签名不匹配函数定义。

operator unsigned long int () const;

CustomizedInt::operator unsigned long()    { ... }
                                       ^^^
                                   const missing

在这种情况下,你应该标记转换操作符作为const ,因为它不影响对象的内部状态。

此外,使用构造函数初始化列表来初始化成员变量。

CustomizedInt::CustomizedInt()
: data()
{
}

CustomizedInt::CustomizedInt(int input)
: data(input)
{
}


Answer 2:

可以删除const的报关,但你几乎可以肯定要做的就是把它添加到定义:

CustomizedInt::operator unsigned long() const
{
    unsigned long int output;
    output = (unsigned long int)data;
    return output;
}


Answer 3:

是的,如果你的成员函数不会影响对象的逻辑状态,那么你确实应该用postfix的是const ,所以编译器将强制执行。

但是,在这种情况下,你还需要添加const当你定义的函数体!



Answer 4:

你只需要相同的函数原型复制到执行。 即。

CustomizedInt::operator unsigned long int() const


文章来源: C++ Overloading Conversion Operators