构造函数调用问题

Constructor invocation issue

本文关键字:问题 函数调用      更新时间:2023-10-16

在此代码中尝试创建DOBJ4获取编译器错误

#include<iostream>
using namespace std;
class mod;
class  name {
    friend mod;
    public:
            name(const char* n) {
                    cout << "1 arg constructor for namen";
            }
            name() {
                    cout << "no arg constructor for namen";
            }
            name(const char* n, int i ){
                    cout << "2 arg constructor for namen";
            }
      };
class mod {
    public:
    mod() {
            cout << "base class constructor invokedn";
    }
};
struct derived : mod {
    derived(name) {
            cout << "derived constructor invokedn";
    }
 };
int main() {
    name nobj;
    derived dobj(nobj);
    name nobj1("hello");
    derived dobj1(nobj1);
    derived dobj2("Hi");
    name nobj2("yo", 2);
    derived dobj3(nobj2);
 //      derived dobj4("go", 4);
    return 0;
}

需要了解在dobj2的情况下,当通行字符串调用构造函数时如何调用构造函数,但是如果dobj4,则会导致错误。如何纠正此问题?

转换构造函数的规则在C++03C++11中有所不同。

C++03中:只有一个参数的构造函数,或者在一个以上的参数中,其余的具有默认值的参数是隐式可转换的。

示例:

name(const char* n) {}
name(int n, int i = 0) {} // i has a default value

C++11中:上面的C++03中定义的所有情况以及具有多个参数的构造函数。但是,此类构造函数必须为 brace-Initialized

示例:

derived dobj4({"go", 4}); // call to name(const char* n, int i) is brace-initialized

不必说,如果构造函数被声明为 explicit,则不会转换。

我觉得您的问题可能短得多,更容易理解示例代码:

我离开了派生的名称,即使继承在这里没有相关性,但我将其删除为并不重要

#include<iostream>
class  name {
public:
    name() {
        std::cout << "no arg constructor for namen";
    }
    name(const char* n) {
        std::cout << "1 arg(" << n <<") constructor for namen";
    }
    name(const char* n, int i ) {
        std::cout << "2 arg(" << n << ',' << i <<") constructor for namen";
    }
};
struct derived {
    derived(const name& n ) {
        std::cout << "derived name constructor invokedn";
        (void)n;
    }
};
int main() {
    name nobj;
    derived dobj(nobj);
    derived dobj2("Hi");
    derived dobj4({"go", 4}); //see the initialization list instead of 2 parameters passing
    return 0;
}