需要澄清复制构造函数

时间:2017-12-26 06:48:10

标签: c++ copy-constructor

我有一个问题,关于何时从下面给出的代码片段的角度调用C ++中的复制构造函数:

bool do_stuff(int a, int b, char *c, Uid key = 0);

此处keydo_stuff()

的默认参数
class Uid {
...
...
private:
    u_char data_[UID_LENGTH];
}

现在,Uid有这些构造函数:

Uid:Uid()
{
    memset(data_, 0, UID_LENGTH);
}

/// @brief Copy construct a uid
Uid::Uid(const Uid &id)
{
    memcpy(data_, id.data_, UID_LENGTH);
}

/// @brief Copy the contents of ptr as the contents of a new Uid
Uid::Uid(const u_char* ptr)
{
    memcpy(data_, ptr, UID_LENGTH);
}

/// @brief Set the contents of a Uid with provided values
Uid::Uid(u_int64_t high, u_int64_t low)
{
 …
 …
}

当使用三个参数调用do_stuff时,将调用Uid::Uid(const u_char* ptr)来为key创建对象。是否由于缺少选择Uid::Uid(const u_char* ptr)的更好匹配?

将原型更改为......

bool do_stuff(int a, int b, char *c, Uid key = (Uid)0);

...确保调用Uid::Uid(const Uid &id)

谢谢!

2 个答案:

答案 0 :(得分:1)

您可能想要

bool do_stuff(int a, int b, char *c, Uid key = Uid{});

这样,如果用三个输入参数调用do_stuff,将调用默认构造函数。

答案 1 :(得分:0)

在制作默认的Uid参数时,允许编译器忽略复制构造函数。要看到这一点,请使用-fno-elide-constructors重新编译您的程序(假设是g ++)以查看差异。

关于Uid::Uid(char const*)构造函数, 0的最佳匹配,因为当您当前没有构造函数时它仍可用作nullptr标量值。