1樓:匿名使用者
錯誤!行內函數的定義如下:
行內函數是使用inline關鍵字宣告的函式,也成內嵌函式,它主要的作用是解決程式的執行效率。
只有inline這個關鍵字包含在函式宣告中, 才是行內函數。 與類沒有任何的關係!
舉例:static inline int max(int a, int b);
c++中怎麼理解類內定義的成員函式就是行內函數?
2樓:匿名使用者
當你的class。public成員函式宣告的時候,只要這個函式體當中不存在switch等迴圈語句的時候,則這個函式體無論是在類的內部還是類的外部,這個成員函式在編譯器看來,都等同於inline 行內函數了。
3樓:手機使用者
好像inline現在確實很少用了,編譯器都越來越智慧了
tenglvjun說的對,編譯器是否把函式編成內聯,它有自己的判斷,並不會因為你寫了inline就一定是內聯.就和register一樣,並不是加了register,編譯器就一定會把變數放到暫存器中
4樓:扶範西門靈秀
在類內定義的成員函式預設為inline,不論前面是否加了inline,當然,是否內聯還是取決於編譯器啦~而在類外定義的成員函式就不是行內函數。
c++成員函式的行內函數能否在類外宣告?
5樓:匿名使用者
我想你把函式的定義和宣告兩個概念混淆了,可以定義在外面,但是宣告肯定是在類內啊。
// 標頭檔案
class a
// 定義檔案
inline void a::foo(int x, int y) // 表明是一個行內函數
// 若是定義在類內,就是隱式內聯了,比如class a}
6樓:
可以,不過類內必須要有函式宣告
mfc自動生成的文件/檢視程式就有這樣的函式,一般類的成員函式,寫在類外的部分稱為定義,即函式的實現**!只要#include相應的標頭檔案,類的公開成員就可以使用了!私有成員,類自己和友元可用,保護成員子類也可用!
c++中在類內部的成員函式,如果連宣告帶定義一下寫完了,那這個就會是行內函數嗎? 如果是,那就必須在類 5
7樓:匿名使用者
行內函數並不真的會被強制。對於現在的編譯器,內聯的目的主要是為了可以直接在標頭檔案裡寫函式定義。預設情況下編譯器判斷一個函式呼叫要不要內聯的時候根本不會考慮這個函式是不是行內函數。
8樓:匿名使用者
不是必須帶有關鍵字 inline才可以!
它與普通函式的區別,就是說它是包含在類裡面的,雖然在外面定義,如果沒有inline關鍵字,那就是在外部的函式,不屬於這個類
9樓:匿名使用者
是這樣吧?
成員函式的實現部分,如果寫在類裡面,就是內聯的; 如果寫在類外,並且想是內聯的,那需要帶inline
c++行內函數可以呼叫行內函數嗎
10樓:匿名使用者
c++的inline關鍵字只是對編譯器提出inline的建議。
不是所有加上了inline關鍵字的函式都能成為inline函式。
而有些沒有加inline關鍵字的函式也可能被編譯器變成了行內函數。
這應該是一個取決於編譯器問題。
11樓:手機使用者
問題。函式是一種更高階的抽象。它的引入使得程式設計者只關心函式的功能和使用方法,而不必關心函式功能的具體實現;函式的引入可以減少程式的目標**,實現程式**和資料的共享。但是,函式呼叫也會帶來降低效率的問題,因為呼叫函式實際上將程式執行順序轉移到函式所存放在記憶體中某個地址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。
這種轉移操作要求在轉去前要保護現場並記憶執行的地址,轉回後先要恢復現場,並按原來儲存地址繼續執行。因此,函式呼叫要有一定的時間和空間方面的開銷,於是將影響其效率。特別是對於一些函式體**不是很大,但又頻繁地被呼叫的函式來講,解決其效率問題更為重要。
引入行內函數實際上就是為了解決這一問題。
在程式編譯時,編譯器將程式中出現的行內函數的呼叫表示式用行內函數的函式體來進行替換。顯然,這種做法不會產生轉去轉回的問題,但是由於在編譯時將函式休中的**被替代到程式中,因此會增加目標程式**量,進而增加空間開銷,而在時間代銷上不象函式呼叫時那麼大,可見它是以目標**的增加為代價來換取時間的節省。
行內函數的定義方法
定義行內函數的方法很簡單,只要在函式定義的頭前加上關鍵字inline即可。行內函數的定義方法與一般函式一樣。如:
inline int add_int (int x, int y, int z)
在程式中,呼叫其函式時,該函式在編譯時被替代,而不是像一般函式那樣是在執行時被呼叫。
使用行內函數應注意的事項
行內函數具有一般函式的特性,它與一般函式所不同之處公在於函式呼叫的處理。一般函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中;而行內函數在呼叫時,是將呼叫表示式用行內函數體來替換。在使用行內函數時,應注意如下幾點:
1.在行內函數內不允許用迴圈語句和開關語句。
2.行內函數的定義必須出現在行內函數第一次被呼叫之前。
3.本欄目講到的類結構中所有在類說明內部定義的函式是行內函數。
12樓:影者
可以的,行內函數本身就是c的巨集轉化過來的而已,呼叫是可以的,不用像巨集一樣那麼麻煩
13樓:匿名使用者
可以的,行內函數也是函式,函式本身就可以呼叫函式。
c++中,什麼是隱式行內函數?能舉個例子嗎
14樓:普洛智應
class a
//.....
};就是實現直接寫在類的宣告中了的函式
15樓:匿名使用者
在c++中行內函數是對巨集定義一種改造,因為利用行內函數取代巨集定義得好處是:
1、可進行型別安全檢查或自動型別轉換、
例如:在c語言中,常用前處理器語句#define來代替一個函式定義。例如:
#define max(a,b) ((a)>(b)? (a):(b))
該語句是在程式中每個出現max(a,b)函式呼叫得地方,都被後面得表示式((a)>(b)?(a):(b))所替代
不難發現其實對引數a,b來說都沒有資料型別得定義,缺少一些安全性檢查。
2、提高程式的執行效率
對於c++中一般得函式,被程式呼叫得時都需要為該函式開闢空間進行函式得壓棧、出棧等所帶來得開銷,而
行內函數像巨集一樣被,呼叫行內函數的時候,由編譯器負責把行內函數的函式體**塊替換到行內函數被呼叫的
地方,這一點與巨集替換很相似;取消了函式引數壓棧、出棧所帶來的開銷,從而減少了函式呼叫開銷,提高程式得運
行效率。
所以,行內函數在專案開發中經常用到,所以關於行內函數得使用應用如下:
第一種 、行內函數得宣告和函式體得定義在一起
例如:inline int max(int a, int b);
第二種、c++類得成員函式也可以被定義為行內函數
class student{
private:
int nid;
int nage;
float fscore;
public:
void setid(int nid) //該成員函式預設自動為行內函數(隱式定義行內函數)
int getid(void) //該成員函式預設自動為行內函數(隱式定義行內函數)
inline void setage(int nage) //顯式定義行內函數
inline int getage(void) //顯式定義行內函數
void setscore(float fscore); //類定義體內沒有宣告為行內函數;
float getscore(void); //類定義體內沒有宣告為行內函數;
}inline void student::setscore(float fscore) //類定義體外實現為行內函數;
inline float student::getscore(void) //類定義體外實現為行內函數;
注意:(1)c++中,在類定義體內部定義了函式體的成員函式,被編譯器預設為行內函數,而不管這個函式頭前面是
否有關鍵字inline,比如:setid()、getid()、setage()、getage();
(2)以把實現在類定義體外部的成員函式定義為行內函數,這個時候在類定義體中只有成員函式頭的宣告,而
其實現是在類定義體外部,比如:setscore()和getscore();
行內函數的侷限性:
1、由於行內函數與巨集一樣也是實現為**替換,所以定義為行內函數的函式體不宜過大,如果函式體過
大,則某些普通的編譯器就會放棄內聯方式,而改用呼叫普通函式的方式,這樣就失去了行內函數的意義了;所以,
行內函數的函式體**不宜過大,一般就是3---4行**即可;
2、由於行內函數是編譯器在便宜階段進行函式體的,所以,這就把類的行內函數的定義與實現都必須在
宣告類的那個標頭檔案中,而不能放在實現類的那個cpp檔案中;這一點與模板template<>的特性相似
c++中行內函數是什麼意思?
16樓:匿名使用者
行內函數具有一般函式的特性,它與一般函式所不同之處只在於函式呼叫的處理。一般函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中;而行內函數在呼叫時,是將呼叫表示式用行內函數體來替換。在使用行內函數時,應注意如下幾點:
1.在行內函數內不允許用迴圈語句和開關語句。
如果行內函數有這些語句,則編譯將該函式視同普通函式那樣產生函式呼叫**,遞迴函式(自己呼叫自己的函式)是不能被用來做行內函數的。行內函數只適合於只有1~5行的小函式。對一個含有許多語句的大函式,函式呼叫和返回的開銷相對來說微不足道,所以也沒有必要用行內函數實現。
2.行內函數的定義必須出現在行內函數第一次被呼叫之前。
3.本欄目講到的類結構中所有在類說明內部定義的函式是行內函數。
17樓:匿名使用者
在類宣告的內部宣告或定義的成員函式叫做內聯(inline)函式.
有兩種實現方式:
1.在類宣告的內部宣告,而在類宣告外部定義叫做顯式行內函數,如:
class display
display object;
inline void display::output(void)2.在類宣告的內部定義,叫做隱式行內函數,如:
class display
} 引入行內函數的目的是為了解決程式中函式呼叫的效率問題。
函式是一種更高階的抽象。它的引入使得程式設計者只關心函式的功能和使用方法,而不必關心函式功能的具體實現;函式的引入可以減少程式的目標**,實現程式**和資料的共享。但是,函式呼叫也會帶來降低效率的問題,因為呼叫函式實際上將程式執行順序轉移到函式所存放在記憶體中某個地址,將函式的程式內容執行完後,再返回到轉去執行該函式前的地方。
這種轉移操作要求在轉去前要保護現場並記憶執行的地址,轉回後先要恢復現場,並按原來儲存地址繼續執行。因此,函式呼叫要有一定的時間和空間方面的開銷,於是將影響其效率。特別是對於一些函式體**不是很大,但又頻繁地被呼叫的函式來講,解決其效率問題更為重要。
引入行內函數實際上就是為了解決這一問題。
請問C 中成員函式在類裡面定義和在類外定義有什麼區別
效能來說沒啥區別。不過放在類外,的定義和實現分開,有利於 封轉,別人需要呼叫你的介面的時候,你可以只給他標頭檔案,的實現自己留著。在類裡定義時,這種函式會被編譯器編譯成行內函數,在類外定義的函式則不會。行內函數的好處是加快程式的執行速度,缺點是會增加程式的尺寸。比較推薦的寫法是把一個經常要用的而且實...
c中類的成員函式重定義和虛擬函式有什麼區別
虛擬函式可以實現多型,過載不行 多型就是用同一個呼叫方式實現不同呼叫 比如,你定義了一個名為形狀的父類,裡面有一個計算面積的虛擬函式。並且派生了兩個子類,一個是圓,一個是方形,各自實現了自己的計算面積函式 這樣,你想要計算面積的時候,並不需要考慮圓和方形的區別。只需要 父類.計算面積 這樣呼叫,編譯...
判斷題正確的在括號內打,錯誤的打1植物生活不需要
bai1 生物的一生需要不du斷從外界獲得營養物質,維zhi 持生存 植物能夠通dao過光合作用版製造有機物 權植物製造的有機物,不僅供給了植物自身,也是動物的食物 動物不能自己製造有機物,它們直接或間接地以植物為食 因此原命題 2 病毒由蛋白質外殼和遺傳物質 核酸 組成 是沒有細胞結構的生物 因此...