函数式强制转换与构造函数

时间:2017-08-04 11:38:23

标签: c++ string casting

我在C ++中学到了

typedef foo* mytype;

(mytype) a        // C-style cast

mytype(a)         // function-style cast

做同样的事情。

但是我注意到函数样式转换与构造函数共享相同的语法。 Aren有不明确的案例,我们不知道它是演员还是构造函数?

char s [] = "Hello";
std::string s2 = std::string(s);     // here it's a constructor but why wouldn't it be ...
std::string s3 = (std::string) s;    // ... interpreted as a function-style cast?

3 个答案:

答案 0 :(得分:11)

从语法上讲,始终是演员。该演员阵容可能会调用构造函数:

char s [] = "Hello";
// Function-style cast; internally calls std::basic_string<char>::basic_string(char const*, Allocator)
std::string s2 = std::string(s);
// C-style cast; internally calls std::basic_string<char>::basic_string(char const*, Allocator)
std::string s3 = (std::string) s;

答案 1 :(得分:1)

转换是一种初始化形式。当一个类型可以隐式转换为另一个类型时,函数转换是一种直接初始化的形式。编译器知道哪些类型是可转换的。

每当将某些内容转换为类类型时,都会使用目标类型的转换构造函数或源类型的转换运算符。在您的示例中,两个强制转换都调用默认构造函数。

答案 2 :(得分:-1)

编译器知道。并且在两种情况下都有一个构造函数。