C++ - explicit在构造函数的使用 及 详解

explicit在构造函数的使用 及 详解


本文地址: http://blog.csdn.net/caroline_wendy/article/details/22727823


最近又到了招聘的季节, C++被问的问题就特别多, 最近同学问我explicit的含义, 我说直接看我的blog吧.

下面就是explicit的详解.


explicit的主要用法就是放在单参数的构造函数中,防止隐式转换, 导致函数的入口参数, 出现歧义.

如果可以使用A构造B, 未加explicit的构造函数, 当使用B进行参数处理时, 就可以使用A, 使得接口混乱.

为了避免这种情况, 使用explicit避免隐式构造, 只能通过显示(explicit)构造.

下面是代码, 仔细阅读必有收获, 可以试着删除explicit, 调用注释的语句.

/*************************************************
File: main.cpp
Copyright: C.L.Wang
Author: C.L.Wang
Date: 2014-04-01
Description: explicit
Email: morndragon@126.com
**************************************************/

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>

using namespace std;

class A {};

class B {
public:
  // conversion from A (constructor):
  explicit B (const A& x) {
	  std::cout << "B's constructor" << std::endl;
  }

  // conversion from A (assignment):
  B& operator= (const A& x) {
	  std::cout << "B's assignment" << std::endl;
	  return *this;
  }

  // conversion to A (type-cast operator)
  operator A() {
	  std::cout << "B's conversion" << std::endl;
	  return A();
  }
};

void fn (B arg) {
	std::cout << "function" << std::endl;
}

int main ()
{
  A foo;
  B bar(foo);
  //B bar = foo;    // calls constructor, 添加explicit出错, 不能默认构造
  //bar = foo;      // calls assignment
  //foo = bar;      // calls type-cast operator

  //fn(foo); //添加explicit出错, 就不能默认的隐式转换
  fn(bar);

  return 0;
}


输出:
B's constructor
function



  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Caroline S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值