Форум программистов, компьютерный форум CyberForum.ru

Шаблоны С++ - C++

Восстановить пароль Регистрация
 
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
01.03.2011, 02:44     Шаблоны С++ #1
Есть функция Merge из алгоритма сортировки слиянием, она объединяет два массива A и B, результат записывает в массив C:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<class T> void Merge(T const *const A, int const nA,
                             T const *const B, int const nB,
                             T *const C)
{ //Выполнить слияние массива A, содержащего nA элементов,
  //  и массива B, содержащего nB элементов.
  //  Результат записать в массив C.
 
    int a(0), b(0); //Номера текущих элементов в массивах A и B
 
    while( a+b < nA+nB ) //Пока остались элементы в массивах
    {
        if( (b>=nB) || ( (a<nA) && (A[a]<=B[b]) ) )
        { //Копирую элемент из массива A
            C[a+b] = A[a];
            ++a;
        } else { //Копирую элемент из массива B
            C[a+b] = B[b];
            ++b;
        }
    }
}
У меня есть 2 вопроса:
1)Что объявлено T const *const A ( зачем 2 раза употребляется const ), к чему относится const в объявлении T *const C ?..
2)Что такое int a(0), b(0);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2011, 02:44     Шаблоны С++
Посмотрите здесь:

Шаблоны в C++ C++
C++ шаблоны
Шаблоны C++
C++ Шаблоны
Шаблоны C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.03.2011, 02:49     Шаблоны С++ #2
BrumbleHorse, T const* const A - значит константный указатель на константный объект.
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main()
{
    const int* const some=new int(5);
    int b=0;
    some=&b;
    *some=b;
        delete some;
}
Обе попытки изменить объект вызовут ошибку.
int a(0) эквивалентно int a=0 т.е. инициализация переменной. Для сложных типов - вызов конструктора
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
01.03.2011, 02:53  [ТС]     Шаблоны С++ #3
как я понимаю в объявлении T *const C мы объявляем С как костантный указатель на объект обобщенного типа.. Соответственно менять указатель не можем, но можем менять элементы массива на начало которого он указывает

Добавлено через 1 минуту
Все, тогда правильно понял, спасибо..
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.03.2011, 02:55     Шаблоны С++ #4
BrumbleHorse, Нет.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
template<class T>
void foo(const T* const Arr, int size)
{
    int f=0;
    Arr=&f;
    *Arr=f;
    *(Arr+1)=f;
    *(Arr+2)=f;
}
 
int main()
{
    const int size=10;
    int* Arr=new int[size];
    for(int i=0; i<size; ++i)
        Arr[i]=i+1;
    foo(Arr, size);
}
BrumbleHorse
 Аватар для BrumbleHorse
120 / 120 / 11
Регистрация: 18.09.2010
Сообщений: 212
01.03.2011, 03:01  [ТС]     Шаблоны С++ #5
Гм, не понял к чему это.. Если T const *const A, то да, мы не можем ни указатель менять, ни элементы массива на которые он указывает.. А если T *const C, то мы не можем менять указатель, но присваивание С[i]=A[i] будет правомерным..
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.03.2011, 03:06     Шаблоны С++ #6
Впринципе то менять можно. Но я думаю оно того не стоит.

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>
 
template<class T>
void foo(const T* const Arr, int size)
{
    T* OtherP3=const_cast<T*>(Arr);
    *OtherP3=T();
    *(OtherP3+size-1)=T();
}
 
template<class T>
void print(const T* const Arr, int size)
{
    for(int i=0; i<size; ++i)
    {
        std::cout<<Arr[i]<<' ';
    }
    std::cout<<'\n';
}
 
int main()
{
    const int size=10;
    int* Arr=new int[size];
    for(int i=0; i<size; ++i)
        Arr[i]=i+1;
    print(Arr, size);
    foo(Arr, size);
    print(Arr, size);
    delete[] Arr;
}
Добавлено через 31 секунду
BrumbleHorse, Да. Неверно прочитал ваш пост прошлый. Если const T* - можем.
Yandex
Объявления
01.03.2011, 03:06     Шаблоны С++
Ответ Создать тему
Опции темы

Текущее время: 06:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru