构造函数
库文件:
//ss.h
#ifndef STOCK_H_
#define STOCK_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);
~Stock();
//void acquire(const std::string& co, long n, double pr);
void buy(long num, double price);
void sell(long num, double price);
void update(double price);
void show();
};
#endif
文末有定义的细节,与使用
产生的原因:
Stock://类名
int year = 2001;
struct thing
{
cahr* pn;
int m;
};
thing amabob = {“nasdjkn”, -23};
//但是下面语句不能正确运行
Stock hot = {“abjhdj”, 200, 50.25};
//希望类能够像创建对象时对它进行初始化。
作用:
用于构造新对象,将值赋给它们进行初始化
声明和定义构造函数
Stock://类
函数原型:
Stock(const string& co, long n = 0, double pr = 0.0);
构造函数定义:
Stock::Stock(const string& co, long n = 0,double pr = 0)
{
…
}
注意:
下面的定义是错误的!!!
Stock::Stock(const string& company, long shares, double share_val)
//参数名与成员名相同,错误
使用构造函数
Stock gar(“com”,894,9.8);
Stock gar = Stock(“com”,894, 9.8);//作用是初始化,创建有指定值的对象,有可能创建一个临时对象,将该临时对象复制到gar中,并丢弃它;也有可能不会创建
//两种声明方法都可以
gar = Stock(“love”,8989,5.4);//这条语句的作用是赋值,,这样的赋值语句中使用构造函数总会导致在赋值前创建一个临时对象
stock2 = stock1;//将一个对象赋给同类型的另一个对象,stock2原来的值将会被覆盖。
也可以使用new动态分配内存
Stock *pst = new Stock (“com”, 894, 9.8);
三种初始化的方法:
Stock gar = {“love”, 1993, 8.6};
Stock gar {“love”, 4565, 0.6};
Stock gar {};
默认构造函数
当没有写构造函数时,使用类的时候,编译器会默认生成一个构造函数,可能如下
Stock::Stock(){ }
也就是说,此时,比如我们创建一个类对象
Stock fluu;
//此时编译器会提供一个默认构造函数
//只是创建了对象,并不会提供值
当我们写了带参数的构造后:
Stock fluu;
//这样声明将会发生错误
//所以我们通过函数重载定义另一个构造函数,一个没有参数的构造函数
Stock();
析构函数
作用:用构造函数创建对象后,程序负责跟踪对象,知道其过期为止。对象过期时,程序会自动调用一个析构函数来完成清理工作。
析构函数的名字:
~Stock();
如果构造函数使用了new,则必须提供使用delete的析构函数。
如果想要看出函数什么时候被调用,可以这样写程序
Stock::~Stock()
{
std::cout << “Bye!” << std::endl;
}
const 成员函数
const Stock land = Stock{"love"};
//Stock(const std::string& co, long n = 0, double pr = 0);
land.show;
//void show();
当遇到这种情况时,程序会拒绝运行第二行,因为调用对象为cosnt,show()代码无法确保调用对象不被修改。
解决方法:
void show () const;
函数定义:
void stock::show() const
定义细节
//file00.cpp
#include<iostream>
#include"ss.h"
Stock::Stock()
{
std::cout << "Default constructor called\n";
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 << "you input is bad\n";
shares = 0;
}
else
shares = n;
share_val = pr;
set_tot();
}
Stock::~Stock()
{
std::cout << "Bye!\n";
}
//void Stock::acquire(const std::string& co, long n, double pr)
//{
// company = co;
// if (n < 0)
// {
// std::cout << "you don't have money!!!"
// << 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 << "Shares don't negative.\n";
}
else
{
shares += num;
share_val = price;
set_tot();
}
}
void Stock::sell(long num, double price)
{
using std::cout;
if (num < 0)
{
cout << "Num can't be negative."
<< "\n";
}
else if (num > shares)
{
cout << "you don't have enough money.";
}
else
{
shares -= num;
share_val = price;
set_tot();
}
}
void Stock::update(double price)
{
share_val = price;
set_tot();
}
void Stock::show()
{
std::cout << "Company: " << company << " shares: " << shares
<< " share price: " << share_val << " total Worth: "
<< total_val << std::endl;
}
使用
//file01.cpp
#include<iostream>
#include"ss.h"
int main()
{
Stock ls("love", 804583, 9.8);
ls.show();
ls.buy(236789, 9.32);
ls.show();
ls.sell(453654, 3.89);
ls.show();
return 0;
}