Answer:
void Shape :: member ( Shape s1, Shape s2 ) ; // pass by value
void Shape :: member ( Shape *s1, Shape *s2 ) ; // pass by pointer
void Shape :: member ( Shape& s1, Shape& s2 ) const ; // pass by reference
void Shape :: member ( const Shape& s1, const Shape& s2 ) ; // pass by const reference
void Shape :: member ( const Shape& s1, const Shape& s2 ) const ; // plus the function is const
Explanation:
void Shape :: member ( Shape s1, Shape s2 ) ; // pass by value
The s1 and s2 objects are passed by value as there is no * or & sign with them. If any change is made to s1 or s2 object, there will not be any change to the original object.
void Shape :: member ( Shape *s1, Shape *s2 ) ; // pass by pointer
The s1 and s2 objects are passed by pointer as there is a * sign and not & sign with them. If any change is made to s1 or s2 object, there will be a change to the original object.
void Shape :: member ( Shape& s1, Shape& s2 ) const ; // pass by reference
The s1 and s2 objects are passed by reference as there is a & sign and not * sign with them. If any change is made to s1 or s2 object.
void Shape :: member ( const Shape& s1, const Shape& s2 ) ; // pass by const reference
The s1 and s2 objects are passed by reference as there is a & sign and not * sign with them. The major change is the usage of const keyword here. Const keyword restricts us so we cannot make any change to s1 or s2 object.
void Shape :: member ( const Shape& s1, const Shape& s2 ) const ; // plus the function is const
The s1 and s2 objects are passed by reference as there is a & sign and not * sign with them. const keyword restricts us so we cannot make any change to s1 or s2 object as well as the Shape function itself.