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

  C++ 为类(Class)提供了许多默认函数。如果自己没有申明,编译器会为我们提供一个copy构造函数、一个copy assignment操作符一个析构函数。此外,如果没有申明任何构造函数,编译器会为我们申明一个default构造函数。很像下面的Empty类:

1 class Empty{
2     public:
3         Empty();
4         Empty(const Empty &rhs);
5         ~Empty();
6         Empty& operator=(const Empty &rhs);
7 };

   就像Effective C++说的,如果不想使用编译器自动生成的函数,就应该明确拒绝。

1.C++中的隐式构造函数

  如果c++类的其中一个构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。

2.Explicit Constructors显式构造函数

  为了避免上面提到的只有一个参数的构造函数采用的缺省转换操作,在构造函数前,使用Explicit 关键字修饰即可。

3.如下面的例子:

 1 #include <iostream>
 2 using namespace std;
 3 class B{
 4     public:
 5         int data;
 6         B(int _data):data(_data){}
 7         //explicit B(int _data):data(_data){}
 8 };
 9
10 int main(){
11     B temp=5;
12     cout<<temp.data<<endl;
13     return 0;
14 }

  程序第11行,将int转换为B类型的对象,就是使用了隐式构造函数。因为B中存在一个只有一个参数的构造函数,且参数类型也是int。

  如果在构造函数前加explicit ,表示为显示构造函数,则第11行编译不能通过。因为这时,就没有隐式构造函数啦。

 

参考:http://blog.csdn.net/smilelance/article/details/1528737

时间: 2024-10-02 19:32:03

C++ Explicit Constructors(显式构造函数)的相关文章

缺省构造函数不能处理隐式超构造函数抛出的异常类型 IOException。必须定义显式构造函数

问题描述 缺省构造函数不能处理隐式超构造函数抛出的异常类型 IOException.必须定义显式构造函数 int lastnum = getNum(source.getProperty(""fileName"")); public static int getNum(String Filename) throws IOException { InputStream myxls; myxls = new FileInputStream(Filename); sr =

Visual Basic 2005在语言上的增强(十三)显式的数组范围及小结

visual|数组 显式的数组范围 你现在可以使用显式的数组范围来声明数组,这样的声明更加清晰可读了:Dim a(10) As Integer '旧方式Dim b(0 To 10) As Integer '新方式 Visual Basic中的数组范围仍然是以零为起始,所以如果你想声明一个不是以零为起始范围的数组,你就会得到一个编译器错误. 小结 Visual Basic 2005语言获得了一些重要的特性以及诸多细微的增强,这些都极大地提高了它的易用性和开发人员的生产效率.这个语言变得更加完善,并

显式锁(第十三章)

显式锁 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:ReentrantLock.ReentrantLock并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能. 1. Lock接口与ReentrantLock Lock提供了一种无条件的.可轮询的.定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显示的. Lock接口: public interface Lock

详解在C++中显式默认设置的函数和已删除的函数的方法_C 语言

在 C++11 中,默认函数和已删除函数使你可以显式控制是否自动生成特殊成员函数.已删除的函数还可为您提供简单语言,以防止所有类型的函数(特殊成员函数和普通成员函数以及非成员函数)的参数中出现有问题的类型提升,这会导致意外的函数调用. 显式默认设置的函数和已删除函数的好处 在 C++ 中,如果某个类型未声明它本身,则编译器将自动为该类型生成默认构造函数.复制构造函数.复制赋值运算符和析构函数.这些函数称为特殊成员函数,它们使 C++ 中的简单用户定义类型的行为如同 C 中的结构.也就是说,可以创

《C++编程规范:101条规则、准则与最佳实践》——2.9 确保资源为对象所拥有。使用显式的RAII和智能指针

2.9 确保资源为对象所拥有.使用显式的RAII和智能指针 摘要利器在手,不要再徒手为之:C++的"资源获取即初始化"(Resource Acquisition Is Initialization,RAII)惯用法是正确处理资源的利器.RAII使编译器能够提供强大且自动的保证,这在其他语言中可是需要脆弱的手工编写的惯用法才能实现的.分配原始资源的时候,应该立即将其传递给属主对象.永远不要在一条语句中分配一个以上的资源. 讨论C++语言所强制施行的构造函数/析构函数对称反映了资源获取/释

显式地释放你的ADO对象

ado|对象 在真实的生活里,程序员天生懒惰. 这个事实使我们经常深陷BUG的泥塘. 尤其是当用ASP处理数据库连接时,它将让你感觉身处油锅. 在ASP里,我们建立数据库连接,然后用ADO获得数据查询的结果; 我们最常用到的是ADODB.Connection和ADODB.Recordset. 让我们看一个简单的例子来了解一下如何使用这两个对象: Dim objConnSet objConn = Server.CreateObject("ADODB.Connection")objConn

oracle显式授权和隐式授权

oracle对象的授权 Oracle授权 一.授权语法 GRANT语法: 1.显式授权(直接将对象授权给用户) GRANT privilege [, ...] ON object [, ...]  TO  { Public| Group | Username|role} [WITH GRANT OPTION ] 例子grant read,write on directory dir_home to public 2.隐式授权(通过将角色授权给用户) GRANT role TO  { Public

IPtables的显式扩展规则

对于显式扩展与隐式扩展的区别,先分析以下2条规则 规则1:iptables -t filter -A INPUT -s 192.168.1.0/24 -d 172.16.100.1 -p udp –dport 53 -j DROP 规则2:iptables -t filter -A INPUT -s 192.168.1.0/24 -d 172.16.100.1 -p udp -m udp –dport 53 -j DROP 相对于规则1,在规则2上使用了-m选项,明确指定了对udp进行扩展,扩展

C#的显式类型转换

显式类型转换,又叫强制类型转换.与隐式转换正好相反,显式转换需要用户明确地指定转换的类型.比如下面的例子把一个类型显式转换为类型: long l=5000; int i=(int)l; 上一章介绍的拆箱转换就是一种显式转换.这里我们还将讲解以下转换的规则: ●显式数值转换 ●显式枚举转换 ●显式引用转换 显式转换可以发生在表达式的计算过程中.它并不是总能成功,而且常常可能引起信息丢失. 显式转换包括所有的隐式转换,也就是说把任何系统允许的隐式转换写成显式转换的形式都是允许的,如: int i=1