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