【C++】类的构造函数与析构函数笔记
目录
0. 整体概述为什么要引入构造函数
截止到上一节,提供的代码不能直接像 int 或者 结构那样来初始化Stock对象。
常规的初始化语法不适用于类型Stock:
-
int year = 2001;
-
struct thing
-
{
-
char * pn;
-
int m;
-
}
-
-
thing amabob = { "hewlosd" , -30 }; //结构的初始化
-
Stock hot = { "Mary tup", 2304, 4353}; //错误的初始化
不能像上面这样直接Stock初始化的原因是:数据部分是隐藏的,是私有的,程序不能直接访问数据成员。
程序只能通过成员函数来访问数据成员,因此需要设计合适的成员函数,才能成功地将对象初始化。
一般来说,最好是在创建对象时进行初始化:
stock gift;
gift.buy (10, 27.34);
类设计假设用户在调用其他成员函数时,都已经进行了自动初始化,C++将这种特殊的成员函数称为----类构造函数,将专门用于构造对象,将值赋给他们的数据成员。
类构造函数明察与类名相同:Stock 类 一个可能的构造函数是名为 Stock() 的成员函数。
1. 声明和定义构造函数
-
// stock00.h -- Stock class interface
-
// 版本 00 类的声明
-
#ifndef STOCK00_H_
-
#define STOCK00_H_
-
-
#include<string>
-
-
class Stock
-
{
-
public:
-
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();
-
-
private:
-
std::string company;
-
long shares; //股票数量
-
double share_val; // 每股的价格
-
double total_val; //股票的总价格
-
void set_tot()
-
{
-
total_val = shares*share_val;
-
}
-
-
};
-
-
#endif
需要为Stock 对象提供3个值,构造函数为3个参数,第四个值total_val是其他计算得来,不用提供这个值。
原型如下:
// 声明的原型可能是
Stock ( const string & co , long n = 0, double pr = 0.0 );
构造函数的一种可能的定义是:
// 构造函数定义
Stock::Stock(const 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();
}
程序声明对象时,将自动调用构造函数
1.1 成员名和参数名
2. 使用构造函数
2.1 显式调用构造函数
Stock food = Stock("Wrojfs sfas", 374, 2.42);
2.2 隐式调用构造函数
Stock garment( "Furry Mason", 50, 3.5 );
与下面等价:
Stock garment = Stock( "Furry Mason", 50, 3.5 );
2.3 构造函数与new一起使用的方法
Stock * pstock = new Stock("Yhdisf hiushfoisf", 34, 39.2);
对象没有名称,但可以使用指针来管理该对象!对象指针
3. 默认构造函数
默认构造函数是在未提供显示初值时,用来创建对象的构造函数。
比如:
Stock fluffy_dha; //使用默认构造函数,隐式版本
Stock:: Stock(){}
4. 析构函数
析构函数用来清理: ~stock();
析构函数不承担任何工作,所以编写为不执行任何操作的函数
Stock::~Stock()
{
}
为了能看清楚何时被调用,可以这样编写
Stock::~Stock()
{
cout<<" 再见了 , "<<company<<endl;
}
什么时候调用析构函数呢?
5 改进Stock类
stock10.h
-
// stock00.h -- Stock class interface
-
// 版本 00 类的声明
-
#ifndef STOCK00_H_
-
#define STOCK00_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();
-
-
private:
-
std::string company;
-
long shares; //股票数量
-
double share_val; // 每股的价格
-
double total_val; //股票的总价格
-
void set_tot()
-
{
-
total_val = shares*share_val;
-
}
-
-
};
-
-
#endif
Stock10.cpp
-
// stock00.cpp -- 对类stock00.h进行函数描述
-
// 版本还是00
-
#include<iostream>
-
#include"stock10.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()
-
{
-
std::cout << "Company: " << company
-
<< " Shares: " << shares << "\n"
-
<< " Share Price: $ " << share_val
-
<< "Total Worth: $" << total_val << "\n";
-
}
usestock2.cpp
-
#include <iostream>
-
#include "stock10.h"
-
-
-
int main()
-
{
-
{
-
using std::cout;
-
cout<<"Using constructos to create new objects\n";
-
Stock stock1("NanoSmart",12,20.0);
-
stock1.show();
-
Stock stock2=Stock("Boffo Objects",2,2.0);
-
stock2.show();
-
-
cout<<"Assigning stock1 to stock2:\n";
-
stock2=stock1;
-
cout<<"显示Stock1 and Stock2\n"\;
-
stock1.show();
-
stock2.show();
-
-
cout<<"Using a constructor to reset an object\n";
-
stock1=Stock("Nifty Foods",10,50.0); //临时对象
-
stock1.show();
-
cout<<"Done\n";
-
}
-
return 0;
-
}
C++11列表初始化
只要提供与某个构造函数参数列表匹配的,并用大括号括起来就行
Stock hot_tip = { "helwod afhoidf", 100, 56.3 };
Stock jock = {"dafhdsfsa hiuhfoas"};
Stock temp{};
这三个都是正确的,分别对应:
Stock(const std::string & co, long n = 0, double pr = 0.0 );
Stock(const std::string & co, long n = 0, double pr = 0.0 );Stock();
const成员函数
文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。
原文链接:kings.blog.csdn.net/article/details/98593694
- 点赞
- 收藏
- 关注作者
评论(0)