zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Mysql经常使用函数
    ZOJ 3690 Choosing number
    cocos2d-x 多触点监听
    ansible不配ssh连接,用户密码登录
    Ansible Role
    关闭centos自动升级内核
    让外部网络访问K8S service的四种方式
    Hadoop实战:Hadoop分布式集群部署(一)
    Docker:搭建私有仓库(Registry 2.4)
    Docker下的Spring Cloud三部曲之一:极速体验
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/3671972.html
Copyright © 2011-2022 走看看