首页 > 其他分享 >explicit关键字

explicit关键字

时间:2023-12-12 21:58:40浏览次数:27  
标签:int explicit 关键字 Test 隐式 构造函数

1. 隐式类型转换

在C++11前,对于类的使用,存在隐式类型转化的情况,实质上是构造函数的隐式调用。下面是一个例子:

EG:

  • 代码:

    #include <iostream>
    using namespace std;
    
    class Test {
    public:
        int x;
        int y;
        Test(int x = 1, int y = 2): x(x), y(y){ cout << "parameterized constructor" << endl; }
    };
    
    void func(const Test& t) {
        cout << "x==" << t.x << "\t" << "y==" << t.y << endl;
    }
    
    int main(void){
        Test t1 = 10;
        cout << "x==" << t1.x << "\t" << "y==" << t1.y << endl;
        func(20);
        return 0;
    }
    
    
  • 输出:

    parameterized constructor
    x==10	y==2
    parameterized constructor
    x==20	y==2
    
  • 分析:

    • 第16行:发生隐式类型转化,实际上相当于:Test t1(10)
    • 第18行:发生隐式类型转换,实际上相当于:func(Test(20))

问题:

这样的隐式类型转化,有时可能会导致意想不到的错误,因此从C++11开始,提出了explicit关键字。

2. explict关键字

作用:

指定构造函数或转换函数为显式,即它不能用于隐式转换和复制初始化

EG:

  • 代码:

    #include <iostream>
    using namespace std;
    
    class Test {
    public:
        int x;
        int y;
        explicit Test(int x = 1, int y = 2): x(x), y(y){ cout << "parameterized constructor" << endl; }
    };
    
    void func(const Test& t) {
        cout << "x==" << t.x << "\t" << "y==" << t.y << endl;
    }
    
    int main(void){
        // Test t1 = 10; 		// error
        Test t1(10);
        cout << "x==" << t1.x << "\t" << "y==" << t1.y << endl;
        // func(20);			// error
        func(Test(20));
        return 0;
    }
    
    
  • 分析:

    • 第8行:使用explicit关键字,禁止Test类的隐式转换复制初始化
    • 第16、19行:因为禁止了隐式转换,所以错误。

应用场景:

一般情况下,除了你有进行隐式转化的必要,否则建议使用explicit关键字,这可以增加程序的严谨性。

标签:int,explicit,关键字,Test,隐式,构造函数
From: https://www.cnblogs.com/beasts777/p/17897899.html

相关文章

  • Angular Component 内 set 关键字的使用
    "set"关键字在Angular组件的TypeScript代码中通常用于创建和定义类的属性的setter方法。它是一种特殊的方法,负责设置类的私有成员变量的值。通过使用"set"关键字,我们可以在设置属性值时执行一些额外的逻辑,如输入验证、触发事件等。让我们通过一个简单的例子来说明"set"关键字的用......
  • 命名关键字参数
    命名关键字参数(1)在函数内判断在定义了**kwargs参数后,函数调用就可以传入任意的关键字参数key=value如果函数体代码的执行需要依赖某个key,就必须在函数内进行判断defregister(name,age,**kwargs):if'sex'inkwargs:#有sex参数passif'heig......
  • 关键字 开发-11 yaml文件中添加fixture功能
    前言每一条pytest用例都可以添加fixture的前置功能,只需要在用例的参数中传入在conftest.py文件中写的函数的名称就可以实现每条用例的前置和后置。1.yaml文件中加入fixture的功能因为我们实现了动态生成测试用例,所以我们可以直接通过在生成动态用例的时候就传入该fixture函数......
  • ConcurrentModificationException日志关键字报警引发的思考
    本文将记录和分析日志中的ConcurrentModificationException关键字报警,还有一些我的思考,希望对大家有帮助。一、背景近期,在日常的日志关键字报警分析时,发现我负责的一个电商核心系统在某时段存在较多ConcurrentModificationException异常日志,遂进行分析和改进,下面是我的一些思考......
  • friend关键字扩展
    文章参考:爱编程的大丙(subingwen.cn)1.语法改进在C++98中,如果想要声明类B是类A的友元类,需要class关键字,而在C++11中,可以省略关键字class,还可以使用别名。EG:C++98中:classB;classA{friendclassB; //将B声明为A的友元private:intnum;}classB{priv......
  • 关键字 开发-10 封装引用自定义函数变量
    前言前面在yaml文件中引用内置函数以及自定义函数和变量时,都是在每个关键字后面进行单独得渲染,为了方便引用,于是我们单独对这块的内容进行封装。1.新增自定义函数和变量在utils下新建自定义函数和变量的文件,my_builtins.py,新增了在接口中需要用到的一些变量和函数。这样,在传......
  • [c语言]volatile关键字的作用
    volatile描述volatile是C和C++都支持的一个关键字,是一种类型修饰符。这个关键字被设计用来告诉编译器,一个变量可能会在程序之外被改变,例如,它可能被中断服务程序修改,或者它可能映射到一个硬件寄存器,这个寄存器的值可能由硬件改变。因此,编译器不应对涉及volatile变量的操作进行优化,......
  • java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候
    java中的关键字transient,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化这个关键字的作用其实我在写java的序列化机制中曾经写过,不过那时候只是简单地认识,只要其简单的用法,没有深入的去分析。这篇文章就是去深入分析一下transient关键字。先......
  • Extraneous children found when component already has explicitly named default sl
    下述代码会报错:Extraneouschildrenfoundwhencomponentalreadyhasexplicitlynameddefaultslot.Thesechildrenwillbeignored.<el-table-columnprop="goodsState"label="商品状态"width="120"/><template#default="......
  • 使用new关键字,是用来调用这个对象,并给了一个新名字和内存
    new关键字是用于创建对象的关键字。它会分配内存并初始化对象。当我们使用new关键字创建对象时,会自动调用该对象的构造方法。构造方法可以用于初始化类的属性,并为对象分配内存。例如,以下代码定义了一个Person类:publicclassPerson{   privateStringname;   private......