【问题标题】:Delegation of Member function成员职能的委派
【发布时间】:2017-09-23 13:29:59
【问题描述】:

我搜索了很多类似成员函数委托的内容,但没有找到相关内容。也许我搜索了错误的单词...

我尝试执行以下操作:

    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);
    }

我的编译器说只有构造函数采用初始化列表,但我想我在某处读到了类似上面的内容。仅构造函数采用初始化列表的规则是否有任何例外?

【问题讨论】:

    标签: c++ function class initialization member


    【解决方案1】:

    初始化列表用于初始化类对象的基类和成员,这仅对类构造函数有意义。一个函数不需要初始化(除了函数参数,它会根据每次调用时传递的参数自动初始化)。

    但是将一个函数推迟到另一个函数很容易:您只需在第一个函数的主体中调用另一个函数。

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

    【讨论】:

    • 我认为如果我必须“委托”超过 10 个功能甚至更多功能,可能会降低性能。我认为如果我告诉编译器它应该调用真正的 bar 函数而不是进入函数体然后调用真正的函数,它可能会更快。我想错了吗?
    • @HenrikViebrock 假设您启用优化,编译器通常会“内联”小函数,从而消除函数调用开销。此外,构造函数 mem-initializers 通常实际上是函数调用。
    • 不知道。谢谢!
    【解决方案2】:

    错误信息很清楚,你不能在成员函数中做那种委托。

    你可以做的只是在一些成员函数中调用一些其他成员函数,传递一个参数,比如:

    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);
        }
    }
    

    使用两个参数调用 bar 不应该有任何性能缺陷。

    【讨论】:

    • 我不是必须在内联函数里面写一个return吗?
    猜你喜欢
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多