Пример правдоподобно разделяет установку и получение значений, потому что между ними больше, чем вы видите в данной основной функции.Если этого не произошло, вы совершенно правы, что вам следует объединить их и даже исключить класс в пользу бесплатной функции.
Например, код может выглядеть примерно так:
void example(Test obj) {
if (something) {
process(obj.tester());
}
}
int main() {
int x, y; // Imagine these are assigned to user input.
Test obj (x, y);
example(obj); // Obj.tester may or may not be used. If the x + y was not
// separated, then you couldn't "maybe use" it.
return 0;
}
Зачем мне нужны частные участники?
Вы не.Они больше документации, чем все остальное.Доступность (публичная / защищенная / приватная) - это документация, которая проверяется компилятором.Эта проверка полезна в основном для инкапсуляции значений, но инкапсуляция - это гораздо больше, чем просто пометка чего-то как не открытого.Например, если вы (из общедоступного метода) возвращаете ссылку на непубличный элемент данных, вы привязали реализацию этого члена к общедоступному интерфейсу класса.
Когда и какя должен использовать деструкторы?
Когда вам нужна специальная логика уничтожения.Читайте о Правиле Трех .Напишите их, как если бы они были методом класса с именем «~» плюс имя класса, не принимая параметров и пропуская возвращаемый тип (даже void), так же, как и для ctors.
Как обычно писатьмои классы?
Вам не нужно определять методы вне класса.Фактически, для начала реализуйте все методы внутри класса, а затем перемещайте методы по мере необходимости.Это намного сложнее испортить, пока вы изучаете важные основы языка, и гораздо удобнее для типов классов, которые вы будете писать изначально.Используйте инициализаторы ctor, когда они осуществимы так же, как и присваивание в теле ctor.
struct Test {
Test(int x, int y) // Use the same names rather than inventing 'a' and 'b'.
: _x (x), _y (y)
{}
int tester() const { return _x + _y; }
// Move outside the class when needed, if at all -- and it won't be needed
// for a function like this.
// Because this doesn't modify anything, it's suitable to be const, which
// means it can be called on a const Test object.
int _x, _y;
// Technically public, but with a "non-public name". Mark private as you
// wish, or as the design settles down.
};
Примечание. Я использовал "struct" для объявления этого класса вместо "class".Результат идентичен, за исключением того, что я пропускаю «public» в любых базовых классах (здесь их нет, но базы чаще общедоступны, чем нет), а доступность члена по умолчанию тоже «public»: это приводит к сокращению и чуть большемуочистить код.