Страница 1 из 3

Ликбез по с++?

Добавлено: Вс апр 24, 2005 17:43
c0der
Я вот подумал, может стоит провести ликбез, с целью повышения грамотности программерского населения в области языка с++?

Для начала начала я решил написать hello, world! если кого-нибудь тема заинтересует, можно пойти дальше :)

Код: Выделить всё

//------ helloworld.cpp
#include <iostream>
#include <string>
#include <conio.h>

void main()
{
    std::string message("Hello, world!");
    std::cout << message << std::endl;
    getch();  
}
разбор по строкам:

Код: Выделить всё

#include <iostream>
подключение заголовочного файла iostream для работы с потоками ввода-вывода

Код: Выделить всё

#include <string>
подключение заголовочного файла string для работы с классом std::string

Код: Выделить всё

#include <conio.h>
подключение заголовочного файла conio.h для работы с дополнительными консольными функциями, в частности для работы с getch()

Код: Выделить всё

void main()
точка входа в программу, во всех компиляторах с++ по умолчанию линковщик считает точкой входа в программу (т.е. место откуда нужно начинать выполнение программы) функцию с именем main. ключевое слово void говорит о том, что функция не будет возвращать значения (т.е. является аналогом процедуры в языках pascal и basic). Пустые скобки () говорят о том, что функция не принимает никаких значений. открывающая и закрывающая фигурные скобки разделяют логические блоки кода, такие как функции, циклы, условные операторы, объявление класса, структуры, пространства имён и прочее, в данном примере фигурные скобки отделяют тело функции main от другого кода.

Код: Выделить всё

std::string message("Hello, world!");
создаётся объект message класса std::string (стандартный класс С++ для хранения текстовых переменных), и инициализируем значением "Hello, world!"

Код: Выделить всё

std::cout << message << std::endl;
здесь на объект std::cout отправляется message (message записывается в буффер std::cout) и манипулятор std::endl, говорящий консоли о том что нужно записать в буфер перевод строки+возврат каретки и отобразить буффер на экране.

Код: Выделить всё

getch();
стандартная консольная функция, ожидающая нажатие любого символа

Программа должна успешно компилироваться на всех распространнёных компиляторах с++ - cl (Microsoft Visual C++), icl (Intel C++ compiler), bcc (Borland C++ compiler) , gcc (GNU C/C++ Compiler), естественно под все платформы.

Вот собственно и всё. Жду отзывов.

Добавлено: Вс апр 24, 2005 17:52
Iron Man
c0der
Вот такая же программа на делфи:

Код: Выделить всё

program Project1;

{$APPTYPE CONSOLE}

begin
  Writeln('Hello, world!');
end.
меньше кода, а эффект тот же :cheesy: :cheesy:

Добавлено: Вс апр 24, 2005 17:55
Iron Man
c0der
для новичков M$C++ тяжеловат! Сразу у тех, кто с ним не знаком появляются вопросы..., типа "а что значит #include" или "а что такое ::?" :D

Добавлено: Вс апр 24, 2005 17:56
Iron Man
Соврал! Вот действительно аналог той проги на делфи :D

Код: Выделить всё

program Project1;

{$APPTYPE CONSOLE}

begin
  Writeln('Hello, world!');
  Readln;
end.

Добавлено: Вс апр 24, 2005 18:23
c0der
Iron Man
вот такая же программа на basic

Код: Выделить всё

print "Hello, world!"
basic foreva? >:|

напиши аналог такой программы на delphi:

Код: Выделить всё

#include <iostream>
#include <conio.h>

template <typename T1, typename T2>
showSumma(T1 a, T2 b)
{
    std::cout << a + b << std::endl;
}

void main()
{
    int a = 10;
    float b = 4.25;
    double c = 5.75;
    showSumma(a, b);
    showSumma(b, a);
    showSumma(a, c);
    showSumma(c, a);
    showSumma(b, c);
    showSumma(c, b);
    getch();
}
:)

Добавлено: Вс апр 24, 2005 20:45
Iron Man
c0der
template <typename T1, typename T2>
- хитрый какой!!! :mrgreen:

ну вот получай:

Код: Выделить всё

program Project1;

{$APPTYPE CONSOLE}

var
  a: integer = 10;
  b: Extended = 4.25; // ( = float)
  c: double = 5.75;

procedure showSumma(t1, t2: variant);
begin
  Writeln(t1 + t2);
end;

begin
  showSumma(a, b);
  showSumma(b, a);
  showSumma(a, c);
  showSumma(c, a);
  showSumma(b, c);
  showSumma(c, b);

  Readln;
end.
насчёт бейсика конечно :wink:
но всё таки на делфи можно сделать ПОЧТИ всё что на C++, только на делфях многие вещи делать гораздо удобнее..., та же работа с БД или разработка пользовательского интерфейса.

Добавлено: Вс апр 24, 2005 22:01
c0der
ох, variant ;)

вопрос, что будет если мы передадим вместо числа строку?

Код: Выделить всё

#include <iostream>
#include <conio.h>

template <typename T1, typename T2>
showSumma(T1 a, T2 b)
{
    std::cout << a + b << std::endl;
}

