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

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

07.03.2015, 19:44. Показов 8031. Ответов 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
07.03.2015, 22:35
Студворк — интернет-сервис помощи студентам

Не по теме:

ты сам пишешь UB на код с виртуальными методами на мой код(ни в одном коде темы UB нет), сам же пишешь

Цитата Сообщение от DrOffset Посмотреть сообщение
Наследование, виртуальные функции - все это уже вторично.
- пойду ка я из темы ибо разговор ни о чём, притом что тут пытаются говорить о мне в 3-м лице показывая явное неуважение, хорошо болтайте.
Моё ИМХО : Я вижу что опять сталкивюсь с людьми котоыре будут с пеной у рта отстаивать что for(int i =0; i < N; i++) медленнее чем (int i = 0; i < N; ++i), хотя все компиляторы ещё с того тысячилетия научились всё оптимизировать.

0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.03.2015, 22:36
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ты сам пишешь UB на код с виртуальными методами, сам же пишешь
Да, это UB. Ты не согласен? Вызвали виртуальный метод у объекта, для которого не произвели инициализацию. Это и есть UB, самое настоящее. Но писал я это не тебе, а товарищу gromo.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.03.2015, 22:41
Цитата Сообщение от DrOffset Посмотреть сообщение
Да, это UB. Ты не согласен?
- нет не согласен, скажи, что есть создание объекта с констурктором по умолчанию?Я пожалуй хочу это услышать.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.03.2015, 22:43
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
я это и пытаюсь донести им. А они мне "при malloc не создается объект, а лишь выделяется память", что полностью верно. Дотошные ...
ваша оригинальная формулировка звучала так:
Цитата Сообщение от hoggy Посмотреть сообщение
почему в ООП при создание объекта через malloc можно вылетить на этапе выполнения.
потом вы её исправили на корректную:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
почему используя три кита ООП, после создания объекта через malloc, можно вылетить на этапе выполнения программы
Раз вы её исправили, то я думаю вы осознали ошибочность первоначальной трактовки.
И теперь вопросов к вам у меня больше нет.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
07.03.2015, 22:44
Ох, лол, наверное кому-то ( не будем показывать пальцем, а то тут любят обижаться ) и такой код это норм, а что, вроде работает ж

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
struct foobar {
  void f() {
    std::cout << "ololo" << std::endl;
  }
};
 
int main() {
  foobar* f = nullptr;
  f->f();
  return 0;
}
http://ideone.com/FwsIBQ
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.03.2015, 22:47
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- нет не согласен, скажи, что есть создание объекта с констурктором по умолчанию?Я пожалуй хочу это услышать.
Что есть объект? Это - кусок памяти.
Что значит создать объект? Значит выделить память.

Что есть инициализация? Заполнение куска памяти какими то осмысленными значениями.

Что есть RAII ? "получение ресурса есть инициализация".

new использует RAII, она не просто выделяет память, но и инициализирует её.
При этом, для объектов полиморфных классов инициализируется скрытый указатель на таблицу виртуальных функций.

Маллок только создает объект. Но не занимается инициализацией.

Это значит, что объекты полиморфных классов находятся в неконсистентном состоянии,
потому что их скрытый указатель на таблицу виртуальных функций содержит мусор.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.03.2015, 22:47
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
нет не согласен, скажи, что есть создание объекта с констурктором по умолчанию?Я пожалуй хочу это услышать.
Это инициализация.
В примере с malloc не было вызвано никакого конструктора. Ни по-умолчанию, ни по-не-умолчанию.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
07.03.2015, 23:05
Цитата Сообщение от hoggy Посмотреть сообщение
Что значит создать объект? Значит выделить память.
Очень спорная терминология. Я в том смысле, что объект как такой не существует до тех пор пока не выполнился его конструктор.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,980
07.03.2015, 23:05
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
что есть создание объекта с констурктором по умолчанию?
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>
#include <cstdlib>
 
class NumberKeeper {
private:
    int number;
public:
    NumberKeeper(int n = 13) : number(n) {}
    int getNumber() const {
        return number;
    }
};
 
