C++的棘手面试主题

ahe*_*ang 63 c++

鉴于下面的代码,您将如何创建/实现SR.h,以便在解决方案中没有任何星号的情况下生成正确的输出?

我对这个问题感到沮丧.我想知道一些人们用来解决这个问题的方法.

#include <cstdio>
#include "SR.h"

int main()
{
    int j = 5;
    int a[] = {10, 15};
    {
        SR x(j), y(a[0]), z(a[1]);

        j = a[0];
        a[0] = a[1];
        a[1] = j;

        printf("j = %d, a = {%d, %d}\n", j, a[0], a[1]);
    }

    printf("j = %d, a = {%d, %d}\n", j, a[0], a[1]);
}
Run Code Online (Sandbox Code Playgroud)

输出:

j = 10, a = {15, 10}
j = 5, a = {10, 15}
Run Code Online (Sandbox Code Playgroud)

第二个:

#include <cstdio>
#include "SR.h"
int main()
{
    int sum = 0;
    for (int i = 1; i < 100; i++) {
        SR ii(i);
        while (i--)
            sum += i;
    }
    printf("sum = %d\n", sum);
}

//The output is "sum = 161700".
Run Code Online (Sandbox Code Playgroud)

Bil*_*ill 83

SR充当捕获变量恢复器.当它超出范围时,它会恢复先前捕获的一些值.

构造函数将执行两项操作:捕获引用,并捕获该引用的值.析构函数将原始值恢复为该引用.

class SR
{
public:
  SR(int& var) : capture(var), value(var) {}
  ~SR() { capture = value; }

private:
  int& capture;
  int value;
};
Run Code Online (Sandbox Code Playgroud)

编辑:只是一个猜测,但我认为SR应该代表ScopeRestorer?

  • 我的想法是SR = SaveRestore. (10认同)

Kug*_*gel 16

我没有时间编写代码,但是你需要在构造函数中使用references和int.并且您需要将原始值恢复为析构函数中的引用.当SR超出范围时,它需要恢复在构造期间传入的原始值.