Thursday, January 26, 2012

Default Arguments and Copy Classes

接續Class (C++)之後,來談論Constructor的arguments預設值,假設有一個Class叫做Number,他的Constructor Prototype長這樣:
Number(int = -1, int = -1, int = -1);
當我們使用時,若給予參數:
Number num1(1, 2, 3);
Constructor得到的參數會依序為1, 2, 3;然而如果不給予參數:
Number num2;

Constructor就會讀取到預設的參數-1, -1, -1(被定義在Prototype裡面)




另外來談論複製class instances的問題,若是我們把上頭的num2 = num1,num2會擁有和num1一模一樣的class members,是透過copy by value的方式,所以往後更改num2都不會改到num1,這樣的方法比較安全,但是若num1存的值很大,將會沒有效率。

更需要注意的是,他並非是呼叫Constructor進行複製,不論是否在Constructor初始化的class members都會被複製。

(以下參照Write C++ Code in Mutli-files的作法)

Number.h
class Number{
 public:
  Number(int = -1, int = -1, int = -1);
  void display();
  void setD(int);
 private:
  int a;
  int b;
  int c;
  int d;
};

Number.cpp
#include <iostream>
#include "numbers.h"

using namespace std;

Number::Number(int new_a, int new_b, int new_c){
 a = new_a;
 b = new_b;
 c = new_c;
 d = 0;
}

void Number::display(){
 cout << "a=" << a << "\tb=" << b << "\tc=" << c << "\td=" << d << endl;
}

void Number::setD(int new_d){
 d = new_d;
}

Main.cpp
#include <iostream>
#include "numbers.h"

using namespace std;

int main(){

 // declare two new Number instance
 Number num1(1, 2, 3);
 Number num2;

 // set the value of d in num1
 num1.setD(100);

 // display both
 num1.display();
 num2.display();

 // let num2 = num1
 num2 = num1;

 // display num2
 num2.display();

 return 0;
}

Output:
a=1 b=2 c=3 d=100
a=-1 b=-1 c=-1 d=0
a=1 b=2 c=3 d=100