c/c++整理--c++面向对象(5)

构造函数的使用

以下代码中的输出语句为0吗?为什么?

    #include <iostream>  using namespace std;  struct CLS  {  int m_i;  CLS(int i):m_i(i){ }  CLS()  {  CLS(0);  }  };  int main()  {  CLS obj;  cout<<obj.m_i<<endl;  return 0;  }  

在代码第11行,不带参数的构造函数调用了带参数的构造函数。这种调用往往被很多人误解,其实是不行的,而且往往会有副作用。可以加几条打印语句测试一下:

    #include <iostream>  using namespace std;  struct CLS  {  int m_i;  CLS(int i):m_i(i)  {  cout<<"CLS():this= "<<this<<endl;   }  CLS()  {  CLS(0);  cout<<"CLS():this= "<<this<<endl;   }  };  int main()  {  CLS obj;  cout<<"&obj= "<<&obj<<endl;  cout<<obj.m_i<<endl;  return 0;  }  
程序执行结果:
CLS():this= 0xbffa176c  
CLS():this= 0xbffa179c  
&obj= 0xbfe7391c  
7823348

可以看到,在带参数的构造函数里打印出来的对象地址和对象obj的地址不一致。实际上,代码14行的调用只是在栈上生成了一个临时对象,对于自己本身毫无影响。还可以发现,构造函数的相互调用引起的后果不是死循环,而是栈溢出。


构造函数explicit与普通构造函数的区别

explicit构造函数是用来防止隐式转换的。

    #include <iostream>  using namespace std;  class Test1 {  public:  Test1(int n) { num = n; }                       //普通构造函数  private:  int num;  };  class Test2 {  public:  explicit Test2(int n) { num = n; }              //explicit(显示)构造函数  private:  int num;  };  int main()  {  Test1 t1 = 12;                                  //隐式调用其构造函数,成功  Test2 t2 = 12;                                  //编译错误,不能隐式调用其构造函数  Test2 t3(12);                                   //显示调用成功  return 0;  }  

Test1的构造函数带一个int型参数,代码第21行会隐式转换成调用Test1的构造函数。而Test2的构造函数被声明为explicit(显示),这表示不能通过隐式转换来调用这个构造函数,因此22行编译错误。


explicit构造函数的作用

    #include <iostream>  using namespace std;  class Number {  public:  string type;  Number():type("void"){}  explicit Number(short):type("short") {}  Number(int):type("int"){ }  };  void show(const Number& n) { cout<<n.type<<endl; }  int main()  {  short s=42;  show(s);  return 0;  }  

show()函数的参数类型是Number类对象的引用,18行调用show(s)时采取了以下所示的步骤:

(1)show(s)中的s为short类型,其值为42,因此首先检查参数为short的构造函数能否被隐式转换。由于第9行的构造函数被声明为explicit(显示调用),因此不能隐式转换。于是进行下一步。

(2)42自动转换为int型。

(3)检查参数为int的构造函数能否被隐式转换。由于第10行参数为int的构造函数吗,没有被声明为显示调用,因此此构造函数临时构造出一个临时对象。

(4)打印上一步临时对象type的成员,即“int”


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西电网络攻防大赛--渗透测试第二题

地址&#xff1a;http://test.xdsec.org/1/ 使用google浏览器打开 点击Resources 找到cookie 发现key 不过也是加密的 猜测是base64加密 so&#xff0c;百度一个解密网站 就直接百度应用了 结果&#xff1a;g0NexTdo0r

非多态的继承情况下,基类指针可以指向派生类对象么?

