1. C語言中如何將自己常用的函數封裝到編譯器的庫函數中具體應該怎麼做呢
編寫好的代碼放入到一個頭文件裡面,比如放入到 #include "myhead.h" ,然後將這個頭文件放入你編譯器的一個文件夾叫做 :include 文件夾裡面,include 文件夾就是你編譯器自動去尋找頭文件的地方了,比如 #include <stdio.h>就是在裡面的,你把你的頭文件放入到裡面去就行了,下次調用的話就不用 #include "myhead.h",而可以直接像調用系統的頭文件一樣,#include <myhead.h>
2. 友元運算符obj++被c++編譯器解釋為( ). 要有詳細解釋 為什麼不是opeator++(obj,0)
如果>被重載成了友元函數,則obj1>obj2被c++解釋成:operator>(obj1,obj2)。
當程序沒有顯式地提供一個以本類或本類的引用為參數的賦值運算符重載函數時,編譯器會自動提供一個。假設C++允許將賦值運算符重載函數定義為友元函數並且我們也確實這么做了,而且以類的引用為參數。
與此同時,在類內卻沒有顯式提供一個以本類或本類的引用為參數的賦值運算符重載函數。由於友元函數並不屬於這個類。
(2)obj編譯器合成函數擴展閱讀:
虛函數必須是成員函數。如果f必須是虛函數,就讓它成為c的成員函數。
operator>>;和operator<<;決不能是成員函數。如果f是operator>>;或operator<<;,讓f成為非成員函數。如果f還需要訪問c的非公有成員,讓f成為c的友元函數。
只有非成員函數對最左邊的參數進行類型轉換。如果f需要對最左邊的參數進行類型轉換,讓f成為非成員函數。如果f還需要訪問c的非公有成員,讓f成為c的友元函數。
其它情況下都聲明為成員函數。如果以上情況都不是,讓f成為c的成員函數。
3. 構造函數、默認構造函數、合成的默認構造函數之間有什麼區別和聯系
C++編譯器必須為未聲明構造函數之class合成一個默認構造函數
第一,class 有member object(該member object有default constructor), class需要default constructor調用member object default constructor
第二,如果一個沒有任何constructor的class 派生自一個"帶有default constructor"的base class.那麼它的default constructor會被合成出來。
第三,如果一個class申明了virtual function,,如果該類沒有任何constructor,
編譯器也會為它加default constructor.
(如果用戶有constructor,編譯器會在他的constructor中添加一些code,用來初始化vptr)
第四,一個class(沒有申明任何constructor)派生自一個繼承串鏈,其中有一個或多個virtual base classes,編譯器也會合成出一個default constructor,在其中放入每一個virtual base class的執行期存取操作的的碼,
(如果用戶申明了constructors,編譯器會在constructor中安插virtual base class執行期存取操作的的碼)
上面四種分析合成出的default constructor都是nontrivial default constructors,
不在此情況之內的都trivial default constructors,它們實際上並不會被編譯器合成出來
在合成的default constructors,只有base class subobjects和member class object會
被初始化,所有其它的nonstatic data member,如整數、整數指針、整數數組等等都不會被編譯器初始化。
4. 編譯器會把cpp文件中沒被調用的函數編譯到obj文件中嗎
生成.o文件(obj文件)時,會生成這個函數的相關代碼。
但是在鏈接時,即在生成可執行程序時,因為函數沒有被調用到,應該不會鏈接進去。
5. 構造函數的八種方法
構造函數就是一類特殊的方法。
他不同於其他方法的地方
一、創建對象時構造函數自動運行,而一般方法必須有調用語句調用才能執行
二、構造函數與類名必須相同(含大小寫)
三、構造函數不能有返回值類型實例化的語句中對象後面括弧里的參數就是調用構造函數的參數,如果後面啥都沒有則調用沒有參數的構造函數(如果沒有自定義構造函數,編譯器會自動合成一個沒有參數的構造函數,因此也可以實例化),如果是用T obj = _obj這種形式的實例化語句則調用拷貝/移動構造函數。
總之,實例化需要構造函數。構造函數用途: 構造函數用來初始化對象。如果這個理解了,那你以上的疑問就自然解決了。比如你要建立一個鉛筆的對象。那麼你可以用構造函數來控制它的初始狀態,如長度、寬度、顏色等。 2.構造函數的調用: 構造函數也並非是完全自動調用。平時我們new對象的時候其實就是在調用構造函數。比如 (哪鉛筆做例子) Pen p=new Pen();//這是繼承自Object類的默認構造函數。 Pen p2=new Pen(2,Color.Red);//這個p2實例是有2號粗細的紅顏色鉛筆。
6. C++中如何將兩個已編譯的.obj文件連接
要完成鏈接,主函數里要有調用另一文件函數的聲明.
具體操作:
1.打開visual studio,新建項目/win32控制台應用程序/輸入項目名稱/在應用程序向導中點應用程序設置選空項目/完成
2.在解決方案資源管理器中右擊項目名稱/添加/現有項/然後下拉"文件類型"選擇所有文件(*.*)/把你的那些obj文件添加進來
3調試/啟動調試F5,OK
其實在IDE下步驟是比較麻煩,要是在命令行下,只要一兩條命令即可
cd /d obj文件所在目錄
link *.obj
7. c++關於拷貝構造函數和等號的重載
一個類的構造函數只有在定義該類的對象時候才會調用,而且每個對象只有一次調用構造函數的機會,MyClass obj3 = obj1,這個是在定義對象時候的賦值,所以調用的是構造函數。
MyClass obj3 = obj1 等價於MyClass obj3(obj1),這個判斷應該是正確的。
MyClass obj3;
obj3 = obj1;這樣就不是屬於構造函數了。
你的構造函數只發生在定義一個對象的時候,定義完了以後再賦值,就是=號重載了。
8. C語言源程序文件名的後綴是.OBJ,經過編譯後,生成文件的後綴是什麼經過連接後,生成文件的後綴是什麼
C語言源程序文件名的後綴是.c。C源程序經過C編譯程序編譯之後生成一個後綴為.OBJ的二進制文件,
然後由稱為「連接程序」的軟體,把此.OBJ文件與C語言提供的各種庫函數連接起來生成一個後綴為.EXE的可執行文件。
由高級語言編寫的程序稱為「源程序」,把由二進制代碼表示的程序稱為「目標程序」。為了把源程序轉換成機器能接受的目標程序,這時我們需要具有翻譯功能的軟體--「編譯程序」。每種高級語言都有與它對應的編譯程序。
(8)obj編譯器合成函數擴展閱讀
1、目標文件的擴展名為「.obj」(Windows)或「.o」(Linux)。目標文件已經是機器指令,但還不能運行,因為目標文件還沒有解決函數調用問題。
2、可執行文件的擴展名為「.exe「。