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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |