Какое ключевое слово вы используете для классов? Или лучше так: В каких ситуациях вы используете struct, а в каких class?
Если вы случайно попали в этот блог, и не знаете чем отличаются эти ключевые слова, то подскажу - ничем, кроме моидификатора доступа/наследования по-умолчанию.
Раньше я всегда для "вумных" объектов писал class, а для всяких мелких "контейнеров" struct.
Потом лень меня победила и я стал использовать struct везде. И вот мои аргументы:
1 Наследование
Вы часто используете приватное наследование? А защищенное?
Нет? А чо так?
Я тут прикинул, что не использовал приватное наследование осмысленно ниразу. Соответственно почему оно является наследованием по-умолчанию для меня загадка. Отсюда первый довод в пользу struct: Используя ключевое слово struct вам не придется лишний раз писать "public" при наследовании.
2 Публичный интерфейс
Что вы ожидаете увидеть, открывая хедер какого-либо класса? Я, обычно, хочу увидить его публичный интерфейс, дабы понять что этот класс делает. И, мне, не менее обычно, наплевать КАК он это делает. Посему, я хочу увидеть это как можно быстрее, без вского там скроллинга. В общем, я за то, чтобы публичная часть класса была "сверху". Так в принципе многие и делают. И выглядит это как-то так:
Вы не находите, что здесь что-то лишнее?
Итог
А в итоге часто имеем такой код:
В приведенном листинге 3 раза написано ключевое слово public. И все три раза оно нафиг не нужно при использовании struct.
P.S. Не то чтобы я считал это все очень важной проблемой C++. Просто захотелось что-нибудь запостить в блог =) Не принимайте близко к сердцу
1. теряем отличие структур и классов.
ОтветитьУдалить2. #define p public или типа того тоже уменьшит количество писанины, но важнее ли это читаемости?
#define p public это, конечно, просто великолепно.
ОтветитьУдалитьВот еще пример кода в том же стиле, который "уменьшает количество писанины":
typedef pair< double, double> Point;
#define x first
#define y second
Первому анониму:
ОтветитьУдалить1. Не совсем понял, в чем потеря. Да и вам что, жалко?))
2. Читаемость не уменьшется ни на йоту. Зато лишние слова пропадают.
А за код с дефайнами стерилизовал бы...
1. одно слово означает разные вещи.
ОтветитьУдалитьbool на char ведь тоже можно заменить, но не меняют же.
2. где критерий "лишнести" слова? есть язык с 6 операторами, который все знают). Можно сказать, что он получился выпиливанием из того же С++ всего "лишнего".
1 Замена bool на char не безопасна. Так как это разные типы. И разные они, в том числе, с точки зрения компилятора. В то же время - struct и class - совершенно одна хрень. Замена одного на другое никогда не вызовет ошибки(ну если опустить нюансы с доступом). А вот замена bool<->char может. Например при использовании специализации вектора.
ОтветитьУдалить2 "Лишнесть" в том, что тот же код, можно переписать без этого слова без потерь. Вообще без потерь. Хотя нет. Есть потеря. Строка кода исчезла в примере...
struct и class, как инь и янь, они прямо противоположны, но при этом едины в своей сущности.
ОтветитьУдалитьstruct олицетворяет положительные качества: открытость, общительность, жизнерадосность, а class - отрицательные: скрытость, скупость, лицемерность.
Но в программе, как и в жизни, нельзя обходится только одной стороной, везде нужно соблюдать баланс, тогда программа будет находится в душевном равновесии, а значит не прибудет в ней багов.
В избранное!
ОтветитьУдалитьВ плюсах вообще многое можно делать разными способами.
ОтветитьУдалитьif (!b)
if (b == false)
if (b != true)
За это его и любят. Почему тебе не нравится конкретно это проявление?
Оно мне очень нравится потому, что о нем мало кто задумывается.
ОтветитьУдалитьВот в приведенном примере у переменной b есть два состояния true и false. И при взгляде на код без контекста они равновероятны. А в случае с, например, наследованием распределение вероятностей примерно такое:
0% за приватное наследование
0% за защищенное
100% за открытое
Ну и вообще, я ленивый.
У struct и class есть еще некоторые отличия. Например struct нельзя использовать в качестве темплейтного параметра.
ОтветитьУдалитьВот, пожалуйста.
ОтветитьУдалитьНадо учить матчасть или лучше формулировать мысль
template< typename T>
struct MyList
{
private:
T* data_;
};
template < template< typename T1> class A>
struct B
{
A< int> a;
};
int main()
{
B< MyList> b;
}
Я думаю, имелось ввиду все же
ОтветитьУдалитьtemplate < struct T >...
Что, впрочем, не является существенным. ИМХО. Так как речь все же шла о применении struct и class при создании классов.
Добрый день, AXL,
ОтветитьУдалитьизвиняюсь что пишу не в тему, ну другого способа связи не нашёл, решил в самый последний пост написать, чтобы увеличить вероятность прочтения этого сообщения)
Наткнулся на твой блог , когда гуглил информацию по Спб АУ, очень полезная информация оказалась для меня и сформировывала конкретный образ об этом образовательном учереждение, за что Тебе признателен. Я сам оказазался подобной ситуации только в новосибирском вузе , вот доучился до конца 3 курса и и всё больше склоняюсь к тому, что надо менять ВУЗ , т.к надоело чувствовать всеобщее безразличее как со стороны преподователей, так и учащихся.
Твой блог укрепил мои намерения) в пользу АУ.
Хотел у тебя узнать про собеседованию, а конкретно про математику , у меня в вузе особо не требовали да и к концу 3 курса матан, мат. логика, дискретная мат. выветрились из моей головы. Поэтому обращаюсь к тебе за советом или ответом на следующие вопросы:
Требуется ли на собеседование знать всю примерную программу матана по техническим специальностям ( формулировки теорем с докозательствами) ну и по другим математическим предметам? или же необходимы базовые знания(производная, дифференциал...)? и нужно ли решать какие то сложные задачи по математике?
Читал твой ответ на такой же вопрос в начале блога , там Ты говорил только про программирование. хочу вот понять стоит ли подтягивать математику и до какого уровня, так как время ещё есть.
Буду благодарен за любую информацию.
С уважением, просто студент
Привет.
ОтветитьУдалитьЯ не знаю, что там сейчас спрашивают на собеседованиях. Но в прошлом году спрашивали довольно базовые вещи. Например:
Сколько ребер в полном графе? Определение предела. Что такое гамильтонов и эйлеров цикл? И им подобные.
Сложных задач по математике не давали. По крайней мере на SE.
Но вообще, как обычно - могут спросить что угодно.
В общем, удачи на собеседовании)
Спасибо большое), буду готовится
ОтветитьУдалитьспасибо большое)))
ОтветитьУдалить