Инструменты пользователя

Инструменты сайта


Боковая панель

Связь

zametki_po_jazyku_c

Ссылки

Заметки по языку C++

Источник: Связь с C++ Материал из Википедии

Язык программирования С++ произошёл от Си. Поддерживает разные парадигмы программирования, но, в сравнении с его предшественником — языком Си, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования. Однако в дальнейшем Си и C++ развивались независимо, что привело к росту несовместимостей между ними. При создании C++ стремились сохранить совместимость с языком Си. Большинство программ на Си будут исправно работать и с компилятором C++. C++ имеет синтаксис, основанный на синтаксисе Си. Последняя редакция Си, С99, добавила в язык несколько конфликтующих с С++ особенностей. Эти различия затрудняют написание программ и библиотек, которые могли бы нормально компилироваться и работать одинаково в компиляторах Си и C++, что, конечно, запутывает тех, кто программирует на обоих языках. Бьёрн Строуструп, придумавший C++, неоднократно выступал за максимальное сокращение различий между Си и C++ для создания максимальной совместимости между этими языками. Противники же такой точки зрения считают, что так как Си и C++ являются двумя различными языками, то и совместимость между ними не так важна, хоть и полезна. Согласно этому лагерю, усилия по уменьшению несовместимости между ними не должны препятствовать попыткам улучшения каждого языка в отдельности. Бьёрн Страуструп, Бьярне Строуструп (дат. Bjarne Stroustrup произношение род. 11 июня 1950 (по другим сведениям, 30 декабря), Орхус, Дания) - автор языка программирования C++.

Процедурное программирование - подход, при котором функции и переменные, относящиеся к какому-то конкретному объекту свободно располагаются в коде и никак между собой не связаны.(Язык С).
Объектно-ориентированное программирование (ООП) - подход, при котором функции и переменные, относящиеся к какому-то конкретному объекту объединены в коде определенным образом и тесно связаны между собой. (Язык С++).
Минимальный объем данных с которым мы можем работать 1 байт. Битовые поля это другая песня.
Литералы (мое определение: это совокупность неизменяемых программно фиксированных значений, которые описывают среду языка С). Для каждого типа языка С существуют литералы, включая символьный и булевский типы, целые числа и числа с плавающей точкой. Как это не парадоксально, типа данных для хранения строк в С не существует, а строковые литералы существуют.
  1. Циклы: while, do while, for.
  2. Массивы. Двумерные массивы (матрицы). Многомерные динамические массивы.
  3. Память:
    • Статическая память - это область хранения всех глобальных и статических переменных. Переменные статической памяти объявляются лишь единожды и уничтожаются по завершении программы.
    • Динамическая память куча (англ. heap) или память свободного хранения.
  1. Строки в С++. Строковые массивы. Библиотека обработки строк Библиотека обработки строк string.h. Примеры: Конкатенация строк, Поиск символов.
  2. void или int объявление главной функции программы.
  • Socket - сетевое программирование.
  • Файл. Определение понятия файл. Функции для работы с файлами. Функции для работы с директориями.

ОПП

Функции

