【No.7 C++对象的构造与析构时间】
生活随笔
收集整理的這篇文章主要介紹了
【No.7 C++对象的构造与析构时间】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
==【注意】==
程序語言只是我們與計算機交流并讓計算機實現我們創造性思想的工具,可以并鼓勵深入掌握一門語言,但千萬別沉迷于鉆某種語言的牛角尖,一定要把握好二者間的度
本帖屬不定時連載貼,以試卷的形式提出一個比較基礎的問題供大家思考討論,問題的解析將在下一更新貼中一并給出,這樣做是希望還不清楚問題的朋友有自己思考和討論的時間,希望大家能從這些帖子中有所收獲。
貼中問題屬我在學習C\C++過程中遇到的一些語法或者比較隱晦的程序問題,其中有自己的總結,也不乏網絡上搜索到的經典解析,在此分享給大家,希望能起到拋磚引玉的作用
我已認真檢查過自己的帖子,但難免有疏忽,如大家在閱讀過程中仍發現有問題,請及時通知,我會及時更正,以免誤導大家,萬分感謝^_^
【No.7??C++對象的構造與析構時間】
由于連載形式,每帖第二部分都配有上一問題的解答。為了保持帖子的針對性和一致性,此貼僅供交流討論本次問題,若大家對上一問題有任何疑問,請通過解答末尾的傳送鏈接前往該問題貼回復討論
[問題No.7]
請寫出以下代碼的執行結果 復制內容到剪貼板
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;
}
No.6 switch的陷阱淺析 輸出結果
0
問題淺析
本題出錯,大多是由于初學者自己主觀臆斷switch-case塊的執行方式,此題中,i == 1,有的午飯就主觀地認為case 1:分支被執行,x = 5,然后輸出為5.但是,switch-case語句的陷阱就在這里,case分支不是if-else這樣的非此即彼的判斷語句,case只是一個入口,i == 1時,找到入口case 1:,因此執行這個入口之后的所有語句,直到swtich語句塊結束。
那么如何杜絕此問題的發生呢?見如下代碼
復制內容到剪貼板
{
??case 1: x = 5; break;
??case 2: ++x; break;
??case 3: ++x; break;
??default: break;
}
程序語言只是我們與計算機交流并讓計算機實現我們創造性思想的工具,可以并鼓勵深入掌握一門語言,但千萬別沉迷于鉆某種語言的牛角尖,一定要把握好二者間的度
本帖屬不定時連載貼,以試卷的形式提出一個比較基礎的問題供大家思考討論,問題的解析將在下一更新貼中一并給出,這樣做是希望還不清楚問題的朋友有自己思考和討論的時間,希望大家能從這些帖子中有所收獲。
貼中問題屬我在學習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;
}
No.6 switch的陷阱淺析 輸出結果
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,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的【No.7 C++对象的构造与析构时间】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片压缩上传Thumbnailator
- 下一篇: [从C到C++] 1.3 C++布尔类型