首先将代码附上:
头文件:
1 #ifndef STOCK10_H_ 2 #define STOCK10_H_ 3 4 #include <string> 5 6 class Stock 7 { 8 private: 9 std::string company; 10 long shares; 11 double share_val; 12 double total_val; 13 void set_tot() { total_val = shares * share_val; } 14 public: 15 Stock(); 16 Stock(const std::string & co, long n = 0, double price = 0.0); 17 ~Stock(); // destructor 18 void buy(long num, double price); 19 void sell(long num, double price); 20 void update(double price); 21 void show()const; 22 const Stock & topval(const Stock & s) const; 23 }; 24 25 #endif
函数声明:
1 // classstock.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include "stock20.h" 6 #include <iostream> 7 8 Stock::Stock() 9 { 10 std::cout<<"default constructor called\n"; 11 company = "no name"; 12 shares = 0; 13 share_val = 0; 14 total_val = 0; 15 } 16 Stock::Stock(const std:: string& co, long n, double pr) 17 { 18 company = co; 19 if (n < 0) 20 { 21 std::cout<<"share可能小于零吗!!!\n" 22 << company << "shares设置成零啦"; 23 shares = 0; 24 } 25 else 26 shares = n; 27 share_val = pr; 28 set_tot(); 29 } 30 Stock::~Stock() 31 { 32 33 } 34 void Stock::buy(long num, double price) 35 { 36 if (num < 0) 37 { 38 std::cout<<"不能小于零啊!!\n" 39 <<"abortion"; 40 } 41 else{ 42 shares += num; 43 share_val = price; 44 set_tot(); 45 } 46 47 48 49 } 50 void Stock::sell(long num, double price) 51 { 52 if (num < 0) 53 { 54 std::cout<<"不能小于零啊!!\n" 55 <<"abortion"; 56 } 57 else if (num > shares){ 58 std::cout<<"你没那么多呀!!\n" 59 <<"abortion"; 60 } 61 else 62 { 63 shares -= num; 64 share_val = price; 65 set_tot(); 66 } 67 } 68 void Stock::update(double price) 69 { 70 share_val = price; 71 set_tot(); 72 } 73 void Stock::show()const 74 { 75 std::cout << "Company" << company 76 << " Shares" << shares << '\n' 77 << " Share Price: $" << share_val 78 << " Total Worth: $" << total_val<< '\n'; 79 } 80 const Stock& Stock::topval (const Stock & s) const 81 { 82 if(s.total_val > total_val) 83 return s; 84 else 85 return *this; 86 87 }
主函数:
1 //compile with stock10.cpp 2 #include "StdAfx.h" 3 #include <iostream> 4 #include "stock20.h" 5 6 const int STKS = 4; 7 int main() 8 { 9 /*{ 10 using std::cout; 11 cout << "Using constructors to creat new objects\n"; 12 Stock stock1("NanoSmart", 12, 12.0); 13 stock1.show(); 14 Stock stock2("Boffo Objects", 2, 2.0); 15 stock2.show(); 16 17 cout << "Assigning stock1 to stock2:\n"; 18 stock2 = stock1 ; 19 cout << "Listing stock1 and stock2:\n"; 20 stock1.show(); 21 stock2.show(); 22 23 cout << "Using a constructor to reset an object:\n"; 24 stock1 = Stock("Nifit Foods", 10, 50.0); 25 cout << "Revised stock1:\n"; 26 stock1.show(); 27 cout << "Done!\n"; 28 29 } 30 return 0;*/ 31 Stock stocks[STKS] = { 32 Stock("NanoSmart", 12, 20.0), 33 Stock("Boffo Objects", 200, 2.0), 34 Stock("Monolthic Obelisks", 130, 3.25), 35 Stock("Fleep Enterprises", 60, 6.5), 36 }; 37 std::cout<<"Stock holdings:\n"; 38 int st; 39 for (st = 0; st < STKS; st++) 40 stocks[st].show(); 41 //const Stock * top = &stocks[0]; 42 const Stock *top = new Stock("NanoSmart", 12, 20.0); // 与上一句的效果相同 43 top->show(); 44 std::cout<< "address top "<<⊤ 45 std::cout<<"address 0 "<<&stocks[0]; 46 for(st = 1; st < STKS; st++) 47 { 48 top = &top->topval(stocks[st]); 49 std::cout<< "address top"<<⊤ 50 } 51 std::cout << "\nthe most valuable holding:\n"; 52 top->show(); 53 54 55 }
关于 主函数中
const Stock * top = &stocks[0]; 的理解
起初我不太明白 Stock前为什么要加const,后来明白了在c++中const是针对对象,而并不是针对类的,因此 const的限定对象应当是 Stock* 即指向Stock的指针。
因此这条语句初看像是给top赋予了一个地址,但是在运行中,实际上创建了一个 Stock类的 top,并且其访问方式为 top->...
同时阅读函数声明中:
80 const Stock& Stock::topval (const Stock & s) const
81 {
82 if(s.total_val > total_val)
83 return s;
84 else
85 return *this;
此函数是为了求其最大值,而top也是为求其最大值所设置。 这个函数的返回类型为*this 指针,是不是
const Stock * top = &stocks[0];就是将this指针赋给了 top (因为其访问方式相同),同时也将其中的成员带给了top。
以上仅仅是我猜想的结果,这个问题仍然有疑惑。
附上运行时的结果:
利用 new 创建新变量时的结果
利用 const Stock * top...创建时的结果:
可以看到结果是相同的.