Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
edwvee
20 / 20 / 2
Регистрация: 27.01.2014
Сообщений: 232
#1

Методы. Эквивалентны ли две записи - C++

10.03.2014, 18:58. Просмотров 256. Ответов 7
Метки нет (Все метки)

C++
1
2
3
4
class A
{
    int func(){}
};
C++
1
2
3
4
class A
{
    int func() = 0;
};
То ли раньше не обращал внимания, то ли не встречался со второй записью. Эти два кода эквиваленты?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2014, 18:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Методы. Эквивалентны ли две записи (C++):

Методы защиты данных от записи во время выполнения участка кода?
День добрый, форумчане. Вводные данные: - Весь свой код строю на работе с...

Дано натуральное число n. Проверить есть ли в записи числа две тройки
Добрый вечер. Помогите написать программу.Дано натуральное число n.Проверить...

Проверить, есть ли в десятичной записи заданного натурального числа две единицы подряд
Циклы с предусловием и с постусловием (while; do ... while) Дано натуральное...

Добавить в программу две функции: для считывания и записи данных в файл в бинарном режиме
Усовершенствовать программу дополнив две функции: для считывания и записи...

Подсчитать количество трехзначных натуральных чисел, в записи которых есть две одинаковые цифры
Подсчитать количество трехзначных натуральных чисел, в записи которых есть две...

Сформировать массив B из чисел массива A[n], в записи которых встречаются две подряд идущие одинаковые цифры
Сформировать массив B из чисел массива A, в записи которых встречаются две...

7
kasan
Чорумфанин
338 / 338 / 319
Регистрация: 06.03.2014
Сообщений: 886
10.03.2014, 19:09 #2
Цитата Сообщение от edwvee Посмотреть сообщение
int func(){}
метод класса

Цитата Сообщение от edwvee Посмотреть сообщение
int func() = 0;
Похоже на виртуальнyю функцию, которая делет класс абстрактным
C++
1
virtual void func()=0;
1
edwvee
20 / 20 / 2
Регистрация: 27.01.2014
Сообщений: 232
10.03.2014, 19:30  [ТС] #3
Да не проверил, без virtual не работает.
А тем не менее, если дописать словать virtual. То какая-то разница будет?
Просто если допустим:
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:    
    virtual int func();
};
 
class B: public A
{
public:   
    virtual int func(){/*тут реализация метода*/}
}
Потом где либо:
C++
1
2
3
 A* a;
a = new B();
a->func();
То на последней строчке компилятор ругается, что что-то не такая с таблицей виртуальных функций. А если в классе A написать virtual int func() = 0;, то видимо с таблицей виртуальных функций все в порядке, как и если virtual int func() {}
Так все же одно ли это и то же?

Добавлено через 11 минут
Кажется понял, в случае =0 не получится создать объект данного класса. А vitrual func(); без имплементации видимо и есть функция без имплементации.
Попробовал функции не методы классов делать без имплементации, только декларация. Скомпилилось. С чего оно должно компилиться??? Использую gcc
0
Nick Alte
Эксперт С++
1646 / 1018 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.03.2014, 19:51 #4
Цитата Сообщение от edwvee Посмотреть сообщение
С чего оно должно компилиться???
Имплементация нужна только в том случае, если функция реально вызывается (или создаётся ситуация, когда она может быть вызвана).
0
kasan
Чорумфанин
338 / 338 / 319
Регистрация: 06.03.2014
Сообщений: 886
10.03.2014, 19:54 #5
Цитата Сообщение от edwvee Посмотреть сообщение
Попробовал функции не методы классов делать без имплементации
т.е. делал что-то типа
C++
1
2
3
4
5
int func();
 
class A
{
};
если да, то с чего бы ему не компилить? ты же просто объявляешь протитип функции и все.
если в main() объявить int a и нигде его не использовать то тоже все скомпилит.
0
edwvee
20 / 20 / 2
Регистрация: 27.01.2014
Сообщений: 232
10.03.2014, 19:54  [ТС] #6
Имплементация нужна только в том случае, если функция реально вызывается (или создаётся ситуация, когда она может быть вызвана).
Это я понял. Пытаюсь понять смысл декларации функции не метода класса без имплементации. Зачем можно так?
0
ValeryS
Модератор
7131 / 5399 / 669
Регистрация: 14.02.2011
Сообщений: 18,221
10.03.2014, 19:56 #7
Цитата Сообщение от edwvee Посмотреть сообщение
Так все же одно ли это и то же?
нет
Цитата Сообщение от edwvee Посмотреть сообщение
Кажется понял, в случае =0 не получится создать объект данного класса.
да
если хоть одна виртуальная функция =0 , называется чисто виртуальная функция, то класс становится абстрактным
создать объект такого класса нельзя
Цитата Сообщение от edwvee Посмотреть сообщение
о на последней строчке компилятор ругается, что что-то не такая с таблицей виртуальных функций.
если ты все так и привел как в программе то ошибка вот
Цитата Сообщение от edwvee Посмотреть сообщение
virtual int func(){/*тут реализация метода*/}
нет точки с запятой в конце, после фигурной скобки
0
Nick Alte
Эксперт С++
1646 / 1018 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
10.03.2014, 20:10 #8
Цитата Сообщение от edwvee Посмотреть сообщение
Зачем можно так?
Самый простой ответ - "а зачем запрещать"? Какой смысл заставлять программиста создавать функции, которые всё равно не используются? Есть такой принцип в разработке качественных компиляторов, "не платить за то, что не используешь". Так что даже написанную функцию всё равно выкинут, если она не используется. Практический смысл у неиспользуемых объявлений может быть разный, например - задел на будущее.

Более глубокое изучение вопроса приведёт нас к раздельной компиляции, когда программа составляется из нескольких исходных файлов, содержащих разные части программы, которые компилируются независимо друг от друга. После этого получившиеся объектные файлы уже объединяются в итоговый исполняемый файл. Из одного исходного файла можно обращаться к функциям другого, для этого и нужны предварительные объявления, чтобы компилятор мог создать вызов, не имея доступа к самой вызываемой функции. В объектном файле уже не остаётся предварительных объявлений, там машинный код вперемешку со ссылками на внешние функции и переменные. Так что на этапе компиляции неизвестно, какие объявления останутся неиспользованными, а на этапе связывания остаются упоминания только об использованных функциях. Получается, что неиспользованные объявления отследить не получится, да и не нужно.
1
10.03.2014, 20:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 20:10
Привет! Вот еще темы с решениями:

Ввести целое число и определить, верно ли, что в его записи есть две одинаковые цифры
Задача на С++ (do..while) Нужно ввести целое число и определить, верно ли,...

Ввести натуральное число и определить, верно ли, что в его записи есть две одинаковые цифры (не обязательно ст
Ввести натуральное число и определить, верно ли, что в его записи есть две...

Доказать путем перебора возможных значений, что данные пары логических выражений эквивалентны
Доказать (путем перебора возможных значений), что для любых величин А, В, С...

Доказать (перебор) что для любых величин А, В, С типа Boolean следующие пары логических выражений эквивалентны
Доказать (путем перебора возможных значений), что для любых величин А, В, С...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru