MENU
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » форум cotaline » разное » c++. полезное (немного из с)
c++. полезное
patronДата: Среда, 09.09.2015, 21:35 | Сообщение # 1
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Репутация: 0
Статус: Offline
Определить четность x

!(x%2) ? printf("%d",x) : printf("No");
 
patronДата: Четверг, 10.09.2015, 20:54 | Сообщение # 2
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Репутация: 0
Статус: Offline
Пузырьковая сортировка, для контейнеров, без временных переменных:

template <typename T >
void bubble_sort( T &a )
{
    for( T::size_type i = 0; a.size() && i < a.size() - 1; ++i )
    {
        for( T::size_type j = i; j + 1 > 0; --j )
        {
            if( a > a[j+1] )
            std::swap( a, a[j+1] );     
       }
    }
}

std::vector<int> v;
v.push_back( 7 );
v.push_back( 1000 );
v.push_back( 134 );
v.push_back( 23 );
v.push_back( 1 );
bubble_sort( v );
 
patronДата: Пятница, 11.09.2015, 20:04 | Сообщение # 3
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Репутация: 0
Статус: Offline
Код переворота строки для контейнеров, без временных переменных, не осуществляющий прохода по всей строке:

template <typename T >
void invert_string( T &a )
{
    T::size_type length = a.size();
    for( T::size_type i = 0; i < (length/2); ++i )
    {
        std::swap( a, a[length - i - 1] );
    }
}

std::string str = "abcdefg";
invert_string(str);
 
patronДата: Понедельник, 14.09.2015, 20:18 | Сообщение # 4
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Репутация: 0
Статус: Offline
Приведение типов в стиле языка C

Приведение типов в стиле языка C может привести выражение любого типа к любому другому типу данных (исключение это приведение пользовательских типов по значению, если не определены правила их приведения, а также приведение вещественного типа к указателю или наоборот). К примеру, unsigned int может быть преобразован к указателю на double. Данный метод приведения типов может быть использован в языке C++. Однако, метод приведения типов в стиле языка C не делает проверки типов на совместимость, как это могут сделать static_cast и dynamic_cast на этапе компиляции и на этапе выполнения соответственно. При этом все, что умеют const_cast и reinterpret_cast данный метод приведения типов делать может.

Общий вид приведения:

(new_type)exp

, где new_type – новый тип, к которому приводим, а exp – выражение, которое приводится к новому типу.

Т.к. данный оператор не имеет зарезервированного ключевого слова (например, static_cast) найти все места приведения типов в тексте программы будет не очень удобно, если это потребуется.

#include <iostream>
//Пустые классы только
//для теста приведения
struct AAA{
};
struct BBB{
};
//Наследники BBB
struct BBB_X:BBB{
};
struct BBB_Y:BBB{
};

int main()
{
    //Переменные простых типовы и указатели на переменные простых типов
    int i = 5;        
    double d = 111.222;
    char c = 'a';
    int* pi = &i;
    double * pd = &d;
    const int* cpi = &i;
    void* v = NULL;
    //Объекты классов
    AAA A;
    BBB B;
    BBB_X BX;
    BBB_Y BY;
    //Указатели на объекты классов
    AAA* pA = &A;
    BBB* pB = &B;
    BBB_X* pBX = &BX;
    BBB_Y* pBY = &BY;
    //Приводим явно double к int
    i = (int)d;
    //и наоборот
    d = (double)i;
    //указатель на int к char
    c = (char)pi;
    //char к указателю на void
    v = (void*)c;
    //указатель на void к указателю на int
    pi = (int*)v;
    //Снимаем константность const int*
    pi = (int *) cpi;
    //Приводим указатель на объект AAA к указателю на объект BBB
    //из разных иерархий
    pA = (AAA*) pB;
    //Приводим указатель на double к double
    d = (double)pd;//Ошибка!!!
    //А если наоборот?
    pd = (double*)d;//Ошибка!!!
    //Перемещение из одной иерархии наследования в другую
    pB = (BBB*)pBX;
    pBY = (BBB_Y*) pB;
    return 0;
}
 
patronДата: Среда, 16.09.2015, 21:06 | Сообщение # 5
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Репутация: 0
Статус: Offline
const_cast

Оператор приведения const_cast удаляет или добавляет квалификаторы const и volatile с исходного типа данных (простые типы, пользовательские типы, указатели, ссылки). Например, был const int, а после преобразования стал int или наоборот. Квалификаторы const и volatile называют cv-квалификаторы (cv-qualifiers). Данные квалификаторы указываются перед именами типов. Как ни трудно догадаться квалификатор const задает константность, т.е. защищает переменную от изменения. Квалификатор volatile говорит о том, что значение переменной может меняться без явного выполнения присваивания. Это обеспечивает защиту от оптимизации компилятором операций с данной переменной.

Общий вид приведения:

const_cast<new_type>(exp)
 
patronДата: Среда, 16.09.2015, 21:06 | Сообщение # 6
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Репутация: 0
Статус: Offline
#include <iostream>
//Снятие константности
void test_func_X(const int* in1, const int& in2)
{
        int *p;
        //Сняли константность и записали 33
        p = const_cast<int*>(in1);
        *p = 33;
        //Сняли константность и записали 55
        const_cast<int&>(in2) = 55;
    }
//Добавление константности
void test_func_Y(int* in1, int& in2)
{
    const int *p;
    //Добавили константность
    //и пытаемся записать 33
    p = const_cast<const int*>(in1);
    *p = 33;//Ошибка !!!
    //Добавили константность константность
    //и пытаемся записалть 33
    const_cast<const int&>(in2) = 55;//Ошибка!!!
}
//Снятие volatile
void test_func_Z(volatile int* in1, volatile int& in2)
{
    int *p;
    //Сняли volatile и записали 33
    p = const_cast<int*>(in1);
    *p = 33;
    //Сняли volatile и записали 55
    const_cast<int&>(in2) = 55;
}
//Добавление volatile
void test_func_A(int* in1, int& in2)
{
    volatile int *p;    
    //Добавили volatile и записали 33
    p = const_cast<volatile int*>(in1);
    *p = 33;
    //Добавили volatile и записали 55
    const_cast<volatile int&>(in2) = 55;
}

int main()
{
    int x=3,y=5;    
    std::cout<<x<<" "<<y<<std::endl;
    //Снимаем константность
    test_func_X(&x,y);
    std::cout<<x<<" "<<y<<std::endl;
    x=3;
    y=5;
    //Добавляем константность
    test_func_Y(&x,y);//Ошибка!!!
    std::cout<<x<<" "<<y<<std::endl;
    //Снимаем volatile
    test_func_Z(&x,y);
    std::cout<<x<<" "<<y<<std::endl;
    x=3;
    y=5;
    std::cout<<x<<" "<<y<<std::endl;
    //Добавляем volatile
    test_func_A(&x,y);
    std::cout<<x<<" "<<y<<std::endl;
    system("pause");
    return 0;
}
 
patronДата: Воскресенье, 20.09.2015, 14:49 | Сообщение # 7
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Репутация: 0
Статус: Offline
reinterpret_cast

Оператор приведения reinterpret_cast используется для приведения несовместимых типов. Может приводить целое число к указателю, указатель к целому числу, указатель к указателю (это же касается и ссылок). Является функционально усеченным аналогом приведения типов в стиле языка С. Отличие состоит в том, что reinterpret_cast не может снимать квалификаторы const и volatile, а также не может делать небезопасное приведение типов не через указатели, а напрямую по значению. Например, переменную типа int к переменной типа double привести при помощи reinterpret_cast нельзя.

Общий вид приведения:

reinterpret_cast<new_type>(exp)
 
patronДата: Воскресенье, 20.09.2015, 14:50 | Сообщение # 8
Генерал-лейтенант
Группа: Администраторы
Сообщений: 128
Репутация: 0
Статус: Offline
#include <iostream>
//Пустые классы только
//для теста приведения
struct AAA{
};
struct BBB{
};
//Наследники BBB
struct BBB_X:BBB{
};
struct BBB_Y:BBB{
};

int main()
{
//Переменные простых типовы и указатели на переменные простых типов
int i = 5;
double d = 111.222;
char c = 'a';
int* pi = &i;
double * pd = &d;
const int* cpi = &i;
void* v = NULL;
//Объекты классов
AAA A;
BBB B;
BBB_X BX;
BBB_Y BY;
//Указатели на объекты классов
AAA* pA = &A;
BBB* pB = &B;
BBB_X* pBX = &BX;
BBB_Y* pBY = &BY;
//Приводим явно double к int
i = reinterpret_cast<int>(d);//Ошибка!!!
//и наоборот
/d = reinterpret_cast<int>(i);//Ошибка!!!
//указатель на int к char
c = reinterpret_cast<char>(pi);
//char к указателю на void
v = reinterpret_cast<void*>©;
//указатель на void к указателю на int
pi = reinterpret_cast<int*>(v);
//Снимаем константность const int*
pi = reinterpret_cast<int *>(cpi);//Ошибка!!!
//Приводим указатель на объект AAA к указателю на объект BBB
//из разных иерархий
pA = reinterpret_cast<AAA*>(pB);
//Приводим указатель на double к double
d = reinterpret_cast<double>(pd);//Ошибка!!!
//А если наоборот?
pd = reinterpret_cast<double*>(d0;//Ошибка!!!
//Перемещение из одной иерархии наследования в другую
pB = reinterpret_cast<BBB*>(pBX);
pBY = reinterpret_cast<BBB_Y*>(pB);
return 0;
}
 
Форум » форум cotaline » разное » c++. полезное (немного из с)
  • Страница 1 из 1
  • 1
Поиск: