`

隐式类型转换与转换操作符operator T

 
阅读更多
隐式类型转换与转换操作符 operator T
C++ 标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象 ( 创建临时对象 ) 。如果这种转换代价很大 ( 调用类的构造函数 ) ,隐式转换将影响性能。

隐式转换的发生条件:函数调用中,当参数类型不匹配,如果隐式转换后能满足类型匹配条件,编译器将启用类型转换。

控制隐式类型转换的两种途径:

1) 减少函数调用的参数不匹配情况:提供签名 ( 函数参数类型 ) 与常见参数类型的精确匹配的重载函数。

2) 限制编译器的启用隐式转换:使用 explicit 限制的构造函数和具名转换函数。



下面的例子将导致隐式类型转换:

1) 未限制的构造函数:

class Widget { // …

  Widget( unsigned int widgetizationFactor );

  Widget( const char* name, const Widget* other = 0 );

};

2) 转换操作符 ( 定义成 operator T() ,其中 T 为 C++ 类型 )

class String {

public:

    operator const char*();  // 在需要情况下, String 对象可以转成 const char* 指针。

};



上面的定义将使很多愚蠢的表达式通过编译 ( 编译器启用了隐式转换 ) 。

Assume s1, s2 are Strings:

int x = s1 - s2;                // compiles; undefined behavior

const char* p = s1 - 5;         // compiles; undefined behavior

p = s1 + '0';                 // compiles; doesn't do what you'd expect

if( s1 == "0" ) { ...}          // compiles; doesn't do what you'd expect



合理的解决方案:

By default, write explicit on single-argument constructors:

默认时,为单参数 的构造函数加上 explicit :

class Widget { // …

  explicit Widget( unsigned int widgetizationFactor );

  explicit Widget( const char* name, const Widget* other = 0 );

};



使用提供的转换具名函数代替转换操作符:

Use named functions that offer conversions instead of conversion operators:

class String { // …

  const char* as_char_pointer() const;       // in the grand c_str tradition

};
分享到:
评论

相关推荐

    c#问题 谁能解释下public static implicit operator float

    `public static implicit operator float(currency value)` 在 C# 中定义了一个隐式类型转换操作符,它允许从自定义类型`currency`隐式转换为`float`类型。这种转换方式可以使代码更加简洁,但在使用时也需要注意...

    C++ Primer 第十四章 重载操作符与转换 思维导图笔记

    在C++编程语言中,重载操作符与转换是两个重要的概念,它们允许程序员自定义基本操作符的行为,以及在不同类型之间进行灵活的转换。在第十四章《C++ Primer》中,作者深入探讨了这些主题,以帮助读者更好地理解和...

    有关C++中类类型转换操作符总结(必看篇)

    另外,考虑使用显式转换操作符(explicit operator type()),这可以防止隐式类型转换,减少潜在的二义性和意外行为。 总之,C++中的类类型转换操作符是一个强大的工具,可以提高代码的灵活性和兼容性,但同时也...

    C++类型转换时定义非成员函数 .pdf

    本篇讨论的焦点是为何在进行类型转换时,非成员函数(non-member functions)比成员函数更适合,并通过一个Rational类的模板化操作符*函数为例,深入解释这个问题。 首先,让我们理解《C++箴言:声明为非成员函数的...

    C++ operator两种用法.docx

    C++_operator两种用法 C++中的operator有两种用法:operator ...operator overloading和operator casting是C++中的两种强大功能,它们允许用户自定义操作符和隐式转换的行为,以便更好地适应特定的数据类型。

    C重载转型操作符-C教程共2页.pdf.zip

    在C++编程语言中,重载转换操作符(也称为类型转换操作符)是一个非常重要的概念,它允许程序员自定义类对象到其他类型之间的转换。本教程将深入讲解这一主题,帮助你理解如何在C++中有效地使用和重载转换操作符。 ...

    implicit关键字做自定义类型隐式转换的方法

    在 C# 的上下文中,隐式类型转换操作符是一种特殊的方法,它定义在源类型(要转换的类型)中,并返回目标类型。这个方法必须是静态的,并且具有 `operator` 关键字作为其声明的一部分。使用 `implicit` 关键字定义的...

    C++操作符重载手册

    在C++编程语言中,操作符重载是一项关键特性,允许程序员为自定义类型赋予与内置类型相似的操作符行为。本手册将详细阐述C++中操作符重载的相关规则、建议以及如何重载`operator new`。 **一、操作符重载规则** 1....

    C++11显示类型转换的优点

    为了阻止容易导致隐晦错误的隐式类型转换,C++11引入了explicit关键字作用于自定义的类型转换操作符的功能,禁止隐式类型转换。例如,在上面的示例代码中,我们可以使用explicit关键字修饰bool类型转换操作符,以...

    C++类型转换时定义非成员函数 .docx

    例如,在《C++箴言:声明为非成员函数的时机》中提到的Rational类,其乘法操作符`operator*`作为一个非成员函数,目的是支持不同类型的对象之间的混合运算。 模板类Rational的定义使得它能够处理多种类型的数值。...

    C++中Operator类型强制转换成员函数解析

    类型转换操作符(type conversion operator)是一种特殊的成员函数,它的主要任务是将类类型值转换为其他类型值。这种转换可以是隐式的,也可以是显式的。当我们在类中定义这样的函数时,通常会在`operator`关键字...

    BYTE类型之间相互转换

    对于指针,你可以通过解引用操作符`*`来访问其指向的值。如果你有一个指向`BYTE`的指针,可以将其转换为指向其他类型的新指针,然后解引用: ```cpp BYTE* bytePtr = &byteValue; int* intPtr = reinterpret_...

    分数类中的操作符重载

    这可以通过在分数类中添加一个构造函数,接受一个整数并将其作为分子,分母设为1,或者通过重载操作符使整数可以隐式转换为分数对象来实现。 在`fraction`文件中,可能包含了这个分数类的实现细节,包括类定义、...

    C++关键字和操作符替代名

    24. **explicit**:用于构造函数或转换操作符,防止隐式转换。 25. **extern**:声明变量或函数在其他文件中定义。 26. **false**:布尔值,表示假。 27. **float**:单精度浮点类型。 28. **for**:for循环...

    C++操作符重载专题

    - **操作符语义的一致性:**在设计操作符重载时,应确保其行为符合预期,并尽量保持与内置类型的行为一致。 #### 六、总结 操作符重载是C++中一项非常有用的特性,它使开发者能够以更加自然的方式处理自定义类型的...

    C++运算符重载转换运算符(讲解详细,不容错过)

    但这与我们通常理解的`explicit`关键字略有不同,`explicit`关键字用于构造函数,防止隐式类型转换。而在转换运算符中,即使标记为`explicit`,仍然允许隐式转换,只是不允许通过操作符的复合赋值形式进行转换。 ...

    面向对象程序设计英文教学课件:07-Operator-Overload.pptx

    当找不到适合的重载版本的操作符时,编译器会寻找一个接受特定类型(如double)的构造函数,这就是所谓的隐式类型转换。通过这种方式,我们可以在不显式转换类型的情况下,让不同的数据类型之间进行操作,简化了代码...

    cpp_type_convert.docx

    - **类型转换成员函数**:某些类提供类型转换成员函数,如`operator int()`,这些函数允许对象被当作其他类型使用,但使用`explicit`可以防止不必要的隐式转换。 2. **显式转换**: - `dynamic_cast`:用于运行时...

Global site tag (gtag.js) - Google Analytics