Initialize multiple constant class members using one function call C++
The member vars are initialized by the order they are declared in the class declaration, hence you can do the following (mathematically)
#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;
}
No need for calling another constructors or even making them.
In general, is there a way to do this without wasted function calls or memory?
Yes. This can be done with a delegating constructor, introduced in C++11.
A delegating constructor is a very efficient way to acquire temporary values needed for construction before any member variables are initialized.
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;
};