//от собственности
Оператор присваивания при перемещении Dynlntegers& operator= (Dynlntegers&& MoveSource)
{
if (this != SMoveSource)
{
delete [] plntegers; // освободить собственные ресурсы plntegers = MoveSource.plntegers; MoveSource.plntegers = NULL;
}
return *this;
}
-Dynlntegers() {delete[] plntegers;} // Деструктор
реализовать стандартный конструктор,
конструктор копий, оператор присвоения
Ответы к занятию 13
Контрольные вопросы
1.
|
Оператор dynam i с _ с а s t .
|
2.
|
Исправьте функцию, конечно. Оператор c o n s t c a s t и операторы приведения во
|
|
обще должны быть последним средством.
|
Правда.
Да, правда.
Упражнения
Результат динамической операции приведения всегда должен проверяться на до пустимость:
void DoSomething(Base* pBase)
{
Derived* pDerived = dynamic_cast (pBase);
if(pDerived) // проверка на допустимость
pDerived->DerivedClassMethod();
}
Используйте оператор s t a t i c c a s t , поскольку известно, что указываемый объ ект имеет тип Tuna. Взяв за основу листинг 13.1, можно получить такую функцию m ain ():
int main()
{
Fish* pFish = new Tuna;
Tuna* pTuna = static_cast(pFish);
Tuna::BecomeDinner сработает только при
использовании допустимого Tuna*
pTuna->BecomeDinner();
виртуальный деструктор в Fish гарантирует вызов ~Tuna() delete pFish;
return 0;
Ответы к занятию 14
Контрольные вопросы
Конструкция препроцессора, препятствующая множественному или рекурсивному включению файлов заголовка.
4.
10+10/5 = 10 + 2=12.
Использовать скобки:
#define SPLIT(х) ((х) / 5)
Упражнения
1. Вот он:
#define MULTIPLY(a,b) ((а)* (b))
Вот шаблон, аналогичный макросу из контрольного вопроса 4: template Т Split(const Т& input)
{
return (input / 5);
}
Ш аблон функции swap () будет таким: template
void Swap (T& x, T& у)
ПРИЛОЖЕНИЕ Г. Ответы
temp = х;
= у;
= temp;
}
|
|
|
|
|
4. # d e f in e
|
QUARTER(х)
|
( (х)/ 4)
|
|
5. Определение шаблона класса выглядело бы так:
|
template
|
ctypename ArraylType, typename Array2Type>
|
class TwoArrays
|
|
|
|
{
|
|
|
|
|
private:
|
|
|
[10];
|
|
ArraylType Arrayl
|
|
Array2Type Array2
|
[10];
|
|
public:
|
|
GetArraylElement(int
|
Index){return Arrayl[Index];}
|
ArraylType&
|
Array2Type&
|
GetArray2Element(int
|
Index){return Array2[Index];}
|
Ответы к занятию 15
Контрольные вопросы
Контейнер d eq u e . Только он обеспечивает вставку в начало и в конец контейнера при постоянной продолжительности.
Контейнеры s t d : : s e t или s t d : :map, если у вас пары “клю ч -значение” . Если
элементы м огут дублироваться, выберите контейнеры s t d : : m u l t i s e t или
t d : :m ult im a p .
Да. Когда вы создаете экземпляр шаблона s t d : : s e t , можете также задать второй параметр шаблона, являющийся двоичным предикатом, который класс s e t исполь зует как критерий сортировки. Задайте в этом предикате критерии соответственно вашим требованиям.
М ост между алгоритмами и контейнерами образуют итераторы, чтобы первые (яв ляющ иеся обобщением) могли взаимодействовать с последними, без необходимо сти знать (быть настроенным на) каждый возможный тип контейнера.
Контейнер h a s h _ s e t не является стандартным для C++. Вы не должны исполь зовать его в переносимом приложении, применяйте в таких случаях контейнер
t d : : m a p .
Ответы к занятию 15
Контрольные вопросы
1. Ш аблон s t d : : b a s i c _ s t r i n g <Т>
Скопируйте эти две строки в два строковых объекта. Преобразуйте каждую скопи рованную строку в нижний или в верхний регистр. Получите результат сравнения преобразованных копий строк.
Нет, они не подобны. Строки в стиле С — это фактически простые указатели, родственные символьному массиву, тогда как строка библиотеки STL — это класс s t r i n g , реализую щ ий различные операторы и функции-члены для обработки строк, что делает их применение простым, насколько это возможно.
Упражнения
Программа должна использовать функцию s t d : : r e v e r s e ():
#include #include #include int main ()
{
using namespace std;
cout « "Please enter a word for palindrome-check:" « endl;
string strlnput;
cin » strlnput;
string strCopy (strlnput);
reverse (strCopy.begin (), strCopy.end ());
if (strCopy == strlnput)
cout « strlnput « " is a palindrome!" « endl;
else
cout « strlnput « " is not a palindrome." « endl;
return 0;
}
Используйте функцию s t d : : f i n d ():
#include #include using namespace std;
// Найдите количество символов 'chToFind' в строке "strlnput" int GetNumCharacters (strings strlnput, char chToFind)
{
int nNumCharactersFound = 0;
size_t nCharOffset = strlnput.find (chToFind); while (nCharOffset != string::npos)
{
++ nNumCharactersFound;
nCharOffset = strlnput.find (chToFind, nCharOffset + 1);
}
return nNumCharactersFound;
664 ПРИЛОЖЕНИЕ Г Ответы
int main ()
{
cout « "Please enter a string:" « endl « "> "; string strlnput;
getline (cin, strlnput);
int nNumVowels = GetNumCharacters (strlnput, 'a'); nNumVowels += GetNumCharacters (strlnput, 'e’); nNumVowels += GetNumCharacters (strlnput, 'i *); nNumVowels += GetNumCharacters (strlnput, ’o’); nNumVowels += GetNumCharacters (strlnput, 'u');
// DIY: заглавные буквы обработать также..
cout « "The number of vowels in that sentence is: " « nNumVowels
return 0;
}
Используйте функцию to u p p e r ():
#include #include #include int main ()
{
using namespace std;
cout « "Please enter a string for case-conversion:" « endl; cout « "> ";
string strlnput;
getline (cin, strlnput);
cout « endl;
for ( size_t nCharlndex = 0
nCharlndex < strlnput.length ()
nCharlndex += 2)
strlnput [nCharlndex] = toupper (strlnput [nCharlndex]);
cout « "The string converted to upper case is: " « endl; cout « strlnput « endl « endl;
return 0;
}
Это может быть очень просто реализовано так:
#include #include int main ()
{
using namespace std;
const string strl = "I";
const string str2 = "Love";
const string str3 = "STL";
const string str4 = "String.";
string strResult = strl + " " + str2 + " " + str3 + " " + str4;
cout
|
«
|
"The sentence reads:" « endl;
|
cout
|
«
|
strResult;
|
return
|
0;
|
Ответы к занятию 17
Контрольные вопросы
Нет, не могут. За постоянное время элементы могут быть только добавлены в конец вектора.
Еще 10. При 11-й вставке произойдет повторное резервирование.
Извлекает последний элемент; т.е. удаляет элемент с конца.
Типа CM am m al.
При помощи оператора индексирования ( [ ]) или функции a t ().
Итератор прямого доступа.
Упражнения
Одно из решений таково:
#include #include using namespace std; char DisplayOptions ()
{
cout « "What would you like to do?" « endl ; cout « "Select 1: To enter an integer" « endl;
cout « "Select 2: Query a value given ,an index" « endl;
cout « "Select 3: To display the vector" « endl « "> "
cout « "Select 4: To quit!" « endl « 11^ I.
char ch;
cin » ch;
return ch;
main 0
{
vector vecData;
666 ПРИЛОЖЕНИЕ Г. Ответы
char chUserChoice = '\0f;
while ((chUserChoice = DisplayOptions ()) != '4')
{
if (chUserChoice == '1')
{
Do'stlaringiz bilan baham: |