摘要:函數(shù)又稱主函數(shù),是程序執(zhí)行的起點(diǎn)。類的構(gòu)造函數(shù)是類的一種特殊的成員函數(shù),它會(huì)在每次創(chuàng)建類的新對(duì)象時(shí)執(zhí)行。構(gòu)造函數(shù)可用于為某些成員變量設(shè)置初始值。析構(gòu)函數(shù)有助于在跳出程序比如關(guān)閉文件釋放內(nèi)存等前釋放資源。
又稱主函數(shù),是程序執(zhí)行的起點(diǎn)。
那么,我們有辦法在 main 函數(shù)之前執(zhí)行代碼嗎?
答案是肯定的。
before_main.c
#include __attribute((constructor)) void before_main(){ printf("%s/n", __FUNCTION__);}int main(int argc, char **argv){ printf("%s/n", __FUNCTION__); return 0;}
編譯 && 執(zhí)行
$ gcc before_main.c -o before_main.out$ ./before_main.out before_mainmain
看到,先運(yùn)行 before_main(),再運(yùn)行 main()
GNU C 的一大特色就是 attribute 機(jī)制。attribute 可以設(shè)置函數(shù)屬性(Function Attribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute)。
__attribute__書寫特征是:attribute 前后都有兩個(gè)下劃線,并且后面會(huì)緊跟一對(duì)括弧,括弧里面是相應(yīng)的 attribute 參數(shù)。
constructor 屬性可以使函數(shù)在 main 函數(shù)之前執(zhí)行
再往底層想,C 語言中,main 函數(shù)是程序的入口點(diǎn)
這件事情本來就是 gcc 編譯器
決定的。那么 gcc 當(dāng)然可以指定任何函數(shù)作為程序的入口,這點(diǎn)在我之前寫的一篇文章《沒有了 main 函數(shù),程序還能跑嗎?》中也有介紹。
這里又是通過另一種方式來影響程序入口點(diǎn)的,即 __attribute((constructor))
方式。
不光有 constructor 屬性能夠?qū)崿F(xiàn)在 main 函數(shù)之前執(zhí)行代碼;還有屬性 destructor,能夠?qū)崿F(xiàn)在 main 函數(shù)之后執(zhí)行代碼。如下:
#include __attribute((constructor)) void before_main(){ printf("%s/n", __FUNCTION__);}__attribute((destructor)) void after_main(){ printf("%s/n", __FUNCTION__);}int main(int argc, char **argv){ printf("%s/n", __FUNCTION__); return 0;}
運(yùn)行
$ ./before_main.out before_mainmainafter_main
多像 C++ 中類的構(gòu)造函數(shù)和析構(gòu)函數(shù)啊。
類的
構(gòu)造函數(shù)
是類的一種特殊的成員函數(shù),它會(huì)在每次創(chuàng)建類的新對(duì)象時(shí)執(zhí)行。
構(gòu)造函數(shù)的名稱與類的名稱是完全相同的,并且不會(huì)返回任何類型,也不會(huì)返回 void。構(gòu)造函數(shù)可用于為某些成員變量設(shè)置初始值。
類的
析構(gòu)函數(shù)
是類的一種特殊的成員函數(shù),它會(huì)在每次刪除所創(chuàng)建的對(duì)象時(shí)執(zhí)行。
析構(gòu)函數(shù)的名稱與類的名稱是完全相同的,只是在前面加了個(gè)波浪號(hào)(~)作為前綴,它不會(huì)返回任何值,也不能帶有任何參數(shù)。析構(gòu)函數(shù)有助于在跳出程序(比如關(guān)閉文件、釋放內(nèi)存等)前釋放資源。
#include using namespace std;class Line {public: void setLength(double len); double getLength(void); Line(); // 這是構(gòu)造函數(shù)聲明 ~Line(); // 這是析構(gòu)函數(shù)聲明private: double length;};// 成員函數(shù)定義,構(gòu)造函數(shù)Line::Line(void){ cout << "Object is being created" << endl;}Line::~Line(void){ cout << "Object is being deleted" << endl;}void Line::setLength(double len){ length = len;}double Line::getLength(void){ return length;}int main(){ Line line; // 設(shè)置長度 line.setLength(6.0); cout << "Length of line : " << line.getLength() << endl; return 0;}
運(yùn)行
Object is being createdLength of line : 6Object is being deleted
學(xué)習(xí)的兩個(gè)好方法:縱向思考和橫向聯(lián)想。
縱向思考
能夠讓你認(rèn)清事物本身,讓你對(duì)事物的理解更加深刻、正確。
就像我們對(duì) C 語言的程序入口的思考一樣,C 語言是被 gcc 編譯成可執(zhí)行文件的,從這個(gè)角度思考,gcc 的權(quán)利是大于 C 語言的,它讓你的哪個(gè)函數(shù)成為程序的入口點(diǎn),就讓哪個(gè)函數(shù)稱為入口點(diǎn)。main 函數(shù)作為程序的入口點(diǎn)只是大家共同的約定,gcc 可以無視。
橫向聯(lián)想
能夠讓你發(fā)現(xiàn)多個(gè)事物之間的共同點(diǎn),能夠讓你舉一反三,達(dá)到觸類旁通的效果。
就像從 C 語言的 constructor 屬性和 destructor 屬性聯(lián)想到 C++ 的構(gòu)造函數(shù)和析構(gòu)函數(shù)
這兩個(gè)方法也是幫助我們成為 T 型人才的有力工具,我們要好好利用它。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/121544.html
摘要:友情提示先關(guān)注收藏,再查看,萬字保姆級(jí)語言從入門到精通教程。及大牛出天地開始有隨之乃有萬種語年英國劍橋大學(xué)推出了語言。 友情提示:先關(guān)注收藏,再查看,13 萬字保...
摘要:大家好,今天屁孩君給大家?guī)砣腴T綜合。年,標(biāo)準(zhǔn)委員會(huì)發(fā)布了語言的第一個(gè)國際標(biāo)準(zhǔn),該標(biāo)準(zhǔn)即為大名鼎鼎的。年,標(biāo)準(zhǔn)委員會(huì)發(fā)布了一份技術(shù)報(bào)告,詳細(xì)說明了計(jì)劃引入的新特性。年月日,經(jīng)過標(biāo)準(zhǔn)委員投票,標(biāo)準(zhǔn)獲得一致通過。 ...
閱讀 2029·2021-09-29 09:35
閱讀 1957·2019-08-30 14:15
閱讀 2981·2019-08-30 10:56
閱讀 967·2019-08-29 16:59
閱讀 580·2019-08-29 14:04
閱讀 1315·2019-08-29 12:30
閱讀 1032·2019-08-28 18:19
閱讀 517·2019-08-26 11:51