int main(){
    NumberKeeper * a, * b;
    
    a = new NumberKeeper();
    b = (NumberKeeper*)malloc(sizeof(NumberKeeper));
    
    std::cout << "A = " << a->getNumber() << " B = " << b->getNumber() << std::endl;
    
    delete a;
    free(b);
    
    return 0;
}
Code
1
2
3
~/cpp/shitcode $ g++ -o NumberKeeper NumberKeeper.cpp 
~/cpp/shitcode $ ./NumberKeeper 
A = 13 B = 0
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
можете пожалуйста рассказать об отличиях процедурной составляющей обоих языков?
Отсутствие в С++ автоматического приведения указателей void* например...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.03.2015, 23:12
Цитата Сообщение от Voivoid Посмотреть сообщение
Я в том смысле, что объект как такой не существует до тех пор пока не выполнился его конструктор.
Это абсолютно верно.
Поэтому везде до этого, где упоминался объект, как обозначение некоего участка памяти, слово "объект" нужно поставить в кавычки. Чтобы выделить, что мы только подразумеваем его наличие, вызывая методы, но по факту его нет в силу отсутствия инициализации.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
07.03.2015, 23:16
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Подскажите, стоит ли после изучения Си++ изучить Си?
Не стоит.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.03.2015, 23:17
Цитата Сообщение от Voivoid Посмотреть сообщение
Очень спорная терминология. Я в том смысле, что объект как такой не существует до тех пор пока не выполнился его конструктор.
Объект - это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл значения, обнаруженного в объекте, определяется типом имени, использованного для доступа к нему.
(ц)Бьярн Страуструп
http://unix1.jinr.ru/faq_guide... ef1_7.html
Я к тому, что не нужно путать ооп-терминологию (экземпляры классов) с терминологией с++ (объекты).
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
07.03.2015, 23:22
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
можете пожалуйста рассказать об отличиях процедурной составляющей обоих языков?
В стандарте есть пункт в приложении
C Compatibility
C.1 C++ and ISO C
где всё подробно расписано
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.03.2015, 23:33
Цитата Сообщение от DrOffset Посмотреть сообщение
Это абсолютно верно.
Это не верно. К слову, автоматический объект реально существует уже на этапе запуска функции.

То бишь, память под все автоматические объекты уже заранее зарезервирована на стеке.
Оно и понятно: автоматические объекты же нужно будет где то размещать.
И об этом позаботился компилятор.


Некоторые новички думают, что в коде:

C++
1
2
3
4
5
6
7
8
9
10
11
void foo(bool v)
{
    if(v)
    {
         big_long_long obj; obj.work();
    }
    else
   {
       small obj; obj;
   }
}
Если нить исполнения пойдет по второй ветке, то они сэкономят расход памяти.

Ничего подобного. На этапе компиляции, компилятор выделяет столько памяти под скоуп функции,
что б туда гарантированно влезли все автоматические объекты.
Поэтому, даже если исполнение и пойдет по второй ветке, памяти все равно будет зарезервированно столько, что туда влезет big_long_long

Тем не менее, несмотря на то, что память есть, тем не менее говорят, что объектов ещё нет.
Казалось бы тут какой то парадокс в терминологии.

Но давайте ещё раз обратимся к создателю:

