2017-09-23 90 views
0

我搜索了很多類似於成員函數的委託,但我沒有找到關於它的一些東西。也許我搜索的錯誤的話......成員函數的代表

我嘗試做一些這樣的:

class Foo1 { 
     int bar(int a, int b = 1, bool c = false); 
     int bar(int a, bool c); 
    } 

    // Can I write it like: 
    class Foo2 { 
     int bar(int a, int b = 1, bool c = false); 
     // This line is my question: 
     int bar(int a, bool c) : bar(a, 1, c); 
    } 

我的編譯器說,只有構造函數才能初始化列表,但我覺得我讀像上面的地方。規則中是否存在只有構造函數使用init列表的例外情況?

回答

0

init-list用於初始化類對象的基礎和成員,這隻對類構造函數有意義。一個函數沒有什麼可以初始化的(除了函數參數,它們是從每次調用傳遞的參數自動初始化的)。

但是,將一個功能推遲到另一個很容易:您只需在第一個功能的主體中調用其他功能。

class Foo2 { 
    int bar(int a, int b = 1, bool c = false); 
    int bar(int a, bool c) { return bar(a, 1, c); } 
}; 
+0

我認爲這可能會降低性能,如果我必須「委託」10個功能和更多。我認爲如果我告訴編譯器它應該調用真正的bar函數而不是進入函數體內部並調用真正的函數體,它可能會更快。我有沒有想過錯? –

+0

@HenrikViebrock假設您啓用了優化,編譯器通常會「內聯」小函數,從而消除函數調用開銷。而且,構造函數的mem-initializers通常實際上是函數調用。 – aschepler

+0

不知道。謝謝! –

0

錯誤信息很清楚,你不能在成員函數中做那種委託。

你可以做的僅僅是調用一些成員funcion其他一些成員函數,傳遞的參數,如:

class Foo1 { 
    int bar(int a, int b = 1, bool c = false); 
    int bar(int a, bool c); 
} 

// Can I write it like: 
class Foo2 { 
    int bar(int a, int b = 1, bool c = false); 

    // Should be inlined by default, but won't hurt to specify it explicitly 
    inline int bar(int a, bool c) { 
     return bar(a, 1, c); 
    } 
} 

調用兩個參數吧應該不會有任何性能缺陷。

+0

難道我不得不在內聯函數中寫入* return *嗎? –

+0

@HenrikViebrock沒錯,我的錯誤。 – Outshined