创建C++整数类,使其与整数整数类型完全相同

use*_*299 6 c++ operator-overloading

几天前我见过的那个小而且非常讨厌的问题,在接受采访时问我的朋友.

最初的面试问题是:"以下代码的输出是什么?"

int i = 2;
i = i++ + i++;
Run Code Online (Sandbox Code Playgroud)

正确答案是((2 + 2)+ 1)+ 1 = 6,即在赋值之前应用后增量两次,但是在加法之后.

然后我想创建一个带有一个整数和重载运算符+()和运算符++(int)的简单类,以在日志中查看执行运算符的确切顺序.

这就是我得到的:

class A
{
public:
A(int _data) : data(_data) { }

A &operator=(const A& _rhs)
{
    data = _rhs.data;
    cout<<" -- assign: "<<data<<endl;
}

A operator++(int _unused)
{
    A _tmp = data;
    data++;

    cout<<" -- post-increment: "<<data<<endl;
    return _tmp;
}

A operator+(const A &_rhs)
{
    A _tmp = data + _rhs.data;

    cout<<" -- addition: "<<data<<"+"<<_rhs.data<<endl;
    return _tmp;
}

inline operator int() const { return data; }

private:
    int data;
};
Run Code Online (Sandbox Code Playgroud)

结果非常令人沮丧:

-- post-increment: 3
-- post-increment: 4
-- addition: 3+2
-- assign: 5
Run Code Online (Sandbox Code Playgroud)

对于不太复杂的构造,例如(A _dt2 = a ++;),它应该起作用,但是运算符执行的顺序不是整数类型.

它可能是编译器特定的问题,我想:

$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Run Code Online (Sandbox Code Playgroud)

所以,我有点失落:)

Xeo*_*Xeo 14

最初的面试问题是:"以下代码的输出是什么?"

int i = 2;
i = i++ + i++;
Run Code Online (Sandbox Code Playgroud)

正确答案是未定义的行为,因为您正在多次修改同一个变量,而中间没有序列点.

C++ 03标准§5 [expr] p4:

除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.

这可能无法解答您的真实问题,但即使您创建类似整数的类并且重载了operator++(int)和,它也会类似operator+(A const&).函数的参数的评估顺序是未指定的,它可以按编译器喜欢的任何顺序完成,因此结果未指定.


Dev*_*lar 7

除了其他人已经指出的内容:单独考虑问题的标题 - "创建C++整数类以完全与整数整数类型相同" - 我应该指出一个完全不同的原因,为什么它是不可能的.

(据我所知)不可能模拟||的快捷行为 和&&运算符与类,即操作数的两侧将被评估,无论如何.

编辑: 查看评论."据我所知"似乎还不够.然而,史蒂夫杰索普有一个不同的例子,使整体观点有效.

这与你的增量问题完全无关,但主题是你的问题标题,所以我认为应该提到它.

  • 但是,如果您想模拟整数类型,我认为您不需要重新实现这些运算符.运算符`&&`和`||`可以自动调用你的类'`operator bool()`,在这种情况下,它们的短路行为是守恒的. (3认同)