博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从一个面试题开始学习C++类基础
阅读量:6528 次
发布时间:2019-06-24

本文共 1643 字,大约阅读时间需要 5 分钟。

  前几天一个朋友参加了一个C++的面试,在面试后,他给我发了一个面试题,然后本屌用仅有的一点C++基础,开始了我的关于类的基础学习。题目大致是以下这样的:有一个类A,在main函数调用完之后,会打印哪些信息。考点应该就是类的静态成员和构造函数。

代码如下:

class A{public:    static int m_iCount;        A(){
++m_iCount;} ~A(){--m_iCount; print();} void print() { cout << "m_iCount = " << m_iCount << endl; } };int A::m_iCount = 0;A func(A aa){ aa.print(); return aa;} int main(int argc, char *argv[]){ A a1; a1.print(); A a2 = func(a1); a2.print(); return 0;}

首先,我将以上代码运行,发现和我预想中的大不一样,打印的信息明显比我预想的答案多。运行结果如下:

经过一番对比我怀疑问题出在了

A a2 = func(a1);

这行代码上。于是我一边增加代码一边调试,类A中增加了拷贝构造函数和赋值操作符,最终形成了以下的代码:

class A{public:    static int m_iCount;        A(){
++m_iCount;} ~A() { --m_iCount; print(); } A(const A& ca) { cout << "in const" << endl; } A& operator = (const A& ca) { cout << "in operator" << endl; } void print() { cout << "m_iCount = " << m_iCount << endl; } };int A::m_iCount = 0;A func(A aa){ cout << "in func" << endl; aa.print(); cout << "out func" << endl; return aa;} int main(int argc, char *argv[]){ A a1; cout << "a1 print start" << endl; a1.print(); cout << "a1 print end" << endl; A a2 = func(a1); //方法一 //以下两行是方法二 //A a2; //a2 = func(a1); cout << "a2 print start" << endl; a2.print(); cout << "a2 print end" << endl; return 0;}

然后我又运行了以上代码,其中有方法一和方法两种调用func函数,发现方法二会多调用一次析构函数,这一点我还是没有搞明白。希望哪位大神能帮我解惑一下。

方法一运行结果如下(划红线的两行结果是在调用完func函数前打印的):

方法二运行结果如下(多调用了一次析构函数,而且为什么是先调用了赋值操作符,然后是连续两次析构):

以上疑惑希望大神能不吝赐教。

转载于:https://www.cnblogs.com/dongshanzhishi/p/5496458.html

你可能感兴趣的文章
JDK 1.7+Android SDK+IntelliJ IDEA 13+Genymotion 安卓开发环境部署
查看>>
钓鱼邮件***防范指南
查看>>
session_start()放置位置的不正确引发的ROOT常量 未定义的错误
查看>>
如何设定VDP同时备份的任务数?
查看>>
ipsec的***在企业网中的经典应用
查看>>
过来人谈《去360还是留在百度?》
查看>>
mysql备份工具innobackupex,xtrabackup-2.1安装,参数详解
查看>>
【复制】slave筛选复制之二(create/drop table语句)
查看>>
Movie Store OpenCart 自适应主题模板 ABC-0249
查看>>
mytop-MySQL监控工具
查看>>
RedHat linux YUM本地制作源
查看>>
apache端口占用问题
查看>>
本地Office Project计划表同步到SharePoint2013任务列表的权限问题
查看>>
Windows2008 R2 GAC权限问题
查看>>
洛谷——P1469 找筷子
查看>>
几句话就能让你明白:网络地址转换(NAT)
查看>>
springboot项目自定义注解实现的多数据源切换
查看>>
如何用javascript正则表达式验证身份证号码是否合法
查看>>
ccf 201803-1 跳一跳(Python实现)
查看>>
特此说明
查看>>