/*
代码详解构造函数
*/
#include <iostream>
#include<string>
using namespace std;
class Person
{
public:
Person (const std::string &nm) :name(nm),age(22)
{
}
public:
std::string name;
//int age=22; 错误写法
int age;
} ;
class Dog
{
public:
Dog():legs(4)
{
//this->legs=4; 当是const 定义的常量时,这样写不对,只能在初始化列表里
}
private:
std::string name;
const int legs; //在类当中const 常量,只能写在初始化列表里,不能使用this->legs=4 这样的初始化
} ;
class Sales_item
{
public://构造函数为了保险起见,应该前面加上 explicit
explicit Sales_item(const std::string &book=" "):isbn(book),units_sold(0),revenue(0.0) //够着函数可以有多个,即可以重载
{
}
// Sales_item():units_sold(0),revenue(0.0)//构造函数没有返回值,所以前面什么都不能加
// {} 当&book=" " 有一个默认的空值时,那么这个不带参数的构造函数可以省略
explicit Sales_item(const std::string &book, int units, double amount)
:isbn(book),units_sold(units),revenue(amount)//建议使用初始 化列表速度快,初始化列表的顺序无所谓,
{
}
explicit Sales_item(std::istream &is)
{
is >> *this;
}
explicit Sales_item(int units, double price)//构造函数永远都不需要const
{
this->units_sold=units;//这种赋值方法不建议
this->revenue=price;
}
friend std::istream& operator >>(std::istream& ,Sales_item&) ;
private:
std::string isbn;
unsigned units_sold;
double revenue;
};
inline istream& operator >>(istream& in, Sales_item& s)
{
double price;
in>> s.isbn >>s.units_sold >>price;
if(in)
s.revenue = s.units_sold * price;
else
s = Sales_item();
return in;
}
int main()
{
Person a("张三");
Sales_item item1;
Sales_item item2("11-22-33");
Sales_item *p= new Sales_item(); //使用了new 要记得用delete 进行删除
const Sales_item item3;
cout<<a.name<<endl;
delete p;
return 0;
}