首页 > 编程语言 >C++中的显式构造函数

C++中的显式构造函数

时间:2023-06-06 12:07:59浏览次数:34  
标签:ClxString lxTest ClxComplex double C++ pString 显式 构造函数

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

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  >   0 )
        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  =   13 ;   //  等同于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( 13 );

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

ClxString lxTest  =   13 ; 
ClxString lxTest  =   ' A ' ;

 



标签:ClxString,lxTest,ClxComplex,double,C++,pString,显式,构造函数
From: https://blog.51cto.com/u_4018548/6423434

相关文章

  • C++类构造函数、拷贝构造函数、复制构造函数、复制构造函数、构造函数显示调用和隐式
    一、构造函数是干什么的 1.2.{3.public:4.//类Counter的构造函数5.//特点:以类名作为函数名,无返回类型6.Counter()7.{8.0;9.}10.private:11.//数据成员12.intm_value;13.}      该类对......
  • C++智能指针的原理和实现
    一、智能指针起因在C++中,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete。new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针;delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。使用堆内存是非常频繁的操作,容易造成......
  • C++ 中的信号的处理
    C++ 信号处理信号是由操作系统传给进程的中断,会提早终止一个程序。在UNIX、LINUX、MacOSX或Windows系统上,可以通过按Ctrl+C产生中断。有些信号不能被程序捕获,但是下表所列信号可以在程序中捕获,并可以基于信号采取适当的动作。这些信号是定义在C++头文件<csignal>中。......
  • C#调用C++dll
    C#调用C++dll的方法和步骤其他分享涉及到的概念和方法对于像我这样比较菜的选手看起来比较费劲并且很难抓住重点,这里我总结了一段时间的研究成果供初学者救济之用,简单明了。工具/原料 VS2008方法/步骤 新建项目->VisualC++->Win32项目 MyDLL注意:C++编写的dll一般是不能直接拿来......
  • C#中调用c++的dll具体创建与调用步骤,亲测有效~ (待验证)
    使用的工具是VS2010哦~其他工具暂时还没试过我新建的工程名是my21dll,所以会生成2个同名文件。接下来需要改动的只有画横线的部分下面是my21dll.h里面的。。。下面的1是自动生成的不用动,或者也可以不要,因为只是一个宏而已下面可以做相应修改。下面的2是自动生成的类,我没用就注释掉了......
  • C++面试八股文:如何在堆上和栈上分配一块内存?
    某日二师兄参加XXX科技公司的C++工程师开发岗位6面:面试官:如何在堆上申请一块内存?二师兄:常用的方法有malloc,new等。面试官:两者有什么区别?二师兄:malloc是向操作系统申请一块内存,这块内存没有经过初始化,通常需要使用memset手动初始化。而new一般伴随三个动作,向操作系统申请一......
  • win10,vs2015深度学习目标检测YOLOV5+deepsort C++多目标跟踪代码实现,源码注释,拿来即
    int8,FP16等选择,而且拿来即用,自己再win10安装上驱动可以立即使用,不用在自己配置,支持答疑。自己辛苦整理的,求大佬打赏一顿饭钱。苦苦苦、平时比较比忙,自己后期会继续发布真实场景项目;欢迎下载。优点:1、架构清晰,yolov5和sort是分开单独写的,可以随意拆解拼接,都是对外接口。2、支持答疑......
  • c++
    因此,想要查看一个数组变量的地址,代码为:intarr[10];cout<<arr<<endl;//注意,arr之前无需&。查看数组中第一个元素的地址:intarr[10];cout<<&arr[0]<<endl;递归:递归的过程是压栈的过程,递归结束,会出栈进行计算二维数组:二维数组的存储是按照行进行扫描,每行的元素依......
  • C++设计模式:观察者模式
    观察者模式又叫做发布-订阅模式;观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动的更新自己。有两大类(主题和观察者)一共四个角色从上面我们可以看到,这里面包含了:(1)抽象主题/抽象......
  • 初遇C++(一)
    认识C++C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(objectorientedprogramming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,本贾......