转换构造函数:您如何解释C 中给定不同参数的函数

converting constructor: How do you explain a function given different arguments in c++

本文关键字:函数 参数 构造函数 何解释 解释 转换      更新时间:2023-10-16

我正在尝试理解以下代码。我的问题是函数f()。我不明白为什么当我们通过整数参数时,我们没有汇编错误。

函数void f(const A &a1, const A &a2 = A())具有两个const参数,这些参数作为参考A类。在主函数中,我们称为f(3)。我真的不明白到底发生了什么。

我找不到这个问题的正确标题。这里有一个技术词吗?


#include <iostream>
class A
{
public:
    A(int n = 0)
        : m_n(n)
    {
        std::cout << 'd';
    }
    A(const A& a)
        : m_n(a.m_n)
    {
        std::cout << 'c';
    }
private:
    int m_n;
};
void f(const A &a1, const A &a2 = A())
{
}
int main()
{
    A a(2), b;
    const A c(a), &d = c, e = b;
    b = d;
    A *p = new A(c), *q = &a;
    static_cast<void>(q);
    delete p;
    f(3);
    std::cout << std::endl;
    return 0;
}

在C 中,一个只有一个参数的构造函数称为转换构造函数。该函数不抱怨的原因是,将值传递到a1所需的复制操作是隐式使用A(int n = 0)

通过标记 explicit

来阻止这种情况发生
explicit A(int n = 0)

作为旁注;除非您真的想要这种行为(为什么?!)

A的对象被隐式创建。为避免这种令人困惑的情况,请声明构造函数explicit。总体而言,这也被认为是一个好实践。

explicit A(int n = 0)

标准(N4140 12.3.1/1)说:

没有 function-depcifier explicit声明的构造函数指定从其类型的转换 其类型的参数。这样的构造函数称为a 转换构造函数。[示例:

struct X {
    X(int);
    X(const char*, int =0);
    X(int, int);
};
void f(X arg) {
    X a = 1; // a = X(1)
    X b = "Jessie"; // b = X("Jessie",0)
    a = 2; // a = X(2)
    f(3); // f(X(3))
    f({1, 2}); // f(X(1,2))
}

- 结束示例]

存在用于A级int的构造函数,因此可以使用该构造函数将参数转换为正确的类型。允许编译器对每个参数进行一次执行操作。将 explicit 关键字前缀到构造函数,以防止编译器使用该构造函数将其用于隐式转换解决方案:定义

explicit A(int n = 0)