将对象传递给参考功能,面试测试

时间:2013-09-03 14:42:10

标签: c++ reference parameter-passing

我有一个有趣(或愚蠢)的面试问题。好吧,我知道下面的代码不会编译,但我无法回答如何修改类C以使代码编译。有人告诉我,像Test(C(1));void Test(C c)这样的答案是不可接受的。你能帮助我吗?

以下是问题:

Q11。下面的代码会编译吗?如果没有,请进行任何您想要C类的更改,以便编译代码。

class C
{
public:
    C(int i) {}
    ~C() {}
};

void Test(C &c)
{
}

int main(int, char*)
{
    Test(1);
    return 0;
}

3 个答案:

答案 0 :(得分:7)

代码无法编译。

由于C的签名错误(char *是从不第二个参数的类型),因此无法使其编译仅更改类main

但即使main的签名正确Test(1);,也希望隐式创建C的临时对象并将其传递给Test。但是,您无法将临时绑定到非const引用,并且我看不到任何方法只更改类C以创建可以绑定到Test的参数的隐式临时。 / p>

编辑:我最接近的是将friend void Test(int i) { }放入C。这是使用Sun的CC编译器编译的,但无法使用ideone中的g ++ 4.4,4.5或4.8进行编译。 EDIT2:从11.4 / 5开始,g ++在这里是正确的:函数被引入到类的范围内,而不是封闭的范围。

答案 1 :(得分:6)

此任务无法回答,因为问题不属于班级C,而是Test想要对C进行非const引用。

调用Test(1)时,编译将查看Test的签名,请注意C可以隐式构造int(因为它不是explicit }}),但C(1)仍然是右值,Test需要左值。

可以通过更改Test

的签名来解决此问题
void Test(C const & c) {} // or
void Test(C c) {}         // or, since C++11
void Test(C && c) {}

或者使用main中的左值来调用它:

C c(1); // or C c = 1; if you desperately want to keep the implicit conversion
Test(c);

答案 2 :(得分:1)

http://ideone.com/pnZwh6怎么样 这是一个黑客,但它让代码编译。

class C
{
public:
    C(int i) {}
    ~C() {}

#define C const C
};

void Test(C &c)
{
}

int main(int, char**)
{
    Test(1);
    return 0;
}