使用一个函数调用C ++初始化多个常量类成员

问题描述 投票:4回答:2

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

例如,分子和分母为常数的分数类。

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的输出分配给初始化程序列表中的输出,但这会导致内存浪费。

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

c++ const initializer-list
2个回答
6
投票

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

是。这可以通过C ++ 11中引入的delegated constructor完成。

int gcd(int a, int b); // Greatest Common Divisor
class Fraction {
public:
    // Call gcd ONCE, and forward the result to another constructor.
    Fraction(int a, int b) : Fraction(a,b,gcd(a,b))
    {
    }
private:
    // This constructor is private, as it is an
    // implementation detail and not part of the public interface.
    Fraction(int a, int b, int g_c_d) : numerator(a/g_c_d), denominator(b/g_c_d)
    {

    }
    const int numerator, denominator;
};

0
投票

成员变量由它们在初始化程序列表中的顺序初始化,因此您可以执行以下操作(在数学上)

#include <iostream>
int gcd(int a, int b){return 2;}; // 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/(a/numerator))
    {

    }
//private:
    const int numerator, denominator;
};
//Test
int main(){
    Fraction f{4,6};
    std::cout << f.numerator << " / " << f.denominator;
}

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

© www.soinside.com 2019 - 2024. All rights reserved.