class Base { // 基类 public:Base(int aa88) : a(aa) {}void f() { // 非virtualcout<<"Base"<<endl;}int a; }; class Derived : public Base { // 派生类 public:Derived(int ba 77, int bb 66) : a(ba), b(bb) {}void f() { // 非多态cout<<…

软件架构阅读笔记(引)

引&#xff1a; 软件架构的目的是发现软件的问题是什么&#xff0c;怎么解决。这些软件遇到的问题往往来自实际项目中。然而作为一个学生的我很少有机会接触实际是项目&#xff0c;所以阅读也是学习的一种方式。从他人的做法中&#xff0c;也可以学习到知识。 各大互联网公司架…

嘗試著去做

昨晚跟叔叔深談許久&#xff0c;得知一熟人開一小型印刷廠&#xff0c;現在需要一套進銷存的管理軟件。對於我本身就從事于這樣的工作崗位&#xff0c;聽及情況后也能明白其中的一些需求。於是決定通過自己的學習來嘗試著去開發一下這樣的軟件&#xff0c;藉助于公司目前使用的…

母函数题目

hdu 1028 Ignatius and the Princess III 母函数模板题 http://acm.hdu.edu.cn/showproblem.php?pid1028 题意&#xff1a; 整数的拆分。 母函数学习http://www.wutianqi.com/?p596 View Code #include <iostream> #include <cstdio> #include <cstring> …

c/c++整理--析构函数

c中虚析构函数的作用是什么&#xff1f;析构函数是为了在对象不被使用后释放它的资源&#xff0c;虚函数是为了实现多态。那么&#xff0c;把析构函数声明为virtual有什么作用呢&#xff1f; 请看下面代码&#xff1a;<span style"font-size:18px;">#include &…

多态情况下,怎么用基类指针去访问基类的虚函数?

class Base { // 基类 public:virtual void f() {cout<<"Base"<<endl;} }; class Derived : public Base { // 派生类 public:virtual void f() { // 最好加上该virtual cout<<"Derived"<<endl;} };int main(){Base* p new De…

2018-11-01 专栏一岁了-我为什么投身于普及用中文编程

知乎专栏于2017年11月9日开通, 之前只想写些中规中矩的年度小结, 但感觉有些东西不吐不快, 权当人生阶段报告吧. 最早对编程的接触在初中, 同学帮他家里玻璃厂写了个优化切割率的程序, 我看了点源码. 高中时想自学C未果. 00年大学志愿选了听起来和计算机很接近的信息工程专业, …

VB-VB.NET中 从字符串“XX”到类型“Double”的转换无效

最近在做一个vb.net写的一个网站&#xff0c;有一次同学有个问题问我&#xff0c;说程序总是抛出“从字符串“aa”到类型“Double”的转换无效”的错误。我过去一 看是个操作数据库的函数&#xff0c;我一开始想到的就是给参数赋值赋错了&#xff0c;引发的数据库的错误。然后就…

c++整理--函数重载

一、为什么C语言不支持函数重载而c能支持 什么是函数重载&#xff1f;为什么C语言不支持函数重载&#xff0c;而c能支持函数重载&#xff1f; 解析&#xff1a;函数重载是用来描述同名函数具有相同或者相似的功能&#xff0c;但数据类型或者是参数不同的函数管理操作。在C语言里…

Linux 灾难恢复 Linux 系统启动故障修复

#http://hi.baidu.com/winshining/item/3d964328e252b6cfdcf69aaa #http://www.verydemo.com/demo_c281_i514.html 简介&#xff1a; Linux 发行版本众多&#xff0c;现如今也得到了越来越广泛的应用&#xff0c;同时也面临着系统出现故障的潜在风险&#xff0c;本文将详细介绍…

EPOLLOUT/EPOLLIN事件触发的条件

1、EPOLLOUT事件触发的条件&#xff1f; (1)、一次write操作&#xff0c;写满了发送缓冲区&#xff0c;返回错误码为EAGAIN(11)。 (2)、对端读取了一些数据&#xff0c;又重新可写了&#xff0c;此时会触发EPOLLOUT。 简单地说&#xff1a;内核缓冲区由不可写变为可写时会触发…

08.Numpy数组迭代

一般迭代 NumPy包包含一个迭代器对象numpy.nditer。 它是一个有效的多维迭代器对象&#xff0c;可以用于在数组上进行迭代。 数组的每个元素可使用 Python的标准Iterator接口来访问。 使用arange()函数创建一个 3X4 数组&#xff0c;并使用nditer对它进行迭代。 示例 1 >>…

专家答疑:在ERP系统中确保销售订单准确性

若销售订单有错&#xff0c;如订单数量或者订单价格有问题的话&#xff0c;则会造成一系列的连锁反应。计划模块、采购模块、生产模块、库存模块等等都会受到牵连。而且最要命的是&#xff0c;很哪进行调整。所以&#xff0c;在ERP系统使用过程中&#xff0c;应该千方百计保障销…

hdfs为什么要用block以及block大小的设置

1、在HDFS里面&#xff0c;文件存储为什么要以Block块的方式存储&#xff1f; 目的&#xff1a;减少磁盘寻道的时间。 (1)、不设置block&#xff1a;因为数据是分散的存放磁盘上的&#xff0c;读取数据时需要不停的进行磁盘寻道&#xff0c;开销比较大。 (2)、使用block: 一次…

c++整理--虚函数

一、虚函数是这么实现的 解析&#xff1a;简单的说&#xff0c;虚函数是通过虚函数表实现的&#xff0c;那么什么是虚函数表呢&#xff1f;事实上&#xff0c;如果一个类中含有虚函数表&#xff0c;则系统会为这个类分配一个指针成员指向一张虚函数表&#xff08;vtbl&#xff…

[Linux] 命令行工具

1. 基本工具1.1 特殊字符shell的特殊字符有&#xff1a;&、;、|、*、?、、"、、[、]、(、)、$、<、>、{、}、^、#、/、\、%、!、~、。要将这些具有特殊含义的字符当作普通字符使用&#xff0c;可对它们转义使用&#xff0c;在特殊字符前加反斜杠" \ "…

【技术博客-总览--重要】

1 mayday05/technology-talk forked from aalansehaiyang/technology-talk https://github.com/mayday05/technology-talk/blob/master/middle-software/kafka.md 转载于:https://www.cnblogs.com/snowwhite/p/10504391.html

Python 代码调试技巧

Python 代码调试技巧 2012-5-3 简介&#xff1a; Debug 对于任何开发人员都是一项非常重要的技能&#xff0c;它能够帮助我们准确的定位错误&#xff0c;发现程序中的 bug。python 提供了一系列 debug 的工具和包&#xff0c;可供我们选择。本文将主要阐述如何利用 python debu…

谈谈JAVA中的安全发布

谈谈JAVA中的安全发布 昨天看到一篇文章阐述技术类资料的"等级"&#xff0c;看完之后很有共鸣。再加上最近在工作中越发觉得线程安全性的重要性和难以捉摸&#xff0c;又掏出了《Java并发编程实战》研读一番&#xff0c;这本书应该是属于为“JAVA 多线程作注解”的一…