Array indexing with copy constructor, assignment operator and index operator overload
This isn't really a code review so much as help on how to get this to compile. 


Array::Array(int *p = NULL, int s = 0){ default parameters go on the declaration, not the definition.*
Array::Array&amp; operator=(Array other){ Qualify the operator with Array::, not the return type. You're not returning an Array::Array**, you're defining the operator= member function of Array
void Array::swap(Array&amp; first, Array&amp; second){ swap is not a member of array, it's a friend. Remove the Array::


*This is because the client (caller) to the method needs to know what the defaults are supposed to be, since default parameters are mostly a syntactic shortcut. If you put the defaults into the definition (e.g. a cpp/.o file), a client which includes the header cannot see the definition and thus cannot use them. In other words, there exists no Array::Array() constructor right now, there's only the Array::Array(int *, int), but through C++ magic it can look as though Array::Array() is being called. 

** An Array::Array type is impossible because you can't name a child type the same as its parent type. It would be ambiguous with the constructor.