Я имею в виду не переменную в классе, а значение по умолчанию для класса в целом.
struct Scalar { unsigned int value; void toThePowerOf(int power); // etc. }
Я хотел бы иметь возможность сделать что-то вроде
Scaler foo; foo.value = 2; foo.toThePowerOf(2); std::cout << foo << std::endl; // Outputs 4!
Возможно ли это в C ++?
Нет, классы не имеют значения в вашем мышлении.
Что вы, вероятно, хотите сделать, это перегрузить оператор <<: </p>
ostream& operator<<(ostream& output, const Scalar& val) { output << val.value; return output; }
Я имел в виду значение по умолчанию для класса, поэтому, если бы вы назвали этот объект только по его имени foo, он бы возвратил foo.value по умолчанию.
foo
foo.value
Это действительно возможночтобы определить неявное преобразование из Scalar в int:
Scalar
int
struct Scalar { unsigned int value; operator int() const { return value; } }; int main() { Scalar foo = {2}; std::cout << foo << std::endl; }
Но в сообществе C ++ обычно не одобряют неявные преобразования, потому что это может затруднить чтение кода.(Наверное, поэтому еще никто не упомянул операторы преобразования.)
Использовать значение по умолчанию в ctor. Сделайте ctor явным, если вы не хотите неявных преобразований.
struct Scalar { unsigned int value; Scalar(int value=0) : value (value) {} void toThePowerOf(int power) { // naive implementation just for show int new_value = 1; assert(power >= 0); // or other error checking for (; power > 0; --power) { new_value *= value; } value = new_value; } friend std::ostream& operator<<(std::ostream &out, Scalar const &x) { out << x.value; return out; } };
Да.это возможно.Просто инициализируйте все значения в конструкторе класса.Используйте класс вместо struct.
Нет, вы не можете, но можете перегрузить оператор << для своего класса и ostream, чтобы получить желаемый эффект </p>
std::ostream& operator << (std::ostream& out, const Scaler& foo) { return out << foo.value; }
Ваш код теперь будет работать и давать желаемый результат