void main()
{
    int a = 10;
    float b = 4.25;
    double c = 5.75;
    std::string stroke("Hello, just stroke! ;)");
    showSumma(a, b);
    showSumma(b, a);
    showSumma(a, c);
    showSumma(c, a);
    showSumma(b, c);
    showSumma(c, stroke); // здесь нас компилятор(!) ткнёт носом и скажет - низзя!
    getch();
} 
теперь смотрим на delphi

program Project1;

{$APPTYPE CONSOLE}

var
a: integer = 10;
b: Extended = 4.25; // ( = float)
c: double = 5.75;
stroke : string;

procedure showSumma(t1, t2: variant);
begin
Writeln(t1 + t2);
end;

begin
stroke := 'Hello, just stroke! ;P';
showSumma(a, b);
showSumma(b, a);
showSumma(a, c);
showSumma(c, a);
showSumma(b, c);
showSumma(c, stroke); // а вот тут компилятор Delphi забъёт болт на то, складывается string с double или нет, и во время выполнения(!) программы возникнет ошибка

Readln;
end.

Надеюсь, разница понятна?

Добавлено: Вс апр 24, 2005 22:17
Iron Man
c0der
да разница и до этого была понятна )) ну нету в делфи шаблонов! :D
Но и без них можно обойтись, тот кто использует шаблоны, обычно не пишет вместо числа с плавоющей точкой строку )))

У меня за всё время раз 5 максимум возникала практическая потребность в использовании Variant, а шаблонами, думаю, пользовался бы ещё реже...

Кстати щас изучаю php- почти один в один C++ :)

Добавлено: Пн апр 25, 2005 8:23
Borr
Даешь бейсик в массы...
Iron Man писал(а):но всё таки на делфи можно сделать ПОЧТИ всё что на C++, только на делфях многие вещи делать гораздо удобнее..., та же работа с БД или разработка пользовательского интерфейса.
Это относиться MS C++. Builder C++ прекрасно позволяет работать с БД даже новенькому...

Добавлено: Пн апр 25, 2005 10:29
c0der
У меня за всё время раз 5 максимум возникала практическая потребность в использовании Variant, а шаблонами, думаю, пользовался бы ещё реже...
То что ты не используешь, отнюдь не значит что это не нужно.
Я тоже когда-то писал только на С и думал что все эти "классы и прочее ООП" мне не нужны вовсе, т.к. можно обойтись и без них. Теперь я незнаю как без них обойтись Ж:o. Просто ты наверное ещё слабо представляешь возможности шаблонов С++. Как на Delphi реализовать библиотеку - аналог STL? Ответ - никак :( А я например не представляю себе жизнь без STL Ж:o
Кстати щас изучаю php- почти один в один C++
всё с тобой ясно

Добавлено: Пн апр 25, 2005 10:39
Borr
c0der
как выглядит работа с БД на MS C++.Есть отдельные компоненты для этого типа ADOQuery на Builder'e.Если нет то как реализуется подключение
только #include<sqlcli.h> на пальцы бенты и попер? по другому никак?

Добавлено: Пн апр 25, 2005 11:05
c0der
Borr
угу, почти, пишется _asm а потом директивы ассемблера, да =)
http://www.firststeps.ru/mfc/steps/r.php?366
и вообще весь портал http://www.firststeps.ru/ - популярно тебе всё расскажет. Ты же не думаешь что MS забила болт на программистов и отдало всё прикладное программирование на откуп Borland? Всё что есть в Builder есть в MSVC, аналог VCL - MFC, живи и радуйся.

Добавлено: Пн апр 25, 2005 11:36
Borr
Так это чтож :roll: не тоже самое, что у бабушки плюшки пи.... э брать (незаметно).
А за линк спасибо много интересного.

Добавлено: Пн апр 25, 2005 19:13
Iron Man
c0der
Я тоже когда-то писал только на С и думал что все эти "классы и прочее ООП" мне не нужны вовсе, т.к. можно обойтись и без них. Теперь я незнаю как без них обойтись Ж. Просто ты наверное ещё слабо представляешь возможности шаблонов С++.
Как раз таки ООП я ОЧЕНЬ часто пользуюсь, написать что-либо черьёзное без создания своих классов обычно проблематично... вот только шаблоны ИМХО имеют очень отдалённое отношение к ООП.

А что такое STL, если не секрет?

Borr
Это относиться MS C++. Builder C++ прекрасно позволяет работать с БД даже новенькому...
Эт точно!

Добавлено: Пн апр 25, 2005 19:53
c0der
STL - стандартная библиотека шаблонов C++.

http://www.progs.biz/cpp/stl/stl01.aspx
зачатки документации на русском языке, что характерно - написано "Основы C++. Библиотека STL" и это действительно основы, их должен знать каждый кто говорит о себе "я знаю с++" (я не говорю :) )

http://www.savinov.spb.ru/stl/
полная документация по STL на английском

Так же великолепная библиотека шаблонов, которая правда не входит в стандарт (пока?) С++ - boost
www.boost.org - исходники и документация