关于类:C ++:了解具有带1个参数的构造函数的类的隐式类型转换

C++ : Understanding implicit typecasting for classes with a constructor with 1 argument

本问题已经有最佳答案,请猛点这里访问。

如果一个构造函数只有一个参数,并且据说它对类类型进行了隐式强制转换,那么我会很高兴对它进行澄清,因为:

1
2
3
4
5
6
class dog {
public :
        dog(string name) {    mname = name;}
private :
         string mname;
};

我不理解如何将类型字符串转换为类型狗,我可以看到如何将其传入并设置另一个字符串,但如果将字符串转换为类型狗,这意味着什么?会不会是类型dog被分配了一个字符串的位拷贝?


如果你有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>

class dog {
public:
    dog(std::string name) : mname(name) {} // use initializer list
private:
    std::string mname;
};

void Foo(dog g) {}

int main()
{
    std::string name ="fido";
    Foo(name);
}

LIve示例

这是在做一个比较有趣的事情,你称之为Foo(),但我们不是给它一个dog,而是给它一个string。所以编译器会说:"好吧,我能用字符串做一只狗吗?让我们看看dog构造函数。哦,看,我可以用string构造一个dog。我将继续从你交给Foo()string上制作一个dog,一切都会好的。"

这就是所谓的隐式类型转换。我们可以通过将构造函数标记为explicit来防止这种情况的发生。使构造函数explicit不用于隐式转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>

class dog {
public:
    explicit dog(std::string name) : mname(name) {} // use initializer list
private:
    std::string mname;
};

void Foo(dog g) {}

int main()
{
    std::string name ="fido";
    Foo(name);
}

LIve示例

现在编译器经历了相同的步骤,但它不能使用构造函数,因此您将得到一个编译器错误。现在,如果我们想要转换,我们必须手动进行如下操作:

1
Foo(dog(name));