具有默认参数值的函数中的默认对象值

时间:2013-06-18 08:08:14

标签: c++

到目前为止,我知道如果你想将参数的默认值传递给作为对象的函数,你可以这样做:

void function(MyObject obj = MyObject()){
    ...
}

然而,我最近遇到了一些有趣的语法,这让我很困惑。 当我们调用这样的函数时会发生什么?

void function(MyObject obj = 0){
    ...
}

注意,我们传递的是一个对象,而不是一个指针。上面的代码编译得很好,没有错误或警告。这总是用一个参数调用构造函数 - MyObject的定义如下:

class MyObject{
public:
    MyObject(double n){std::cout << "Argumented\n";}
    MyObject(){std::cout << "Default\n";}
};

此外,记录了此行为的位置(因为我搜索过但无法找到它)?

3 个答案:

答案 0 :(得分:11)

参数默认为从MyObject隐式构造的0,通过调用MyObject(double)构造函数。此构造函数允许您隐式实例化MyObjects,如下所示:

MyObject o1 = 0;
MyObject o2 = 420/10.;

如果不打算这样做,请创建构造函数explicit。这还需要更改function的默认参数:

explicit MyObject(double n);

void function(MyObject obj = MyObject(0));

答案 1 :(得分:5)

如图所示,MyObject在double中有一个所谓的implicit converting constructor。因为0可以用于双倍,你看到的效果就像你做了MyObject(0.0)。

答案 2 :(得分:4)

提供以下表达式:

MyObject obj = 0;

编译并具有MyObject类型的值,然后使用MyObject的函数调用将能够以相同的方式工作。

想象一下这个函数签名:

void function(MyObject obj){
    ...
}

以下来电代码:

MyObject obj = 0;
function(obj);

这相当于第二个来电代码:

function(MyObject obj = 0);

因为MyObject obj = 0;的值等于在该行代码中构造的MyObject

您只需向前迈出一步,并利用相同的规则提供默认参数值。