7

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

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";}
};

另外,这种行为记录在哪里(因为我搜索并找不到它)?

4

3 回答 3

11

通过调用构造函数,参数默认为MyObject隐式构造 from 。此构造函数允许您像这样隐式实例化:0MyObject(double)MyObjects

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

如果此行为不是有意的,则制作构造函数explicit。这还需要更改function的默认参数:

explicit MyObject(double n);

void function(MyObject obj = MyObject(0));
于 2013-06-18T08:10:37.783 回答
5

MyObject 如图所示有一个所谓的implicit converting constructorfrom double。由于 0 对 double 是可以的,所以你看到的效果就像你做了 MyObject(0.0)。

于 2013-06-18T08:11:09.207 回答
4

前提是以下表达式:

MyObject obj = 0;

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

想象一下这个函数签名:

void function(MyObject obj){
    ...
}

以及以下调用者代码:

MyObject obj = 0;
function(obj);

这相当于第二个调用者代码:

function(MyObject obj = 0);

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

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

于 2013-06-18T08:14:31.047 回答