有如下一个简单的复数类:

class ClxComplex
{
public:
ClxComplex(double dReal = 0.0, double dImage = 0.0) { m_dReal = dReal; dImage = dImage; } double GetReal() const { return m_dReal; }
double GetImage() const { return m_dImage; } private:
double m_dReal;
double m_dImage;
};

我们知道,下面的3行代码是等价的:

ClxComplex lxTest = 2.0;
ClxComplex lxTest = ClxComplex(2.0);
ClxComplex lxTest = ClxComplex(2.0, 0.0);

其实,对于前两行来说,编译器都是把它们转换成第3行的代码来实现的。因为我们写了构造函数,编译器就按照我们的构造函数来进行隐式转换,直接把一个double数值隐式转换成了一个ClxComplex的对象。可是,有些时候,我们不希望进行隐式转换,或者隐式转换会造成错误。比如下面的一个简化的字符串类:

class ClxString
{
public:
ClxString(int iLength);
ClxString(const char *pString);
~ClxString(); private:
char *m_pString;
}; ClxString::ClxString(int iLength)
{
if (iLength > )
m_pString = new char[iLength];
} ClxString::ClxString(const char *pString)
{
m_pString = new char[strlen(pString)];
strcpy(m_pString, pString);
} ClxString::~ClxString()
{
if (m_pString != NULL)
delete m_pString;
}

我们可以用字符串的长度来初始化一个ClxString的对象,但是我们却不希望看到下面的代码:

ClxString lxTest = ;  // 等同于ClxString lxTest = ClxString(13);

这会给阅读代码造成不必要的歧义。

还有,我们知道下面的代码是用字符串A来初始化一个ClxString的对象:

ClxString lxTest = "A";  // 等同于ClxString lxTest = ClxString("A");

可是,如果有人写成:

ClxString lxTest = 'A';  // 等同于ClxString lxTest = ClxString(65);

那上面的代码就会初始化一个长度为65(字母A的ASCII码值,在C和C++中,字符是以ASCII值存储的)的字符串。

当然,上面的情况都不是我们希望看到的。在这个时候我们就要用到显示构造函数了。
    将构造函数声明成explicit就可以防止隐式转换。
    下面是使用显示构造函数的ClxString:

class ClxString
{
public:
explicit ClxString(int iLength);
ClxString(const char *pString);
~ClxString(); private:
char *m_pString;
};

在这种情况下,要想用字符串的长度来初始化一个ClxString对象,那就必须显示的调用构造函数:

ClxString lxTest = ClxString();

而下面这些代码将不能通过编译。

ClxString lxTest = ;
ClxString lxTest = 'A';

C++中的显式构造函数的更多相关文章

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

    C++ 为类(Class)提供了许多默认函数.如果自己没有申明,编译器会为我们提供一个copy构造函数.一个copy assignment操作符和一个析构函数.此外,如果没有申明任何构造函数,编译器会 ...

  2. Spring装配bean(在java中进行显式配置)

    1.简单介绍 Spring提供了三种装配机制: 1.在XML中进行显式配置: 2.在java中进行显式配置: 3.隐式的bean发现机制和自动装配. 其中,1和3项在项目中经常使用,而在java中进行 ...

  3. C++学习笔记16,C++11中的显式的默认构造函数以及显示删除默认构造函数

    在早期的C++中.假设须要一些接受一些參数的构造函数,同一时候须要一个不接收不论什么參数的默认构造函数.就必须显示地编写空的默认构造函数.比如: //tc.h class A{ private: in ...

  4. Java :构造器中的显式参数和this隐式参数

    1.构造器 写一个Java类,首先要先从构造器开始,构造器与类同名,在构造类的对象时会先从构造器开始. 构造器总是伴随着new操作符的执行而被调用. 构造器主要是用来初始化类的实例域. 构造器的特点: ...

  5. C++中的显式类型转化

    类型转化也许大家并不陌生,int i; float j; j = (float)i; i = (int)j; 像这样的显式转化其实很常见,强制类型转换可能会丢失部分数据,所以如果不加(int)做强制转 ...

  6. 【RS】CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Collaborative Filtering-CoupledCF:在推荐系统深度协作过滤中学习显式和隐式的用户物品耦合

    [论文标题]CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Colla ...

  7. 008.在C#中,显式接口VS隐式接口

    原文http://www.codeproject.com/Articles/1000374/Explicit-Interface-VS-Implicit-Interface-in-Csharp (At ...

  8. selenium-webdriver中的显式等待与隐式等待

    在selenium-webdriver中等待的方式简单可以概括为三种: 1 导入time包,调用time.sleep()的方法传入时间,这种方式也叫强制等待,固定死等一个时间 2 隐式等待,直接调用i ...

  9. TCP/IP网络中的显式拥塞通告(ECN)

    当前的TCP 实现将TCP 端节点之间的中间网络视为一个不透明的"黑盒".TCP 包进入和流出这个盒子.有些时候进入盒子的包被丢失了.因为今天的数字和光媒体上出现比特级错误的机会非 ...

随机推荐

  1. centos No module named setuptools解决方案

    wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz tar zxvf setuptool ...

  2. uva live 12846 A Daisy Puzzle Game

    假设下一个状态有必败.那么此时状态一定是必胜,否则此时状态一定是必败 状压DP #include<iostream> #include<map> #include<str ...

  3. Office EXCEL 如何将复制的一堆数据按空格断开

    1 复制粘贴一堆数据,点击数据-分类,然后点击下一步   2 一直下一步   3 最后效果如下图所示  

  4. USACO castle

    <pre name="code" class="cpp"><pre>USER: Kevin Samuel [kevin_s1] TASK ...

  5. mtk刷机错误汇总

    MTK常见错误解读与解决方法: 1.刷机过了红条,到了紫色条卡住.(错误代码4008) 解决方法:这种情况出现的话,大家可以把电池拿下来,然后重新安装上,进入REC后选择关机.然后重新刷. 2.驱动安 ...

  6. Mongodb for PHP教程之数据操作

    Mongodb的常用操作 参看手册,php官方的http://us2.php.net/manual/en/mongo.manual.php 也可以参看mongodb官方的教程 数据库连接 ⑴默认格式 ...

  7. 【SICP练习】149 练习4.5

    练习4-5 原文 Exercise 4.5. Scheme allows an additional syntax for cond clauses, ( => ). If evaluates ...

  8. maven 项目 spring mvc + jdbc 配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. ubuntu字符界面下显示中文和调整分辨率

    1.sudo apt-get install zhcon 2.vi /etc/zhcon.conf  修改下面两行 x_resolution 1024 y_resolution 768 完成这两步后在 ...

  10. 设计模式-(6)适配器 (swift版)

    用来解决接口适配问题的三种模式:适配器模式,桥接模式,外观模式. 一,概念 适配器模式,将一个类的结构转换成用户希望的另一个接口,使得原本接口不兼容的类能在一起工作.换句话说,适配器模式就是链接两种不 ...