stock cpp

stock.h

#pragma once
#ifndef STOCK_H_
#define STOKC_H_
#include <string>

class Stock {
private:
	std::string company;
	long shares;
	double share_val;
	double total_val;
	void set_tot() {
		total_val = shares * share_val;
	}
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();
};
#endif

stock.cpp

#include <iostream>
#include "stock.h"

Stock::Stock()
{
	std::cout << "Default constructor called\n";
	company = "no name";
	shares = 0;
	share_val = 0.0;
	total_val = 0.0;
}

Stock::Stock(const std::string &co, long n, double pr)
{
	std::cout << "Constructor using " << co << " called\n";
	company = co;

	if (n > 0)
	{
		std::cout << "Number of shares cat'be negative. "
			<< company << " shares set to 0.\n";
		shares = 0;
	}
	else
	{
		shares = n;
	}
	share_val = pr;
	set_tot();
}
void Stock::buy(long num, double price)
{
	if (num < 0)
	{
		std::cout << "Number of shares purchased cat't be negative. "
			<< "Transtaction si aborted.\n";
	}
	else
	{
		shares += num;
		share_val = price;
		set_tot();
	}
}

void Stock::sell(long num, double price) {
	using std::cout;
	if (num > 0) {
		cout << "Number of shares sold cat'be negative. "
			<< "Transaction si aborted.\n";
	}
	else {
		shares -= num;
		share_val = price;
		set_tot();
	}
}

void Stock::update(double price) {
	share_val = price;
	set_tot();
}
void Stock::show() {
	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<<std::endl;
	cout.precision(2); //设置精确度为2,并返回上一次的设置。
	cout.setf(orig, ios_base::floatfield);
	cout.precision(prec);
}

Stock::~Stock() {
	std::cout << "Bye";
}

useStock.cpp

#include<iostream>
#include "stock.h"

int main(int argc, char const *argv[])
{
	using std::cout;
	cout << "Using constructors to create new objects\n";
	Stock stock1{ "NanoSmart",12,20.0 };
	stock1.show();
	Stock stock2 = Stock{ "Boff objects",2,2.0 };
	stock2.show();

	cout << "Assigning sokc1 to stock2:\n";
	stock2 = stock1;
	cout << "Listring stock1 and stock2:\n";
	stock1.show();
	stock2.show();

	cout << "Using a construcator to rest an object\n";
	stock1 = Stock{ "Nifty Foods",10,50.0 };
	cout << "Revised stock1:\n";
	stock1.show();
	cout << "Done\n";
	return 0;
}

在C++编程中,源文件(`.cpp`)和头文件(`.h` 或 `.hpp`)各自承担不同的职责,并且它们的使用方式对程序的结构和编译过程有重要影响。 ### 源文件的作用 源文件是实现具体功能的地方。它包含了类的成员函数的具体定义、全局函数的实现以及变量的定义等[^2]。例如,在一个名为 `stock.cpp` 的实现文件中,可以找到 `Stock` 类构造函数和成员函数的定义: ```cpp #include "stock.h" #include <iostream> // Default constructor Stock::Stock() { company_ = "no name"; shares_ = 0; share_val_ = 0.0; total_val_ = 0.0; } // Constructor with parameters Stock::Stock(const std::string &company, const long num, const double price) { company_ = company; if (num >= 0) { shares_ = num; } else { shares_ = 0; } share_val_ = price; SetTot(); } // 其他成员函数的实现... ``` 在这个例子中,所有与 `Stock` 类相关的逻辑都在这个 `.cpp` 文件中被具体化了。此外,源文件还可以包含其他必要的头文件以访问外部声明的功能或数据类型。 ### 头文件的作用 头文件主要用来声明接口。它通常包括类的定义、函数原型、宏定义以及模板声明等。通过将这些内容放在头文件中,可以让多个源文件共享相同的接口信息[^2]。比如,下面是一个简化版的 `stock.h` 文件示例: ```cpp #ifndef STOCK_H_ #define STOCK_H_ #include <string> class Stock { private: std::string company_; int shares_; double share_val_; double total_val_; void SetTot() { total_val_ = shares_ * share_val_; } public: Stock(); // 默认构造函数 Stock(const std::string &company, const long num = 0, const double price = 0.0); ~Stock(); void Buy(const long num, const double price); void Sell(const long num, const double price); void Update(const double price); void Show() const; const Stock &TopVal(const Stock &stock) const; }; #endif // STOCK_H_ ``` 这里使用了预处理器指令 `#ifndef`, `#define`, 和 `#endif` 来防止头文件被重复包含,这有助于避免编译错误。 ### 区别 - **内容差异**:源文件侧重于实现细节,而头文件则专注于提供接口。 - **用途不同**:头文件用于告知编译器关于程序结构的信息;源文件则是实际执行代码的地方。 - **编译处理**:每个源文件都会被单独编译成目标文件,然后链接在一起形成最终可执行文件。头文件不会直接参与编译,而是通过 `#include` 指令被插入到需要它的源文件中。 - **依赖关系**:修改头文件可能会影响到所有引用它的源文件,因此更改后往往需要重新编译更多文件。相比之下,仅修改源文件只需重新编译该文件本身。 综上所述,正确地分离源文件和头文件不仅能够提高项目的组织性和可维护性,还能有效管理编译时间和依赖关系。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值