【C++】this 指針和對象數組詳解

目錄

1. 涉及到兩個對象時,需要使用this指針

2. 如何將兩個要比較的對象提供給成員函數呢?

3. 回顧const 成員函數

 4. const Stock & topval ( const Stock & s ) const 解讀

5. topval如何實現?

6. this是返回對象的地址,*this是對象

程序實現

stock20.h

usestock2.cpp

運行結果:

 值得注意的是


 

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是指針地址

再見了是析構函數特意顯示的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章