本次練習(xí)的內(nèi)容,涉及到C++中類的構(gòu)造函數(shù),默認(rèn)構(gòu)造函數(shù),副本構(gòu)造函數(shù),構(gòu)造函數(shù)中的成員初始化列表,類的數(shù)據(jù)成員,類的成員函數(shù),友元函數(shù),等技術(shù)點(diǎn)。
下面有4道題:
1、創(chuàng)建一個簡單的類Integer,它只有一個私有數(shù)據(jù)成員int。為這個類提供構(gòu)造函數(shù),并使用它們輸出創(chuàng)建對象的消息。提供類的成員函數(shù),獲取和設(shè)置數(shù)據(jù)成員,并輸出該值。編寫一個測試程序,創(chuàng)建和操作幾個Integer對象。在測試程序中獲取,設(shè)置和輸出每個對象的數(shù)據(jù)成員值,以驗(yàn)證這些函數(shù)。
2、修改上一題類Integer的構(gòu)造函數(shù),把數(shù)據(jù)成員初始化為初始化列表中的0,并實(shí)現(xiàn)類的副本構(gòu)造函數(shù)。編寫一個成員函數(shù),比較當(dāng)前對象和作為參數(shù)傳送的Interger對象。如果當(dāng)前對象小于參數(shù),該函數(shù)就返回-1,如果它們相等,函數(shù)就返回0,如果當(dāng)前對象大于參數(shù),函數(shù)就返回+1。測試該函數(shù)的兩個版本:第一個版本的參數(shù)按值傳送,第二個版本的參數(shù)按引用傳送。在調(diào)用函數(shù)時,構(gòu)造函數(shù)會輸出什么結(jié)果?解釋出現(xiàn)這種結(jié)果的原因。類中的函數(shù)不能是重載函數(shù),為什么?
3、為類Integer實(shí)現(xiàn)成員函數(shù)add()、subtract()和multiply(),對當(dāng)前對象和Integer類型的參數(shù)值進(jìn)行加、減和乘法運(yùn)算。在類中用main()演示這些函數(shù)的操作,main()創(chuàng)建幾個Integer對象,它們分別包含值4、5、6、7和8,再使用這些對象計算4*5*5*5+6*5*5+7*5+8的值。實(shí)現(xiàn)這些函數(shù),使計算和結(jié)果的輸出在一個語句中完成。
4、修改題2的解決方法,把compare() 函數(shù)實(shí)現(xiàn)為類Integer的一個友元。
參考答案:

Integer.h
#ifndef INTEGER_H
#define INTEGER_H
class Integer {
public:
Integer();
Integer(int m);
Integer(Integer& integer);
void setValue(int m) { value = m; }
int getValue() { return value; }
//int compare(const Integer integer) const;
int compare(const Integer& integer) const;
friend int compare(const Integer& ineger1, const Integer& integer2);
Integer* add(const Integer& integer) { value += integer.value; return this; }
Integer* add(int m) { value += m; return this; }
Integer* subtract(const Integer& integer) { value -= integer.value; return this; }
Integer* subtract(int m) { value -= m; return this; }
Integer* multiply(const Integer& integer) { value *= integer.value; return this; }
Integer* multiply(int m) { value *= m; return this; }
private:
int value;
};
#endif

integer.cpp
#include <iostream>
#include "integer.h"
using std::cout;
using std::endl;
Integer::Integer():value(0) {
cout << "Default constructor called." << endl;
}
Integer::Integer(int m):value(m) {
cout << "Constructor called." << endl;
};
Integer::Integer(Integer& integer):value(integer.value) {
cout << "Copy constructor called." << endl;
//value = integer.value+100;
}
/*int Integer::compare(const Integer integer) const {
int m = value;
int n = integer.value;
if (value<integer.value)
return -1;
else if (value==integer.value)
return 0;
return 1;
}*/
int Integer::compare(const Integer& integer) const {
cout << "&" << endl;
if (value<integer.value)
return -1;
else if (value==integer.value)
return 0;
return 1;
}
// main.cpp
#include <iostream>
#include "integer.h"
using std::cout;
using std::endl;
void main() {
Integer integer;
cout << "Default value of integer: " << integer.getValue() << endl;
integer.setValue(100);
cout << "Value of integer: " << integer.getValue() << endl;
Integer int2(integer);
cout << "Copy obj: " << int2.getValue() << endl;
Integer int3(999);
cout << int3.getValue() << endl;
int result = int2.compare(int3);
cout << result << endl;
result = compare(int2, int3);
cout << result << endl;
// 4*5*5*5 + 6*5*5 + 7*5 + 8
Integer int4(4);
Integer int5(5);
Integer int6(6);
Integer int7(7);
Integer int8(8);
Integer* result2 = int4.multiply(int5)->multiply(int5)->multiply(int5)->
add(int6.multiply(int5)->multiply(int5)->getValue())->
add(int7.multiply(int5)->getValue())->add(int8);
cout << "4*5*5*5 + 6*5*5 + 7*5 + 8 = " << result2->getValue() << endl;
}
int compare(const Integer& ineger1, const Integer& integer2){
cout << "friend function:" << endl;
if (ineger1.value<integer2.value)
return -1;
else if (ineger1.value==integer2.value)
return 0;
return 1;
}