美文网首页
C++隐式类型转换的问题及explicit关键字

C++隐式类型转换的问题及explicit关键字

作者: 突击手平头哥 | 来源:发表于2019-10-23 20:24 被阅读0次

C++隐式类型转换的问题

什么是隐式类型转换?

可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换。

  隐式类型转换指的是, 假设一个类的构造函数只有一个参数(或者除第一个以外都有默认值); 我们可以进行一个从构造参数类型到该类类型的编译器自动转换

代码

class A
{
public:
    A(int a) {
        printf("%s\n", "构造函数");
    }
};

void fun(A a)
{

}

int main()
{
    A a = 3;
    fun(1);
    return 0;
}

fun函数的参数是A, 但是因为我们存在一个以int类型的构造函数, 所以会进行一次隐式转换
这里的隐式转换并没有什么问题, 但是这种由编译器进行的隐式的转换, 如果非必要应当禁止

explicit关键字

class A
{
public:
    explicit A(int a) {
        printf("%s\n", "构造函数");
    }
};

void fun(A a)
{

}

int main()
{
    A a = 3;
    fun(1);
    return 0;
}

编译无法通过, 但是还是可以通过A(1)的方式创建

总结

  • 1 explicit关键字仅能用于类内部的构造函数, 可以不加该关键字, 但是需要注意可能隐藏的问题
  • 2 构造函数可以拥有多个形参, 但是必须可以只使用一个实参进行调用

扩展

  在了解到拷贝构造函数和赋值运算符重载后, 我们应该会想到如果给一个函数传入一个类的实例的话, 比如fun(A); 那么实际进行的是拷贝赋值还是调用的是赋值运算符呢? 我们知道C语言进行的就是简单的赋值.

答案: 拷贝构造函数; 事实上赋值运算符不会创建对象, 如果使用的是赋值运算符的话必然需要进行两次构造实例, 这是很不合理的. 同时我们可以知道默认就会创建一个拷贝构造函数

相关文章

  • C++隐式类型转换的问题及explicit关键字

    C++隐式类型转换的问题 什么是隐式类型转换? 可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型...

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

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

  • explicit

    C++提供了[关键字]explicit,可以阻止不应该允许的经过[转换构造函数]进行的隐式转换的发生。声明为exp...

  • C++ explicit关键字的初步研究

    explicit关键字用于修饰构造函数,它不允许构造函数的参数进行隐式的类型转换。构造函数参数的隐式转换有时候很方...

  • c++的一些不常见关键字

    1. explicit关键字 explicit用来防止由构造函数定义的隐式转换,比如:class Base bas...

  • C++构造函数前面添加explicit关键字的作用

    C++中的 explicit关键字主要是用来修饰类的构造函数,表明该构造函数是显式的,禁止单参数构造函数的隐式转换...

  • 数据类型转换

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

  • C++类型转换

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

  • C++ explicit关键字与隐式类型转换

    C++ explicit关键字只能用于类内部的构造函数的声明上,且只能作用于“单个参数的构造函数”或“有多个参数,...

  • C++隐式类类型转换及explicit关键字的使用

    1. 隐式类型转换 C/C++中基本类型的自动类型转换是经常见到的情形, 例如下边的代码: 其实,这就是一种隐式类...

网友评论

      本文标题:C++隐式类型转换的问题及explicit关键字

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