Введение в функции:

  • Введение в Введение в функции (оператор return). Передача аргументов по значению, по указателю, по ссылке.
  • Встраивание функций (inline, макросы #define).
    • сout - вывод данных на консоль. Форматирование ввода-вывода средствами языка С++.
    • cin - ввод данных с консоли.
      • math.h: Для возведения в степень используется функция pow(double num,double exp), где num это число для возведения в степень, а exp - сама степень.
      • Для извлечения корня квадратного используется функция sqrt(double num), где num это число из которого извлекают корень.
    • rand - генератор случайных чисел.
    • qsort - функция реализующая алгоритм "Быстрая сортировка" массива.

Передача параметров

Передать аргументы функции в С++ можно тремя сопособами: передача по значению, передача по ссылке(Ссылка) и передача по указателю(Указатель).

  • Передача по значению: Когда аргумент передается по значению, создается копия аргумента, и последняя передается (через Стек вызовов) вызываемой функции. Изменение копии не влияют на значение исходной переменной вызывающего. После того как функция завершается, копия уничтожается. Это предотвращает случайные побочные эффекты, препятствующие разработке корректных и надежных программных систем.
Недостаток! При передачи по значению большого объекта копирование может привести к значительным затратам времени и памяти.
В С отсутствуют ссылки.
В большинстве ситуаций передача по ссылке более предпочтительна, чем передача по указателю.
Передача аргументов по значению и по ссылке. Без проверки прототипов или определений функций по виду вызова невозможно выяснить, какая из двух функций может изменять свой аргумент. Поскольку прототипы функций являются обязательными, компилятор без труда разрешает эту неопределенность.
Передача по значениюПередача по ссылке(Ссылка)Передача по указателю(Указатель) в случае динамического массива
Переменная
#include <iostream>
/*
 * передача по значению
 */
using namespace std;
int ByValue( int ); //прототип (передача по значению)

int main() {
    int x=2;
    cout<<"x = "<<ByValue(x)<<endl;

    return 0;
}

int ByValue (int number)
{
    return number*=number;// аргумент вызывающего не изменяется
}
#include <iostream>
/*
 * передача по ссылке
 */
using namespace std;
void ByReference( int & ); //прототип (передача по ссылке)

int main() {
    int x=4;
    cout<<"x = "<<x<<endl;
    ByReference(x);
    cout<<"x = "<<x<<endl;

    return 0;
}

void ByReference (int &numberRef)
{
    numberRef*=numberRef;// аргумент вызывающего модицируется
}

Одномерный МассивВ С++ массивы автоматически передаются по ссылке, а не по значению. Но для отдельных элементов массива нужно явным образом применять & иначе будет передаваться по значению, а не по ссылке. То есть нужно различать способ передачи массива целиком и его элементов.
#include <iostream>
/*
 * передача по ссылке
 */
using namespace std;
void modifyArray( int [], int ); //прототип передачи по ссылке
void modifyElement( int ); //прототип передачи по значению элемента массива
void modifyElementRef( int &);  //прототип передачи по ссылке элемента массива

int main() {
    const int arraySize = 5;
    int arr[arraySize] = {0,1,2,3,4}; //инициализация массива
    //передать массив arr в modifyArray по ссылке. передать размер массива.
    modifyArray( arr, arraySize);
    for (int j=0;j < arraySize;j++) cout<<arr[j];
    cout<<"\n";
    modifyElement( arr[3]);
    modifyElementRef( arr[3]);
    for (int j=0;j < arraySize;j++) cout<<arr[j];
    cout<<"\n";

    return 0;
}
//b указывает в памяти на исходный массив arr
void modifyArray (int b[], int sizeOfArray)
{
    //умножить каждый эелемент массива на 2
    for (int k=0;k < sizeOfArray;k++) b[k]*=2;
}
void modifyElement( int e)
{//e является локльной копией элемента массива arr[3]
    //умножить параметр на 2
    cout<<(e*=2)<<endl;
}
void modifyElementRef( int &eRef)
{//eRef является ссылкой на элемент массива arr[3]
    //умножить параметр на 2
    eRef*=2;
}

Двумерный Массив (матрица)

#include <iostream>
/*
 * передача по ссылке двумерного массива
 */
using namespace std;
const int row = 2, col =3;//описание размерности массива
void printArray( int [][col]); //прототип передачи по ссылке для двумерного массива

int main() {
    int arr1[2][3] = {0,1,2,3,4}; //инициализация массива
    //передать массив arr1 в printArray по ссылке
    printArray( arr1);

    return 0;
}

void printArray (int a[][col])
{
    //вывести элементы массива
    for (int r=0;r < 2;r++){
        for (int c=0;c < col;c++)
            cout<<a[r][c];
    }
}

Принцип наименьших привилегий

  • Принцип наименьших привилегий:
    • Функциям не следует предоставлять возможность модифицирования массивов, если это не является совершенно необходимым. Используйте квалификатор const.
    • Передавайте аргументы по значению, если только вызывающая функция явно не требует, чтобы значения ее переменных, передаваемых вызываемой функции, модифицировались последней.

Обработка аргументов командной строки int argc, char **argv

  • int argc - в данный параметр записывается значение, равное количеству аргументов командной строки.
  • char *argv[] - массив строк, в который помещаются непосредственно значения аргументов командной строки. Первый параметр argv[0] в массиве указателей argv - название программы.
//Код C++
    for (int i=0;i<argc;i++, *argv++){
        cout<<*argv<<"\n";
    };
    //OR
    for (int i=0;i<argc;i++){
        cout<<argv[i]<<'\n';
        if(strcmp(argv[i],"-kk")==0) cout<<"-kk key ";//обработка ключа
    };
//Код C
#include <stdio.h>
 
int main( int argc, char ** argv ){
        while ( argc-- )
                printf("%s\n", *argv++);
        return 0;
}
#include <stdio.h>
int main(int argc, char *argv[]){
	int i=0;
	for (i=0;i<argc;i++){
		printf("Argument %d: %s\n",i,argv[i]);
	};
};
zametki_po_jazyku_c.txt · Последние изменения: 2011/08/15 08:09 (внешнее изменение)