加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – cast operator() – 强制转换为引用并转换为值

发布时间:2020-12-16 10:00:12 所属栏目:百科 来源:网络整理
导读:我的关注点正在触及标题中给出的主题. 假设我们有一些非常简单的课程 class Integer{public: Integer(int number) : m_value(number) {} int value(){return m_value;}private: int m_value;}; 现在我们可以使用这个代表int的类,当然在使用这个类时没有更大
我的关注点正在触及标题中给出的主题.

假设我们有一些非常简单的课程

class Integer{
public:
    Integer(int number) : m_value(number) {}
    int value(){return m_value;}
private:
    int m_value;
};

现在我们可以使用这个代表int的类,当然在使用这个类时没有更大的意义,但它只是一个例子.如果希望这个类的行为更像真实整数,那么我们应该提供强制转换运算符(不要提及运算符==,>,<等等),这是我的关注,因为我可以定义两个运算符:

operator T() {return m_value;}
operator T&() {return m_value;}

一些最简单的例子用它们(第一个或第二个)编译和工作,所以我们的类可以如下:

class Integer{
public:
    Integer(int number) : m_value(number) {}
    int value(){return m_value;}
    operator T(){return m_value;} // casting operator
private:
    int m_value;
};

但它可以是:

class Integer{
public:
    Integer(int number) : m_value(number) {}
    int value(){return m_value;}
    operator T&(){return m_value;} // casting operator
private:
    int m_value;
};

同样,我的问题是这两个中的哪一个是合适的?当然我不能同时拥有它们,因为编译器无法识别使用哪一个.

自然参考铸造似乎更有效,但我不确定它是否总是以它应该工作的方式工作.请以某种方式告诉我,并说,为什么一个操作符比另一个更好?

解决方法

事实上,你需要两者并进行一些调整,编译器将知道选择哪一个.所有的魔力都在于你可以(并且应该在有意义的时候)将成员函数定义为const,id est可以从常量对象调用.

因此,您的Integer类应该是这样的

class Integer
{
public:
    Integer() : Integer(0) {}
    Integer(int number) : m_value(number) {}
    Integer(const Integer& other) : m_value(other.value()) {}
    int value() const { return m_value; }

    operator int() const { return m_value; }
    operator int&() { return m_value; }
    const Integer& operator=(const Integer& other) { m_value = other; return *this; }
private:
    int m_value;
};

此定义允许Integer类在以下情况下可用:

#include <iostream>
int main()
{
    const Integer zero;
    const Integer one(1);
    Integer counter;

    counter = zero + one;
    std::cout << "counter: " << counter << std::endl;

    counter++;
    std::cout << "counter: " << counter << std::endl;

    for (Integer i=0 ; i < counter ; ++i)
    {
        std::cout << "i: " << i << std::endl;
    }

    return zero;
}

编译& run:g -std = c 14 -O2 -Wall -pedantic -pthread main.cpp&& ./a.out

输出:

counter: 1
counter: 2
i: 0
i: 1

实例:http://coliru.stacked-crooked.com/a/641fe02e70c02920

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读