186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|||||||||||||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||||||||||||
Накопились вопросы по разным темам.01.09.2011, 20:38. Показов 2006. Ответов 21
Метки нет (Все метки)
1) операция :: - это операция разрешения области действия или области видимости?
2) Чем отличается структура от класса? У структуры и у класса есть данные и функции. Да, у классов есть наследование, полиморфизм, инкапсуляция и т.д и т.п.. Это все? Судя по моим малым знаниям, мне кажется, что структуру всегда можно заменить классом. Что такого есть в структуре, что нет у класса? 3) В объекте класса( в представителе класса ) есть указатель this, указывающий на этот объект. Методы класса получают неявно этот указатель. Допустим есть метод:
4)Указатель this находится в объекте, тогда допустим есть класс
Я знаю три способа: - using namespace std; // самый простой - using std::cout; using std::cin; - непосредственно писать во всем коде перед cout и cin std::, т.е. std::cin >> a; std::cout << a; Какой из способов лучше? 6)Инкапсуляция - это всего лишь скрытие реализации класса от клиентов, т.е. программистов, использующих этот класс? Скрытие реализации для того, что бы код клиентов не зависил от реализации, т.е. они должны знать только интерфейс класса(какие есть методы и что они делают)? 7) Функции в классах называют методами или по другому члены-функции. Я читаю Дейтелов "Как программировать на С++". В книгу везде пишут элемент данные и элементы функции, вместо членов класса и методов(членов функций). Может это корявый перевод на русский? Просто такие термины я вижу только в этой книге. PS Что еще вспомню, допишу.
0
|
01.09.2011, 20:38 | |
Ответы с готовыми решениями:
21
Вопросы накопились Вопросы накопились Тест,примеры по разным темам Несколько программ по разным темам |
101 / 101 / 27
Регистрация: 10.09.2010
Сообщений: 267
|
||||||
01.09.2011, 20:53 | 2 | |||||
По умолчанию все методы класса private, а структуры public. У структуры тоже есть наследование, полиморфизм, инкапсуляция. Но в отличии от класса структуру(если она не имеет конструкторов) можно инициализировать как массив.
1
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
01.09.2011, 20:55 [ТС] | 3 |
Все равно не понимаю почему в языке С++ существуют и структуры и классы. Тем более, если оказывается, что и у структур есть наследование, полиморфизм и т.д. и т.п.
Вот еще вопрос: В книге Дейтейлов "Как программировать на С++" в классе сперва пишут public, потом protected, потом private. А вот на этом форуме наоборот. Как правильно то?
0
|
101 / 101 / 27
Регистрация: 10.09.2010
Сообщений: 267
|
|
01.09.2011, 21:00 | 4 |
Первый способ следует использовать только в начале изучения языка.
А вот дальнейший выбор зависит от размера программы. Для большой программы лучше использовать второй, а для маленькой третий
1
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
01.09.2011, 21:04 [ТС] | 5 |
Т.е. в больших проектах замучаешься дописывать к каждому cin и cout std, поэтому using std::cin/cout предпочтителен. Это насчет написания кода, а как насчет других различиях? Почему для маленьких лучше третий? Чем он лучше, чем второй?
0
|
101 / 101 / 27
Регистрация: 10.09.2010
Сообщений: 267
|
|
01.09.2011, 21:13 | 6 |
Нет правильного способа. Это зависит только от стиля программиста. Например некоторые вобше в классе не пишут private, а в начале класса до слова public объявляют приват методы.
Добавлено через 4 минуты Ну если ты используешь только cout,cin и endl то второй конечно легче но если же ты работаешь с библиотекой STL то подключать каждый алгоритм, фун. объект слишком нудно, лучше явно указывать пространство имен. Добавлено через 2 минуты Именно.
1
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
||||||
01.09.2011, 21:13 | 7 | |||||
Структуры достались С++ по наследству от С. Страуструп сделал их в С++ классами. Отличие от strucn и class - только в одном: в struct все открыто по умолчанию, а в classe - все закрыто. В остальном они совершенно одинаковы.
Объект класса тоже можно явно инициализировать - как и для структур:
1
|
101 / 101 / 27
Регистрация: 10.09.2010
Сообщений: 267
|
|
01.09.2011, 21:17 | 8 |
1
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
01.09.2011, 21:19 [ТС] | 9 |
И все? Т.е., например, я могу взять простенький класс и вместо class написать struct, при этом помня про различие класса и структуры?
А какой смысл тогда было делать Страуструпу классы, если можно было всего лишь одной свойство в структурах изменить и было бы как классы?
0
|
Заблокирован
|
|
01.09.2011, 21:32 | 10 |
Есть подозрение, что из идейных соображений.
Что бы подчеркнуть, что класс - это именно класс. Идеологически, структуры и классы существуют для разных целей. Структура - просто объединение данных, для более удобного хранения. Как правило, содержит только POD-объекты, и не содержит методов. Полностью открытая. Класс служит для разделения зон ответственности по коду. И идеологически является модулем - инвариантной целостной логической единицей, с данными, и методами для обработки этих данных. Имхо.
1
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|||||||||||
01.09.2011, 21:56 | 11 | ||||||||||
Поскольку ответы тут разрозненные, попробую собрать всё воедино. Собирать буду не в буквальном смысле, отвечать буду сам, поэтому если повторюсь, извините)) Начинаем.
Называют и так, и так. Оригинальное название - scope, дословный перевод (гугл) - область действия, область видимости. Так что, действительно, и так, и сяк)) Как уже сказали, структура от класса отличается только тем, что по умолчанию в ней все члены - public, тогда как в классе - private. Всё, больше никаких различий. Структуры в С++ оставили для совместимости с тоннами кода, написанного на С. Ключевое слово class добавили по идеологическим соображениям, всё-таки на ООП замахнулись, а там без термина "класс" скучновато)) В объекте класса нет указателя this. Метод при вызове получает указатель на член класса, для объекта которого его вызвали. Как преобразует компилятор вызов метода (ставит указатель на объект в начале, в конце или как ещё) - дело компилятора (насколько мне известно, в стандарте про это не написано. Если ошибаюсь - прошу поправить). Однако явно объявлять метод с таким "дополнительным" параметром и явно передавать указатель на объект в метод - ошибка, так как компилятор всё равно сам попытается передать скрытый параметр, а в этом случае произойдёт ошибка компиляции, поскольку компилятор не сможет найти метод с такой сигнатурой, как его пытаются вызвать (с одним неявным параметром и одним явным, который лишний). Нет, как я уже сказал, класс не хранит указатель на себя, какой смысл? Вызов
На этот счёт существуют тонны холиваров. Мой аргумент против первого способа: пространства имён вводили не за тем, чтобы в первых 3-5 строках программы любой желающий мог отменить его. Против второго способа в принципе ничего не имею, но и он может оказаться источником ошибок, когда используются несколько библиотек, и хотя бы в двух из них есть классы с одинаковыми именами. Если в одном заголовочном файле мы отменим пространство имён объекта из одной либы, а в другом файле - из другой, и подключим оба заголовка к одному модулю - код не скомпилируется. Лично я всегда использую третий способ, каким бы обширным не был проект. Да. В ООП (в отрыве от языков) это называют "поля" и "методы". В С++ часто применяются термины "члены-данные" и "члены-функции". Member с английского можно перевести и как "член", и как "элемент", и ещё много как. Поэтому это не корявый перевод, а скорее просто ещё не до конца сформировавшаяся терминология в русском языке. Вот так))
1
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|||||||||||||||||||||
01.09.2011, 23:17 | 12 | ||||||||||||||||||||
Сообщение было отмечено как решение
Решение
На самом деле есть еще одно отличие:
это возможно, только если они являются POD-классом (объединение всегда POD), т.е. простым классом (объединением). На самом деле различия между классом и простым классом гораздо существеннее, чем между классом и структурой (которых всего два). Простой класс – это аналог записи в других языках, а класс – это класс для ООП. Грубо, простой класс – это аналог сишной структуры, хотя ему разрешается иметь функции-члены и кое-что еще. По стандарту простой класс не может обладать: • определенными пользователем конструктором, деструктором и оператором копирующего присваивания; • виртуальными функциями; • базовыми классами; • закрытыми и защищенными нестатическими членами; • нестатическими членами данных, являющимися ссылками. Помимо этого, все нестатические члены данных должны относиться к POD-типам – фундаментальным типам, типам-перечислениям, POD-классам и объединениям, указателям на POD-типы и массивам из POD-элементов. В отличие от структур языка C, POD-класс может иметь: • статические члены данных; • невиртуальные функции-члены; • вложенные типы. Простые классы ведут себя как сишные данные, т.е. их можно инициализировать инициализаторами в фигурных скобках, а если они объявлены глобально или в пространстве имен без инициализации, то все их члены-данные инициализируются нулевыми значениями. Для классов С++ в этом случае вызываются конструкторы по умолчанию.
5
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|
02.09.2011, 08:21 | 13 |
Mr.X, спасибо за уточнения. Но новичку пока такие дебри - плохо понятны...
0
|
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
|
|
02.09.2011, 10:28 | 14 |
Как написали, объект класса не хранит указатель на себя. И вообще, ИМХО программист C++ не должен делать таких предположений, конечно хорошо, что он знает о thiscall и разных тонкостях. Главное, не стоит ничего делать на основании предположений о реализации компилятора(если вы не разработчик под виндуз). В стандарте языка нет ничего про соглашения вызовов, реализация может быть различна.
1
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
02.09.2011, 19:02 [ТС] | 15 |
Еще вопрос:
Модификатор const у методов означает, что нельзя модифицировать только данные класса? Или вообще никакие данные нельзя модифицировать?
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
02.09.2011, 19:26 | 16 |
Chelioss, нет, только данные класса.
1
|
Заблокирован
|
|
02.09.2011, 19:38 | 17 |
1
|
13 / 13 / 2
Регистрация: 11.02.2011
Сообщений: 55
|
||||||
02.09.2011, 19:49 | 18 | |||||
Если голова способна принять еще информации, обрати внимание на следующие:
1
|
Заблокирован
|
|
02.09.2011, 20:42 | 19 |
Чтобы было понятно, то надо обратиться к истории языка С++. Он базируется на языке С. В С, как известно, никаких классов нет. Поэтому для реализации классов в С++ в первых версиях использовались структуры. А слово "class" было всего лишь макрокомандой. То есть такого ключевого слова в первых версиях С++ не было. То есть сначала язык С++ был просто препроцессором для С.
Как известно, объектно-ориентированное программирование строится на принципе закрытости реализации. Поэтому по умолчанию у классов их члены имеют спецификатор доступа private. У структур такого нет, так как не забывайте, что нужно обеспечить совместимость с языком С, откуда в С++ пришли структуры. То есть имеет место некоторый дуализм, связаггый с тем, что С++ строится на основе С. С++ должен поддерживать стандартные структуры языка С, а также наделять их новыми качествами. Классы на самом деле также физически реализованы в виде структур. Что касается спецификаторов доступа, то их можно размещать в любом порядке и в любом количестве. Единственное, чем руководствуются, это читабельностью кода. Добавлено через 3 минуты Нет, никакого дальнейшего выбора не существует кроме использования квалифицированных имен. Так как если вы используете директиву using SomeName, то вы 1) скрываете такое же имя, которое может быть вам нужно в коде; 2) способствуете возникновению конфликта имен, так как ваше SomeName может заменить другое SomeName, запрятанное где-нибудь далеко в реализации. Добавлено через 3 минуты Страуструп не мог изменить одно свойство, так как, как я уже сказал, его первый "компилятор" был просто препроцессором над С. В то время структуры не имели таких свойств класса, как сейчас. Поэтому ему нужно было как-то различать стандартные структуры языка С и свои нововведения, которые он наделял новыми свойствами, чтобы другие программисты не путались.
1
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
02.09.2011, 20:43 [ТС] | 20 |
Я читабельность кода и имел ввиду. Везде, где я видел, сперва пишут private, потом protected, дальше public. В книге наоборот.
В плане читабельности какой вариант лучше?
0
|
02.09.2011, 20:43 | |
02.09.2011, 20:43 | |
Помогаю со студенческими работами здесь
20
Написать 20 слов разным цветом с разным расположением Когда вопросы кончаются, сделать кнопку неактивной и вывести сообщение о том, что вопросы кончились Информация по темам билетов Тесты по данным темам Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |