Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/37: Рейтинг темы: голосов - 37, средняя оценка - 4.51
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

Cтоит ли после изучения Си++ изучить Си

07.03.2015, 19:44. Показов 8074. Ответов 95
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, стоит ли после изучения Си++ изучить Си? Ведь в Си++ поддерживаются все сишные команды (например, alloc, realloc и т.д.) Но в учебниках по Си++ о них ни слова.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.03.2015, 19:44
Ответы с готовыми решениями:

У меня есть литература для изучения delphi 7. Могу ли я по ней изучить delphi 2010?
Всем привет. Очередной семестр в универе подходит к концу, а лабы по программированию сданы и мне нечем заняться =). Я хочу изучить delphi...

Какие книги лучше всего изучить чтобы хорошо изучить с++
Хотелось бы открыть тему, либо если она уже есть подскажите ссылку. Хочу собрать список книг чтобы изучить профессионально с++, если...

Что изучить после Паскаля?
Всем привет. Прошло 10 месяцов, как начал изучать паскаль. И сейчас продолжаю изучать по книгу Валерия Фаронова " Turbo Pascal. ...

95
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
07.03.2015, 20:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
при создание объекта через malloc
Кхм ведь уже выяснили, что создать объект через malloc нельзя
Хотя кто запрещает сделать так
C++
1
2
3
void *raw = malloc(sizeof(T));
::operator new(raw) T(...);
::operator delete(raw);
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 20:52
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
тсюда на экзамене могу задать подвопрос - почему в ООП при создание объекта через malloc можно вылетить на этапе выполнения.
- никаких вылетов не будет, ниже пример смешанного кода С/С++ он слинкуется плюсовым компилятором и отработает без ошибок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
 
class cTest{
    public:
    int param;
    cTest(){
        param = 0;
    }
};
 
int main(){
    int i;
    static int N  = 5;
    cTest * array = (cTest *)malloc(N*sizeof(cTest));
    if( array != 0 )
    {
        for( i = 0; i < N; i++ )
            array[i].param = i + 1;
        for( i = 0; i < N; i++ )
            cout<<array[i].param<<endl;
    }
    free((void *)array);
    return 0;
    
}
http://codepad.org/ncvaj054
Вот поэтому и важно знать Си чтобы сразу видеть в коде смесь языков.
new и malloc выделяют память, но при ошибке new кинет исключение а malloc выдаст ноль - как итог try{}catch в моём коде не сработает, со всеми вытекающими(повторюсь - надо знать сразу оба языка)
1
658 / 411 / 76
Регистрация: 21.09.2008
Сообщений: 1,411
07.03.2015, 20:54
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Что есть в Си, чего нет в Си++?
Чего нет в надмножестве языка, что есть в его подмножестве?
Возьмите стандарты и читайте отличия. По Си есть отличный справочник Харбисона и Стила на русском языке, рекомендую. Хоть и много у меня компьютерной литературы в электронном виде, эту книгу купил в бумажном и нисколько не жалею. Сейчас купить проблематично из-за очень малого тиража. Найти скан можно на twirpx.com, но там он сырой. Для себя переделал, распотрошив pdf и обработав ScanTailor'ом, далее в djvu. Получилось весьма пристойно как по качеству, так и в размере уменьшился на порядок. Могу поделиться, пишите в личку.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
07.03.2015, 20:55
я про virtual function table pointer
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
07.03.2015, 20:57
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
никаких вылетов не будет, ниже пример смешанного кода С/С++ он слинкуется плюсовым компилятором и отработает без ошибок
Это прокатило, потому что структура cTest это standard layout type. А там где нужно именно "конструирование" будет не понятно что

Добавлено через 1 минуту
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
я про virtual function table pointer
А он тут при чем?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 20:59
Цитата Сообщение от gromo Посмотреть сообщение
Это прокатило, потому что структура cTest это standard layout type. А там где нужно именно "конструирование" будет не понятно что
- это класс с открытым полем. Я не хочу вдаваться в кодинг экзамплов, тут речь идёт о знании языков.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
07.03.2015, 21:01
Цитата Сообщение от gromo Посмотреть сообщение
А он тут при чем?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;
 
struct A
{
    virtual void foo()
    {
        cout << "A" << endl;
    }
 
};
struct B : public A
{
    virtual void foo()
    {
        cout << "B" << endl;
    }
};
int main()
{
    // c++
    /*A* ptr = new B();
    ptr->foo();*/
 
    // c
    /*A* ptr2 = (B*)malloc(sizeof(B));
    ptr2->foo();*/
 
}
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 21:04
Далее чтобы все усвоили new и delete выделяют память, new при ошибке кидает эксепшн malloc возвращает ноль, всё. нет никаких вызовов чего то там, вы даже можете(но это крайне нежелательно) сами перегрузить new как это делает отладчик в DEBUG конфигурации.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
 
class cTest{
    public:
    int param;
    cTest(){
        param = 0;
    }
};
 
class cContainer{
    protected:
    cTest entry;
    public:
    void set(int param = 0){
        entry.param = param;
    }
    int operator()(void){
        return entry.param;
    }
};
 
int main(){
    int i;
    static int N  = 5;
    cContainer* array = (cContainer*)malloc(N*sizeof(cTest));
    if( array != 0 )
    {
        for( i = 0; i < N; i++ )
            array[i].set(i + 1);
        for( i = 0; i < N; i++ )
            cout<<array[i]()<<endl;
    }
    free((void *)array);
    return 0;
    
}
http://codepad.org/XSyQFGtK
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
07.03.2015, 21:05
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
угумс. Отсюда на экзамене могу задать подвопрос - почему используя три кита ООП, после создания объекта через malloc,
во первых я сказал один из
во вторых malloc объект не создает, он просто выделяет память
так что ООП здесь и не пахнет
и есть такая штука как Placement new который не выделяет память а создает объект
Впрочем все это уже написали
Ну и самое главное, у меня один экзаменатор, клиент, а тому без разницы на чем я напишу, хоть на каменных скрижалях, главное чтобы работало и не падало
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
07.03.2015, 21:10
Мы еще говорим про экзаменационный вопрос, который мне задали на примерно такую же тему или уже перешли на личности, как это пофиксить и почему жизнь боль?
0
 Аватар для MicM
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
07.03.2015, 21:11
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Подскажите, стоит ли после изучения Си++ изучить Си?
Как хотите. Но, думаю, что стоит хотя бы знать основные функции из стандартной библиотеки С. Например, сначала стоит научиться пользоваться функционалом из string.h, затем переходить к классу string и т. д. И там math.h, ctype.h, limits.h, stdlib.h...
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
07.03.2015, 21:14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Мы еще говорим про экзаменационный вопрос, который мне задали
что прямо так и задали :"объект созданный malloc" ?
тогда бы я быстро-быстро убежал из этого учебного заведения
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
virtual function table pointer
как раз и создается на этапе конструирования объекта
дизасемблерные листинги показывают, что этим занимается конструктор, как по стандарту не знаю,утверждать не берусь
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 21:17
rikimaru2013, у тебя действительно спросили за placement new
твой код с Си выделением памяти
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;
 
class A
{
public:
    void foo()
    {
        cout << "A" << endl;
    }
 
};
 
class B : public A
{
public:
    void foo()
    {
        cout << "B" << endl;
    }
};
int main()
{
    B * ptr2 = (B*)malloc(sizeof(B));
    ptr2->foo();
    return 0;
 
}
http://codepad.org/CkIKTSG1
В твоём же коде работал переопределённый оператор placement new - он не выделяет память, а только вызывает конструктор объекта.
Также существует парный ему placement delete.

Вот две формы new
inline void *__cdecl operator new(size_t, void *_Where) _THROW0()
{ // construct array with placement at _Where
return (_Where);
}

inline void __cdecl operator delete(void *, void *) _THROW0()
{ // delete if placement new fails
}
Читать здесь ссылка
1
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
07.03.2015, 21:18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Далее чтобы все усвоили new и delete выделяют память, new при ошибке кидает эксепшн malloc возвращает ноль, всё
Они-то выделяют, но и вызывают потом конструкторы объектов. В вашем примере malloc работает, потому что структура cTest проста и все поля в ней располагаются по друг за другом в памяти. А вот про класс cContainer, я, честно говоря, ничего не могу сказать, - в нем есть два разных уровня доступа, но static_assert(std::is_standard_layout<cC ontainer>::value, ""); по-прежнему не срабатывает. Возможно здесь происходит какая-то магическая оптимизация компилятором...
0
07.03.2015, 21:20

Не по теме:

gromo, я уже все ответил выше.

0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
07.03.2015, 21:22
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
В твоём же коде работал переопределённый оператор placement new
да не сработал он
вот так бы сработал
C++
1
2
 void * mem = malloc(sizeof(B));
 B * ptr2 =new(mem) B;
0
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
07.03.2015, 21:24
И все же - почему код -=ЮрА=- не падает? ведь все те классы для которых там malloc выделяет память не скалярные
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
07.03.2015, 21:28
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
твой код с Си
но мой же записывает в указатель A объект B и вызывает его метод. Ваш код выше - не мой ))))
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 21:33
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
но мой же записывает в указатель A объект B и вызывает его метод. Ваш код выше - не мой ))))
- http://codepad.org/m9b8tG9GНе надо приплетать виртуальный мехнизм наследования к функционалу new, это из другой оперы - где есть таблица вирутальных методов и динамическая идентификация типа данных.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.03.2015, 21:42
rikimaru2013, vptr инициализируется вызовом конструктора. В коде с malloc его не было. Отсюда падение.
Цитата Сообщение от gromo Посмотреть сообщение
И все же - почему код -=ЮрА=- не падает?
Потому что так делать - это UB. VS упал, GCC не упал. Потому что GCC взял и сделал из виртуального вызова невиртуальный. Контекст-то доступен весь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.03.2015, 21:42

Куда идти после изучения ЯПа?
Много раз слышал что то вроде &quot;С чего начать программировать, куда идти, шо учить?&quot;, для себя этот вопрос давно решил и сейчас, спустя...

Что выбрать после изучения MYSQL?
Привет ... Сначала изучил MYSQL .Выбрал его потому что он тесно связан с вебом. Хочу углубится в изучении БД. Подскажите что сейчас...

Стоит ли учить C# после изучения VB .NET?
Стоит ли учить c# после изучения vb.net?И чем плюсы c# от vb.net?

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

В каком направлении развиваться после изучения основ С++
После пройденого материала в институте и сдачи экзамена и курсача я задался вопросом а что дальше делать как развиваться. Помогите плиз...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
Просветление в 5 секунд
kumehtar 10.07.2026
Андрей Веретенников выдал фразу недавно: "Вам не обязательно кем-то себя считать"
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru