构造函数调用问题

安什昆

在此代码中尝试创建 dobj4 时出现编译器错误

#include<iostream>
using namespace std;
class mod;
class  name {
    friend mod;
    public:
            name(const char* n) {
                    cout << "1 arg constructor for name\n";
            }
            name() {
                    cout << "no arg constructor for name\n";
            }
            name(const char* n, int i ){
                    cout << "2 arg constructor for name\n";
            }
      };

class mod {
    public:
    mod() {
            cout << "base class constructor invoked\n";
    }
};

struct derived : mod {

    derived(name) {
            cout << "derived constructor invoked\n";
    }
 };

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会导致错误。如何纠正这个问题?

CinCout

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

In C++03:只有一个参数的构造函数,或者在多个参数的情况下,其余参数具有默认值是隐式可转换的。

例子:

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

In C++11C++03上面定义的所有情况以及具有多个参数的构造函数。但是这样的构造函数调用需要大括号初始化

例子:

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

不用说,如果声明了构造函数explicit,它就不会进行转换。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章