Q1. Note that in the statement Array m1(N);, the constructor of Array class 
    is invoked. And hence the running time is O(N).

Q2. There are two statements that we need to analyze
    Array m1(N); -> This is O(N) by Q1.
    
    for (int i = 0; i < N; i++) {
	doNothing (m1);
    }

    For this one note that the for loop is executed N times. Next we need to 
    analyze the running time of doNothing function. It may appear that the
    running time of doNothing is O(1) because the function just returns without 
    doing anything. However notice that the parameter to the function
    doNothing is passed by value. Thus when the function doNothing is invoked,
    the copy constructor is invoked and the argument m1 is copied into the
    formal parameter a of the function. This takes time O(N). Thus
    the running time of the function call is O(N). Thus the running time of
    the overall piece of code is N*O(N) = O(N^2).

Q3. Pass by reference means that no copying of the argument m1 to the
    formal parameter a takes place. a and m1 refer to the same object. 
    Thus running time of the function call is O(1). And hence the 
    running time of the above piece of code is N*O(1) = O(N).