Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
#1

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

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

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

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

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

Ввести натуральное число и определить, верно ли, что в его записи есть две одинаковые цифры (не обязательно ст - C++
Ввести натуральное число и определить, верно ли, что в его записи есть две одинаковые цифры (не обязательно стоящие рядом) Пример: ...

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

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

Согласно бюллетеню Центробанка 100 евро эквивалентны Т руб. Вычислить эквивалент 2,3,4.N руб. в долларах - C++
Согласно бюллетеню Центробанка 100 евро эквивалентны Т руб. Вычислить эквивалент 2,3,4....N руб. в долларах.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kasan
Чорумфанин
337 / 337 / 185
Регистрация: 06.03.2014
Сообщений: 881
10.03.2014, 19:09     Методы. Эквивалентны ли две записи #2
Цитата Сообщение от edwvee Посмотреть сообщение
int func(){}
метод класса

Цитата Сообщение от edwvee Посмотреть сообщение
int func() = 0;
Похоже на виртуальнyю функцию, которая делет класс абстрактным
C++
1
virtual void func()=0;
edwvee
19 / 19 / 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
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,927
Завершенные тесты: 1
10.03.2014, 19:51     Методы. Эквивалентны ли две записи #4
Цитата Сообщение от edwvee Посмотреть сообщение
С чего оно должно компилиться???
Имплементация нужна только в том случае, если функция реально вызывается (или создаётся ситуация, когда она может быть вызвана).
kasan
Чорумфанин
337 / 337 / 185
Регистрация: 06.03.2014
Сообщений: 881
10.03.2014, 19:54     Методы. Эквивалентны ли две записи #5
Цитата Сообщение от edwvee Посмотреть сообщение
Попробовал функции не методы классов делать без имплементации
т.е. делал что-то типа
C++
1
2
3
4
5
int func();
 
class A
{
};
если да, то с чего бы ему не компилить? ты же просто объявляешь протитип функции и все.
если в main() объявить int a и нигде его не использовать то тоже все скомпилит.
edwvee
19 / 19 / 2
Регистрация: 27.01.2014
Сообщений: 232
10.03.2014, 19:54  [ТС]     Методы. Эквивалентны ли две записи #6
Имплементация нужна только в том случае, если функция реально вызывается (или создаётся ситуация, когда она может быть вызвана).
Это я понял. Пытаюсь понять смысл декларации функции не метода класса без имплементации. Зачем можно так?
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,656
10.03.2014, 19:56     Методы. Эквивалентны ли две записи #7
Цитата Сообщение от edwvee Посмотреть сообщение
Так все же одно ли это и то же?
нет
Цитата Сообщение от edwvee Посмотреть сообщение
Кажется понял, в случае =0 не получится создать объект данного класса.
да
если хоть одна виртуальная функция =0 , называется чисто виртуальная функция, то класс становится абстрактным
создать объект такого класса нельзя
Цитата Сообщение от edwvee Посмотреть сообщение
о на последней строчке компилятор ругается, что что-то не такая с таблицей виртуальных функций.
если ты все так и привел как в программе то ошибка вот
Цитата Сообщение от edwvee Посмотреть сообщение
virtual int func(){/*тут реализация метода*/}
нет точки с запятой в конце, после фигурной скобки
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 20:10     Методы. Эквивалентны ли две записи
Еще ссылки по теме:

В две строчки записать две цифры, а потом по закрытии программы и повторном открытии прочитать каждое число в отдельную переменную? - C++
Как в с++ в две строчки записать две цифры, а потом по закрытии программы и повторном открытии прочитать каждое число в отдельную...

Эквивалентны ли char * и char po[40] - C++
В книге Прата имеется такой текст: Никто не пояснит, как в определении шаблона Stack<char *> st char * можно заменить на...

методы - C++
как сделать метод, который записывал бы в файл весь экземпляр класса ? VS Express Edition 2008

Методы класса - C++
Я щас организую разреженную матрицу через двусвязный упорядоченый циклический список... ну да не суть. У меня такой вопрос - я сейчас...


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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,927
Завершенные тесты: 1
10.03.2014, 20:10     Методы. Эквивалентны ли две записи #8
Цитата Сообщение от edwvee Посмотреть сообщение
Зачем можно так?
Самый простой ответ - "а зачем запрещать"? Какой смысл заставлять программиста создавать функции, которые всё равно не используются? Есть такой принцип в разработке качественных компиляторов, "не платить за то, что не используешь". Так что даже написанную функцию всё равно выкинут, если она не используется. Практический смысл у неиспользуемых объявлений может быть разный, например - задел на будущее.

Более глубокое изучение вопроса приведёт нас к раздельной компиляции, когда программа составляется из нескольких исходных файлов, содержащих разные части программы, которые компилируются независимо друг от друга. После этого получившиеся объектные файлы уже объединяются в итоговый исполняемый файл. Из одного исходного файла можно обращаться к функциям другого, для этого и нужны предварительные объявления, чтобы компилятор мог создать вызов, не имея доступа к самой вызываемой функции. В объектном файле уже не остаётся предварительных объявлений, там машинный код вперемешку со ссылками на внешние функции и переменные. Так что на этапе компиляции неизвестно, какие объявления останутся неиспользованными, а на этапе связывания остаются упоминания только об использованных функциях. Получается, что неиспользованные объявления отследить не получится, да и не нужно.
Yandex
Объявления
10.03.2014, 20:10     Методы. Эквивалентны ли две записи
Ответ Создать тему
Опции темы

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