构造、友元
来源:互联网 发布:国家博物馆淘宝 编辑:程序博客网 时间:2024/06/06 03:22
#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>using namespace std;class Sales_data{ //friend Sales_data add(const Sales_data &lsh, const Sales_data &rsh);public: Sales_data() = default; Sales_data(const string &s): bookNo(s){} Sales_data(const string &s, unsigned n, double p):bookNo(s), units_sold(n), revenue(n*p){} Sales_data(istream &); string isbn() const{ return bookNo; } Sales_data& combine(const Sales_data&);private: double avg_price() const; friend istream &read(istream&, Sales_data&); friend ostream &print(ostream&, const Sales_data&); string bookNo; unsigned int units_sold = 0; double revenue = 0.0;};Sales_data& Sales_data::combine(const Sales_data &rhs){ units_sold += rhs.units_sold; revenue += rhs.revenue; return *this;}double Sales_data::avg_price() const{ if(units_sold) return revenue/units_sold; return 0;}istream &read(istream &is, Sales_data &item){ double price = 0; is >> item.bookNo >> item.units_sold >> price; item.revenue = price * item.units_sold; return is;}ostream &print(ostream &os, const Sales_data &item){ os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price(); return os;}int main(){ printf("%s,%5.3s\n","computer","computer"); Sales_data total; if(read(cin, total)){ Sales_data trans; while(read(cin, trans)){ if(total.isbn() == trans.isbn()){ total.combine(trans); } else{ print(cout, total) << endl; total = trans; } } print(cout, total) << endl; } else{ cerr << "No data?!" << endl; }}
拷贝构造函数:如果一个构造函数第一个参数是自身类类型的引用,且任何额外参数都有默认值。使用已有的对象创建新的对象
class Sales_data{public: Sales_data(const Sales_data&);//合成拷贝构造函数private: string bookNo; int units_sold = 0; double revenue = 0.0;};Sales_data::Sales_data(const Sales_data &orig):bookNo(orig.bookNo), units_sold(orig.units_sold), revenue(orig.revenue){}
拷贝赋值运算符: operator=
赋值运算符通常应该返回一个指向其左侧运算对象的引用。将一个对象的值赋值给另一个已经存在的对象
class Foo{public: Foo& operator=(const Foo&);//赋值运算符};
合成拷贝赋值运算符
Sales_data& Sales_data::operator=(const Sales_data &rhs){ bookNo = rhs.bookNo; units_sold = rhs.units_sold; revenue = rhs.revenue; return *this;}
class Foo{public: ~Foo();//析构函数};
类的行为像一个值,意味着它也有自己的状态,当我们拷贝一个像值的对象是,副本和原对象是完全独立的
class HasPtr{public: HasPtr(const std::string &s = std::string()): ps(new std::string(s)), i(o){} HasPtr(const HasPtr &p): ps(new std::string(*p.s)), i(p.i){} HasPtr& operator=(const HasPtr&); ~HasPtr(){delete ps;}private: std::string *ps; int i;};HasPtr& HasPtr::operator=(const HasPtr &rhs){ auto newp = new string(*rhs.ps); delete ps; ps = newp; i = rhs.i; return *this;}
定义行为像指针的类
#include <iostream>#include <string>using namespace std;class HasPtr{public: HasPtr(const std::string &s = std::string()): ps(new std::string(s)), i(0), use(new int(1)){} HasPtr(const HasPtr &p): ps(new std::string(*p.ps)), i(p.i), use(p.use) { ++*use; } HasPtr& operator=(const HasPtr&); ~HasPtr(); void getUse(){ cout << *this->use << endl; }private: std::string *ps; int i; int *use;};HasPtr::~HasPtr(){ if(--*use == 0){ delete ps; delete use; }}HasPtr& HasPtr::operator=(const HasPtr &rhs){ ++*rhs.use; if(--*use == 0){ delete ps; delete use; } ps = rhs.ps; i = rhs.i; use = rhs.use; return *this;}int main(){ HasPtr p1("Hiya!"); HasPtr p2(p1); HasPtr p3(p1); p1.getUse(); p2.getUse();}
0 0
- 构造、友元
- 验证友元与拷贝构造函数
- c++拷贝构造函数的禁用 与 友元函数
- C++:构造函数,析构函数及友元函数
- 构造函数,友元,static类成员,复制控制
- C++类的几个细节:友元和默认构造
- 对象,类,友元,构造函数,析构函数
- 写string类学C++ 构造函数 重载 友元
- 拷贝构造函数,赋值运算符重载,友元输出重载
- C++学习笔记3--作用域 构造析构器 访问控制 友元关系
- C++语言笔记系列之十一——友元函数与拷贝构造函数
- 为什么 构造函数、内联函数、静态函数和友元函数不能是虚函数
- C++一元运算符的构造函数重载和友元函数重载
- c++ 子类虚函数、友元函数、复构、构造、赋值=的重写方式 - 练习题
- 普通函数、构造函数、inline函数、友元函数为什么不能声明为虚函数
- C++每日一练(拷贝构造函数、友元函数)
- C++中构造函数、static修饰函数、内联函数、友元函数不能是虚函数
- 参数初始化表,构造、析构函数,友元……
- 复制文件或目录到指定目录下
- IntelliJ IDEA 14.x + Tomcat 运行 Java Web, 出现 Server is not connected. Deploy is not available.错误
- VC2013/MFC,异常: 0xC0000005
- android studio改包名
- Reverse String
- 构造、友元
- LUA是怎么样调用C++的函数的
- kerberos认证原理---讲的非常细致,易懂
- floor,ceil,round
- 设计,为了更好的应对变化
- android混淆相关
- servlet生命周期
- 设计模式-享元模式
- Activity启动方式