Имя обозначает (денотирует) объект, функцию, тип, значение или метку. Имя вводится в программе описанием (#8). Имя может использоваться только внутри области текста программы, называемой его областью видимости. Имя имеет тип, определяющий его использование. Объект - это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл значения, обнаруженного в объекте, определяется типом имени, использованного для доступа к нему.
(Ц)Старина Бъярни.
То, что все мы привыкли называть "областью видимости объекта"
на самом деле является "областью видимости имени".

На самом деле все довольно просто: имя детонирует объект.
И пока у нас нет на руках "работоспособного имени",
мы не можем ничего с объектом сделать.

Следующий код иллюстрирует момент:



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
int foo(int  v)
{
    if(v == 0)
    {
        goto lab;
    }
 
    int m = v * 10;
    
lab:
    
    
    int n = m; //<--- если случится goto, то m не будет детонировано
    //а компялтор не телепат, он за рантайм не отвечает
 
   // error:   crosses initialization of ‘int m’
 
     int m = v * 10;
    
    return n;
    
}
 
int main()
{
    std::cout << "Hello, world!\n";
}
3
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
07.03.2015, 23:40
Цитата Сообщение от hoggy Посмотреть сообщение
вы её исправили
Я до написания следующего сообщения кем-либо исправил тут же - как только перечитал сам и понял, что не правильно задал вопрос. Потом -=ЮрА=-, начал отвечать на вопрос, который якобы задал я, но я про vft ptr задавал вопрос, который активно задавался у нас на экзамене. И понеслось куча недопониманий из-за "не перезагрузили страницу, где был отредактирован мой вопрос"
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
08.03.2015, 00:19
Цитата Сообщение от hoggy Посмотреть сообщение
Ничего подобного. На этапе компиляции, компилятор выделяет столько памяти под скоуп функции, что б туда гарантированно влезли все автоматические объекты.
Э-э-э, очень сильно сомневаюсь. Подозреваю, что это скорее всего implementation-dependent. Например под windows совсем не очевидно, что компилятор будет всегда вести себя так.

Можно подумать, что раз выделение памяти в стеке ничего не стоит ( ибо все "выделение" памяти заключается только в изменении значения регистра esp ), то в общем-то без разницы сколько выделять, хоть пару байт, хоть пару мегабайт, посему можно подумать, что действительно имеет смысл компилятору сразу выделить максимальное кол-во требуемой памяти за раз в начале функции. Но не все так просто. В windows при выделении на стеке более 4-х кб выполняется некоторая дополнительная работа связанная с защитой от переполнения стека ( кому интересно, подробности здесь: http://support.microsoft.com/kb/100775 ). Поэтому я вполне допускаю случаи, когда в целях оптимизации необходимая память на стеке будет выделена не сразу


А по поводу остального, ну-у-у-у, это терминологический спор, надо лезть в стандарт, но лично мне чет лениво
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
08.03.2015, 00:23
Цитата Сообщение от hoggy Посмотреть сообщение
То бишь, память под все автоматические объекты уже заранее зарезервирована на стеке.
не факт
запросто могут использоваться в регистрах
далее
C++
1
2
3
4
5
6
7
8
9
10
11
void func()
{
 {
   int k=10;
   // что то делаем 
 }
 {
  int m=20;
   // что то делаем 
 } 
}
поскольку k и m в разных областях видимости вполне может зарезервировать память под один int
Цитата Сообщение от hoggy Посмотреть сообщение
Но давайте ещё раз обратимся к создателю:
Давайте
вот Господь Бог слепил из глины Адама(выделил память) Это объект или нет?
он ничего не знает ничего не умеет и вообще не живет
а потом вдохнул в него душу( вызвал конструктор) вот теперь это объект
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.03.2015, 00:34
Цитата Сообщение от Voivoid Посмотреть сообщение
Э-э-э, очень сильно сомневаюсь. Подозреваю, что это скорее всего implementation-dependent.
это не принципиально.

принципиально, что когда у нас есть имя, через которое мы можем получить к объекту доступ - у нас есть объект.

во всех остальных случаях объекта у нас нет.

вот и все.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
08.03.2015, 00:45
Цитата Сообщение от hoggy Посмотреть сообщение
когда у нас есть имя,через которое мы можем получить к объекту доступ - у нас есть объект.
во всех остальных случаях объекта у нас нет.
но ты же сам говорил
Цитата Сообщение от hoggy Посмотреть сообщение
К слову, автоматический объект реально существует уже на этапе запуска функции.
То бишь, память под все автоматические объекты уже заранее зарезервирована на стеке.
Цитата Сообщение от hoggy Посмотреть сообщение
то когда у нас
вот например
C++
1
2
3
4
5
6
7
8
int func()
{
// вот здесь выделяется память, под автоматические переменные 
// есть объект k или нет?
.....................................
 
int k; // вот здесь точно есть
}
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.03.2015, 01:08
Цитата Сообщение от easybudda Посмотреть сообщение
с констурктором по умолчанию?
- конструктор по умолчанию означает что у класса нет конструктора ну если так станет легче значит дефолтный конструктор.
Так мне дебильность обсуждения уже начала надоедать, показываю различия между new и перегруженным new для создания класса, всё на маллоке. Поэтому ещё раз для тех кто не понятно о чём со мной спорит - new выделяет память как и malloc, создаёт объекты и дёргает их коснтруторы специализированный пергруженный метод(его заботливо обозвали 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
29
30
31
#include <iostream>
using namespace std;
 
//это для примера!
template <class T>
void * malloc(size_t size, T x){
    void * mem = (void *)malloc(size);
    memcpy(mem, &x, size);
    return mem;
}
 
class A{
public:
    virtual void f(){
        cout<<"A::f"<<endl;
    }
};
 
class B : public A{
public:
    virtual void f(){
        cout<<"B::f"<<endl;
    }
};
 
 
int main(){
    A * ptrA = (B *)malloc<B>(sizeof(B), B());
    (*ptrA).f();
    return 0;
}
http://codepad.org/kl9BZaL7

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Потом -=ЮрА=-, начал отвечать на вопрос, который якобы задал я, но я про vft ptr задавал вопрос, который активно задавался у нас на экзамене. И понеслось куча недопониманий из-за "не перезагрузили страницу, где был отредактирован мой вопрос"
- ответ на твой вопрос, в Си метод маллок не перегружен как new поэтому к созданию памяти не добавляется дёрганье конструктора как с placement new, НО если изголиться можно в Си подобном стиле сие втиснуть в маллок и тогда даже с маллоком будет работать. Для простого наследования возможна отработка с маллоком при условии что все поля классов не требуют первичной инициализации либо статичны, это вариант построения кода будет на грани фола(но может работать, т.к наследование это всего лишь матрёшка из классов и объект всегда имеет фиксированный размер), при виртуальном наследовании нужна ещё таблица виртуальных методов, без контруткора её не будет а поэтому упадём.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.03.2015, 01:08

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru