目錄
4. const Stock & topval ( const Stock & s ) const 解讀
1. 涉及到兩個對象時,需要使用this指針
class Stock
{
private:
...
double total_val;
...
public:
double total() const { return total };
...
};
2. 如何將兩個要比較的對象提供給成員函數呢?
假設改方法命名爲topval()
stock1.topval()訪問stock1對象的數據
stock2.topval()訪問stock2對象的數據
如果將兩個對象進行比較,必須將第二個對象作爲參數傳遞給它
作爲引用傳遞的話,效率更高
topval()方法使用一個類型爲const Stock & 參數
如何將答案傳遞給調用程序呢?讓方法返回一個引用,引用指向比較高的對象
const Stock & topval ( const Stock & s ) const ;
3. 回顧const 成員函數
4. const Stock & topval ( const Stock & s ) const 解讀
返回類型爲const Stock &的引用;topval這裏是隱式訪問,括號裏是顯式訪問
5. topval如何實現?
class Stock
{
private:
...
double total_val;
...
public:
double total() const { return total };
...
};
6. this是返回對象的地址,*this是對象
const Stock & Stock :: topval(const Stock & s) const
{
if (s.total_val > total_val)
return s;
else
return *this;
}
//回顧
class Stock
{
private:
...
double total_val;
...
public:
double total() const { return total };
...
};
程序實現
stock20.h
// stock20.h -- Stock class interface
// 版本 20 類的聲明
#ifndef STOCK20_H_
#define STOCK20_H_
#include<string>
class Stock
{
public:
//構造函數,重載實現兩種方式
Stock();
Stock(const std::string & co, long n = 0, double pr = 0.0);
//析構函數
~Stock();
void buy(long num, double price);
void sell(long num, double price);
void update(double price);
void show()const;
//10.4節新內容,this指針返回
//返回兩個對象的比較
const Stock & topval(const Stock & s) const;
private:
std::string company;
long shares; //股票數量
double share_val; // 每股的價格
double total_val; //股票的總價格
void set_tot()
{
total_val = shares*share_val;
}
};
#endif
stock20.cpp
// stock20.cpp -- 對類stock20.h進行函數描述
// 版本還是00
#include<iostream>
#include"stock20.h"
//構造函數
Stock::Stock()
{
std::cout << "默認參數設置,這裏是構造函數\n";
company = "no name";
shares = 0;
share_val = 0.0;
total_val = 0.0;
}
Stock::Stock(const std::string & co, long n, double pr)
{
company = co;
if (n < 0)
{
std::cout << "股票數量不能設置爲0; "
<< company << " shares set to 0. \n";
shares = 0;
}
else
{
shares = n;
}
share_val = pr;
set_tot();
}
//析構函數
Stock::~Stock()
{
std::cout << "再見了, " << company << "!\n";
}
void Stock::buy(long num, double price)
{
if (num < 0)
{
std::cout << "股票購買數量不能是負數。" << "交易被終止了!!\n";
}
else
{
shares += num;
share_val = price;
set_tot();
}
}
void Stock::sell(long num, double price)
{
using std::cout;
if (num < 0)
{
cout << "股票不能賣負數,你腦筋有問題?" << "中斷交易了";
}
else if (num>shares)
{
cout << "你自己有幾個股票不清楚嗎?你能賣比自己持有還多的股票嗎?!" << "交易終止!!!";
}
else
{
shares -= num;
share_val = price;
set_tot();
}
}
void Stock::update(double price)
{
share_val = price;
set_tot();
}
// 設置輸出的數字格式
void Stock::show() const
{
using std::cout;
using std::ios_base;
//設置格式爲#.###
ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);
std::streamsize prec = cout.precision(3);
cout << "Company: " << company
<< " Shares: " << shares << '\n';
cout << " Share Price: $ " << share_val;
//設置格式爲#.##
cout.precision(2);
cout << " Total Worth: $" << total_val << '\n';
//重新恢復原來的格式
cout.setf(orig, ios_base::floatfield);
cout.precision(prec);
}
const Stock & Stock::topval(const Stock & s) const
{
if (s.total_val>total_val)
{
return s;
}
else
{
return *this;
}
}
usestock2.cpp
// usestock2.cpp -- 使用stock class
//記得與stock20.cpp編譯一起
//展示對象數值的使用
#include<iostream>
#include"stock20.h"
const int STKS = 4;
int main()
{
//初始化對象數組
Stock stocks[STKS] =
{
Stock("Nanosmart", 12, 30.0),
Stock("Mary", 204, 34.5),
Stock("Jack", 324, 2.3),
Stock("Allen", 23, 54.4)
};
std::cout << "擁有這些股票:\n";
int st;
for (int st = 0; st < STKS; st++)
{
stocks[st].show();
}
//設置指針指向第一個元素
const Stock * top = &stocks[0];
for (int st = 0; st < STKS; st++)
{
top = &top->topval(stocks[st]);
}
std::cout << "\n 現在最有價值的股票是:\n";
std::cout<<"看這裏的bug"<< std::endl;
top->show();
return 0;
}
運行結果:
值得注意的是
show那裏是用了const
top->show()這個用法,top是指針地址
再見了是析構函數特意顯示的