美文网首页
[C++11阅读][2-3-1]显式类型转换

[C++11阅读][2-3-1]显式类型转换

作者: 凌霄阁2010 | 来源:发表于2020-05-30 01:09 被阅读0次

避免已知类型向自定义类型隐式转换

explicit关键字加在构造函数前面,可以声明此函数应当被显式调用,而不是在隐式类型转换时被隐式调用。

#include <iostream>
using namespace std;
struct Rational1 {
    Rational1(int n=0, int d=1): num(n), den(d) {
        cout << __func__ << "(" << num << "/" << den << ")" << endl;
    }
    int num;
    int den;
};
struct Rational2 {
    explicit Rational2(int n=0, int d=1): num(n), den(d) {
        cout << __func__ << "(" << num << "/" << den << ")" << endl;
    }
    int num;
    int den;
};
void Display1(Rational1 ra) {
    cout << "Numerator: " << ra.num << " Denominator: " << ra.den << endl;
}
void Display2(Rational2 ra) {
    cout << "Numerator: " << ra.num << " Denominator: " << ra.den << endl;
}
int main() {
    Rational1 r1_1 = 11;  // OK
    Rational1 r1_2(12);  // OK
    Rational2 r2_1 = 21;  // error: conversion from ‘int’ to non-scalar type ‘Rational2’ requested
    Rational1 r2_2(22);  // OK
    Display1(1);  // OK
    Display2(2);  // 隐式构造 error: could not convert ‘2’ from ‘int’ to ‘Rational2’
    Display2(Rational2(2));  // 显式构造 OK
    return 0;
}

避免自定义类型向已知类型隐式转换

上一小节的例子可以避免已知类型(int)向自定义类型(Rational2)的隐式转换,但没对自定义类型向已知类型转换进行限制。
explicit关键字加在类型转换操作符重载前面,可以做到以上限制。
留意下类型转换操作符的写法,operator 类型() {},比如operator bool() {},这里的bool不是返回值类型,而是与括号连用组成强制类型转换符。

#include <iostream>
using namespace std;
class ConvertTo {};
class Convertable {
public:
    explicit operator ConvertTo() const {
        return ConvertTo();
    }
};
void Func(ConvertTo ct) {}
void test() {
    Convertable c;
    ConvertTo ct(c);  // 直接初始化 OK
    ConvertTo ct2 = c;  // 拷贝构造时隐式类型转换 error: conversion from ‘Convertable’ to non-scalar type ‘ConvertTo’ requested
    ConvertTo ct3 = static_cast<ConvertTo>(c);  // 显式强制类型转换 OK
    Func(c);  // 传参时隐式类型转换 error: could not convert ‘c’ from ‘Convertable’ to ‘ConvertTo’
}

小结

explicit不是禁止从源类型到目标类型的转换,而是限定了所修饰函数必须显式调用,如果所修时函数是构造函数和类型转换操作符,达成了显示类型转换这一效果。

相关文章

  • [C++11阅读][2-3-1]显式类型转换

    避免已知类型向自定义类型隐式转换 explicit关键字加在构造函数前面,可以声明此函数应当被显式调用,而不是在隐...

  • 03-数据类型转换

    数值类型转换 C语言中存在显式转换和隐式转换 Go语言中只有显式转换 Go语言中数值类型转换注意点 数值类型转换为...

  • kotlin基础笔记之类型转换

    Kotlin没有隐式拓宽转换,如 Java 中 int 可以隐式转换为 long,必须要显式类型转换。 显式类型转...

  • JS里的数据类型转换

    在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换。 1, 显式数据类型转换 a:转数字: 1)Numb...

  • 回顾Date.0402(类型转换、运算)

    类型转换 隐式转换 显式转换 转换为Boolean类型:Boolean(xxx) ; !!xxx 数字类型转换为布...

  • 显式和隐式类型转换

    显式类型转换又称强制类型转换,如用parseIn、parseFloat等方法对数据进行类型转换; 隐式类型转换就是...

  • C++类型转换

    C++的类型转换分为隐式转换和显式转换 隐式转换举例: int i=4; double d=i;//隐式转换 显式...

  • 【二】基本数据类型和Eclipse使用

    1.基本数据类型(4类8种) 2.强制类型转换 隐式转换隐式转换 显式转换显式转换 3.Eclipse使用介绍 E...

  • 数据类型转换

    写在前面 C/C++编程中常见数据类型转换,包括隐式类型转换和显式类型转换。 1. 隐式类型转换 隐式类型转换在以...

  • C++类型强制转换

    类型转换 隐式类型转换 显式类型转换 语法 1. static_cast 用法用于非多态类型之间的转换,不提供运行...

网友评论

      本文标题:[C++11阅读][2-3-1]显式类型转换

      本文链接:https://www.haomeiwen.com/subject/myczahtx.html