zoukankan      html  css  js  c++  java
  • c++ 隐式转换(explicit与转换构造函数)

    由转换造函数进行的类型转换称为隐式转换,由类型转换运算符进行的转换称为显式转换

    当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数,即转换构造函数为单参构造函数的一种。

    只有类的转换构造函数和类型转换操作符函数才可以被声明为explicit,当explicit用于类型转换操作符运算时,意味着禁止所有显式的类型转换

    explicit不可以被继承,因为子类和父类的构造函数之间是调用关系,而非继承。

    单参构造函数的功能:

    在c++中,单参构造函数(或者除了第一个参数外其余参数都有默认值的多参数构造函数)承担了两个角色:一是构造器,二是默认且隐含的类型转换操作符(转换构造函数

    当我们在写 YYY = XXX 这样的代码,且XXX的类型恰好是YYY单参构造器的参数类型,这时候编译器就自动调用这个构造器,创建一个YYY对象。

    如果我们不想使用这个默认且隐含的类型转换功能,就需要在类的单参构造器前面加上 explicit 修饰指定这个构造器只能被显示调用,不能作为类型转换操作符被隐含地使用。

    示例:

    class Integer1 {
    public:
        int data;
        Integer1(int data) { this->data = data; }
    };
    
    class Integer2 {
    public:
        int data;
        explicit Integer2(int data) { this->data = data; }
    };
    
    int main()
    {
        Integer1 v1 = 3; // 隐式地调用其构造函数,success
        Integer2 v2 = 3; // 编译错误,不能隐式地调用其构造函数
        Integer2 v3(2); // 显示调用构造函数,sucess
        return 0;
    }
  • 相关阅读:
    Mobile GMaps - Google Map移动版
    365Key今天不能用了,感觉不爽
    推荐:对个人免费的杀毒软件[avast!]
    向 Visual Studio 2005 Tools for Office 迁移时,将 VBA 代码转换为 Visual Basic .NET
    令人向往的3000年生活(转载)
    也说技术人员创业
    痛恨3721的朋友们,装个avast! Antivirus吧
    很Cool很全的Google Map的应用
    关于.net的企业应用开发
    天天网摘(20050704)
  • 原文地址:https://www.cnblogs.com/tongyishu/p/13289171.html
Copyright © 2011-2022 走看看