【No.7 C++对象的构造与析构时间】

简介:
==【注意】==
程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度

本帖属不定时连载贴,以试卷的形式提出一个比较基础的问题供大家思考讨论,问题的解析将在下一更新贴中一并给出,这样做是希望还不清楚问题的朋友有自己思考和讨论的时间,希望大家能从这些帖子中有所收获。

贴中问题属我在学习C\C++过程中遇到的一些语法或者比较隐晦的程序问题,其中有自己的总结,也不乏网络上搜索到的经典解析,在此分享给大家,希望能起到抛砖引玉的作用

我已认真检查过自己的帖子,但难免有疏忽,如大家在阅读过程中仍发现有问题,请及时通知,我会及时更正,以免误导大家,万分感谢^_^



【No.7  C++对象的构造与析构时间】

由于连载形式,每帖第二部分都配有上一问题的解答。为了保持帖子的针对性和一致性, 此贴仅供交流讨论本次问题若大家对上一问题有任何疑问,请通过解答末尾的传送链接前往该问题贴回复讨论

[问题No.7]
请写出以下代码的执行结果
复制内容到剪贴板
代码:
#include<iostream>
using namespace std;

//-------------------------------------------------
class Foo
{
  public:
    Foo(void)
    {
      cout<<"constructing..."<<endl;
      ++_counter;
    }
    Foo(const Foo &p)
    {
      cout<<"copy constructor..."<<endl;
      ++_counter;
    }
    ~Foo(void){ cout<<"destructing..."<<endl; }
  
  public:
    static int _counter;
};

int Foo::_counter = 0;

//---------------------------------------------
Foo global;

Foo Trap(Foo foo)
{
  Foo local = foo;
  Foo *heap = new Foo(global);
  *heap = local;
  Foo pa[4] = { local, *heap };
  return *heap;
}

int main(int argc, char **argv)
{
  Foo p;
  Trap(p);

  cout<<Foo::_counter<<endl;

  return EXIT_SUCCESS;
}
输出结果
0

问题浅析
本题出错,大多是由于初学者自己主观臆断switch-case块的执行方式,此题中,i == 1,有的午饭就主观地认为case 1:分支被执行,x = 5,然后输出为5.但是,switch-case语句的陷阱就在这里,case分支不是if-else这样的非此即彼的判断语句,case只是一个入口,i == 1时,找到入口case 1:,因此执行这个入口之后的所有语句,直到swtich语句块结束。
那么如何杜绝此问题的发生呢?见如下代码
复制内容到剪贴板
代码:
swtich(i)
{
  case 1: x = 5; break;
  case 2: ++x; break;
  case 3: ++x; break;
  default: break;
}

只要执行了一条分支语句就break出switch语句块,这样就实现了我们之前臆断的程序功能,并且,如果不是有意要执行多个case分支,请时刻记住,每一个case分支(包括default)后都应该填上break语句,并且不管你有没有必要写default分支,也请写上,并break,这样做是是程序的可读性得到保障, 以免别的程序员误以为你忘记了default情况的处理。



     本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/733265,如需转载请自行联系原作者







相关文章
|
编译器 程序员 C++
21 C++ - 对象的构造和析构
21 C++ - 对象的构造和析构
70 0
|
编译器 C++
【C++基础(六)】类和对象(中) --构造,析构函数
【C++基础(六)】类和对象(中) --构造,析构函数
【C++基础(六)】类和对象(中) --构造,析构函数
|
7月前
|
数据安全/隐私保护 C++
C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
C++中的构造函数是特殊成员函数,用于对象初始化。类型包括默认构造函数(无参数)、带参数构造函数、拷贝构造函数和移动构造函数。默认构造函数设置对象默认状态,带参数构造函数允许传递初始化值。拷贝构造函数复制已有对象,移动构造函数高效转移资源。构造函数的访问权限可控制为public、private或protected。理解构造函数有助于编写健壮的C++代码。关注公众号`Let us Coding`获取更多内容。
103 0
|
7月前
|
C++
3. C++构造和析构
3. C++构造和析构
48 0
|
算法 C语言 C++
C++构造和析构
C++构造和析构
|
编译器 C++
23 C++ - 多个对象构造和析构
23 C++ - 多个对象构造和析构
43 0
|
存储 算法 编译器
【C++技能树】类的六个成员函数Ⅰ --构造、析构、拷贝构造函数
在开始本章内容之前,先浅浅的了解一下this指针的概念.这对理解后面的内容有着很大的帮助.
99 0
【C++】 --- 继承中的构造和析构
【C++】 --- 继承中的构造和析构
99 0
|
存储 IDE 开发工具
c++构造和析构
c++构造和析构
|
C++
C++多态之析构和纯虚析构分析与示例
虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: • 可以解决父类指针释放子类对象 • 都需要有具体的函数实现 虚析构和纯虚析构区别: • 如果是纯虚析构,该类属于抽象类,无法实例化对象
220 0
C++多态之析构和纯虚析构分析与示例