1. Consider a class called BookTag which has a string topic, and a vector of strings of books relevant to that topic. These data members are dynamically allocated, create the copy constructor, assignment operator, and destructor for this class. 2. Why do we need the "big three" for classes with dynamically allocated data members in them? 3. What is the consequence of not defining the "big three" for classes with dynamically allocated data members? 4. What is the use of dynamic memory allocation? 5. Consider the following code : class Composite { public: // Overloaded assignment (=) operator prototype // Default copy constructor prototype }; int main() { Composite c1,c2; Composite c3 = c1; ------------------ (a) c3 = c2; ------------------ (b) } Which function will be called at line (a) in the above code? Which will be called at line (c)? Why? 6. Is the following code correct? What will happen if this is executed? Will an error be given? If yes, which one? If not, what will go wrong? Think about which calls will be made, in what order. class Dog() { int *ptr; public: Dog() { ptr = new int[10]; } bark() { cout << "Woof Woof!"; } ~Dog() { delete ptr; } }; int main() { Dog *tommy = new Dog; if(!tommy) { cout << "Dog creation failed"; exit(0); } tommy->bark(); delete tommy; } As all these questions are detailed, there are only 6 questions this time. 7. Are new and delete operators? Can you overload them?