`
chriszeng87
  • 浏览: 738615 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++ explicit构造函数

    博客分类:
  • C++
C++ 
阅读更多

转自:http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html

 

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
class String {
String ( const char* p ); // 用C风格的字符串p作为初始化值
//…
}
String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”);
 
但是有的时候可能会不需要这种隐式转换,如下:
class String {
       String ( int n ); //本意是预先分配n个字节给字符串
String ( const char* p ); // 用C风格的字符串p作为初始化值
//…
}
 
下面两种写法比较正常:
String s2 ( 10 );   //OK 分配10个字节的空字符串
String s3 = String ( 10 ); //OK 分配10个字节的空字符串
 
下面两种写法就比较疑惑了:
String s4 = 10; //编译通过,也是分配10个字节的空字符串
String s5 = ‘a’; //编译通过,分配int(‘a’)个字节的空字符串
 
s4 和s5 分别把一个int型和char型,隐式转换成了分配若干字节的空字符串,容易令人误解。
为了避免这种错误的发生,我们可以声明显示的转换,使用explicit 关键字:
class String {
       explicit String ( int n ); //本意是预先分配n个字节给字符串
String ( const char* p ); // 用C风格的字符串p作为初始化值
//…
}
加上explicit就抑制了String ( int n )的隐式转换,
 
下面两种写法仍然正确:
String s2 ( 10 );   //OK 分配10个字节的空字符串
String s3 = String ( 10 ); //OK 分配10个字节的空字符串
 
下面两种写法就不允许了:
String s4 = 10; //编译不通过,不允许隐式的转换
String s5 = ‘a’; //编译不通过,不允许隐式的转换
 
因此,某些时候,explicit 可以有效得防止构造函数的隐式转换带来的错误或者误解

----------------------------------------------------------
explicit   只对构造函数起作用,用来抑制隐式转换。如:   
  class   A   {   
          A(int   a);   
  };   
  int   Function(A   a);   
    
  当调用   Function(2)   的时候,2   会隐式转换为   A   类型。这种情况常常不是程序员想要的结果,所以,要避免之,就可以这样写:   
    
  class   A   {   
          explicit   A(int   a);   
  };   
  int   Function(A   a);   
    
  这样,当调用   Function(2)   的时候,编译器会给出错误信息(除非   Function   有个以   int   为参数的重载形式),这就避免了在程序员毫不知情的情况下出现错误。

总结:explicit   只对构造函数起作用,用来抑制隐式转换。

参考:
http://blog.csdn.net/smilelance/archive/2007/03/14/1528737.aspx
http://topic.csdn.net/t/20040509/15/3046021.html
分享到:
评论

相关推荐

    C++ explicit构造函数实例解析

    在C++编程语言中,`explicit`关键字是一个非常重要的特性,它用于控制类的构造函数如何进行隐式类型转换。本文将深入探讨`explicit`构造函数的概念、作用以及如何避免潜在的编程错误。 首先,让我们理解什么是构造...

    c/c++拷贝构造函数和关键字explicit详解

    C++中的拷贝构造函数和关键字explicit详解 C++中的拷贝构造函数是一种特殊的构造函数,它用于初始化对象时拷贝另一个对象的内容。拷贝构造函数的格式为`Type::Type(const Type&)`,其中`Type`是类的名称。拷贝构造...

    c++类构造函数详解_.docx

    C++中的类构造函数是类的一个特殊成员函数,它的主要任务是对类的对象进行初始化。构造函数的名字与类名相同,且没有返回类型。当我们声明一个类的对象时,编译器会自动调用相应的构造函数来分配内存并初始化对象的...

    完全掌握C++编程中构造函数使用的超级学习教程

    显式构造函数通过使用`explicit`关键字来防止隐式类型转换,防止可能导致意外行为的自动类型转换。例如,如果`Box`有一个接受单个整数参数的构造函数,显式构造函数可以防止像`Box b = 42;`这样的隐式转换。 7. ...

    C++构造函数详解及显式调用构造函数.doc

    C++中的构造函数是类的一个特殊成员函数,其主要任务是初始化对象的数据成员。当我们创建一个类的实例时,构造函数会被自动调用,确保对象在使用前处于正确的初始状态。下面将详细解释构造函数的种类及其作用。 1. ...

    浅谈C++ Explicit Constructors(显式构造函数)

    C++中的显式构造函数(Explicit Constructors)是编程实践中一个重要的概念,主要用来控制类对象的隐式类型转换。在C++中,如果一个类有一个只接受一个参数的构造函数,那么这个构造函数可以被用来进行隐式类型转换...

    C++中explicit作用示例代码

    在C++编程语言中,`explicit`关键字是一个非常重要的特性,它主要用于控制构造函数的隐式类型转换。本文将深入探讨`explicit`的作用,并通过示例代码帮助理解其工作原理。 `explicit`关键字用于声明单参数构造函数...

    C++笔记?explicit构造函数

    按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:  class String {  String ( const char* p ); // 用C风格的字符串p作为初始化值  /...

    C++ 类的构造函数详解及实例

    在C++编程语言中,类的构造函数是至关重要的,它是用来初始化类对象的特殊成员函数。构造函数的名称与类名相同,并且没有返回类型。在这个【标题】"C++ 类的构造函数详解及实例"中,我们将深入探讨构造函数的几个...

    C++ Explicit关键字详细解析

    在C++编程语言中,`explicit`关键字是一个非常重要的特性,它主要用于控制类的构造函数如何参与类型转换。本文将详细解析`explicit`关键字的用途、意义以及它如何影响类对象的创建和赋值。 `explicit`关键字用于...

    C++ explicit关键字的应用方法详细讲解

    在C++编程语言中,`explicit`关键字是一个非常重要的特性,它主要用于控制类的构造函数的行为,特别是涉及类型转换的情况。`explicit`关键字用来修饰单参数构造函数,目的是防止编译器进行隐式类型转换,从而避免...

    C++中explict关键字用法

    在C++编程语言中,`explicit`关键字是一个重要的特性,用于控制类的构造函数的隐式类型转换。这个关键字主要用于防止编译器自动执行单参数构造函数的隐式转换,从而减少潜在的错误和混淆。下面我们将深入探讨`...

    C++与操作系统等面试题9

    ### C++构造函数详解 #### 一、构造函数概述 构造函数是一种特殊的成员函数,用于初始化对象中的数据成员。在创建对象时,编译器自动调用相应的构造函数来完成对象成员变量的初始化过程。 #### 二、无参数构造...

    C++类与继承.docx

    在类型转换方面,C++允许通过构造函数实现隐式类型转换,但如果不需要这种转换,可以使用explicit关键字来禁止。例如,`explicit Stonewt(double lbs)`这样的构造函数就不会自动将double转换为Stonewt对象。如果需要...

    C++箴言:资源管理类的拷贝行为

    除了拷贝构造函数和拷贝赋值运算符外,资源管理类还可以支持移动语义,即移动构造函数和移动赋值运算符。移动语义允许资源从一个对象移动到另一个对象,而不是复制。这在某些情况下是非常有用的,尤其是在资源非常...

Global site tag (gtag.js) - Google Analytics