使用一个函数调用C ++

如果我有两个不同的常量成员变量,都需要基于同一函数调用进行初始化,是否有一种方法可以在不两次调用函数的情况下进行?

例如,分数类,其中分子和分母是常数。

int gcd(int a,int b); // Greatest Common Divisor
class Fraction {
public:
    // Lets say we want to initialize to a reduced fraction
    Fraction(int a,int b) : numerator(a/gcd(a,b)),denominator(b/gcd(a,b))
    {

    }
private:
    const int numerator,denominator;
};

由于两次调用GCD函数,这会浪费时间。您还可以定义一个新的类成员gcd_a_b,然后将gcd的输出分配给初始化程序列表中的输出,但这会导致内存浪费。

通常,有没有一种方法可以避免浪费的函数调用或内存?您也许可以在初始化列表中创建临时变量吗?

qingtouwohao2 回答:使用一个函数调用C ++

通常,有没有一种方法可以避免浪费的函数调用或内存?

是的。可以使用C ++ 11中引入的delegating constructor来完成。

委派构造函数是在初始化任何成员变量之前获取构造所需的临时值的一种非常有效的方法。

$cart->getItems()
,

成员vars是按照在类声明中声明的顺序初始化的,因此您可以(在数学上)执行以下操作

#include <iostream>
int gcd(int a,int b){return 2;}; // Greatest Common Divisor of (4,6) just to test
class Fraction {
public:
    // Lets say we want to initialize to a reduced fraction
    Fraction(int a,int b) : numerator{a/gcd(a,b)},denominator(b/(a/numerator))
    {    
    }
//private:
    const int numerator,denominator;//make sure that they are in this order
};
//Test
int main(){
    Fraction f{4,6};
    std::cout << f.numerator << " / " << f.denominator;
}

无需调用其他构造函数,甚至无需构造它们。

,

@Drew Dormann提供了与我所想类似的解决方案。由于OP从不提及无法修改ctor,因此可以使用Fraction f {a,b,gcd(a,b)}来调用它:

Fraction(int a,int b,int tmp): numerator {a/tmp},denominator {b/tmp}
{
}

只有这样,才不会再次调用函数,构造函数或其他方法,因此不会浪费时间。而且这不会浪费内存,因为无论如何都必须创建一个临时文件,因此您最好充分利用它。它还避免了额外的划分。

本文链接:https://www.f2er.com/2511801.html

大家都在问