[C++] 类的设计(2)——拷贝控制(1)
class Foo{
public:
Foo();//默认构造函数
Foo(const Foo&);//拷贝构造函数
}
Foo& operator=(const Foo&);
Sales_data& //返回值
Sales_data::operator=(const Sales_data &rhs){//参数也是当前对象的引用类型
bookNo=rhs.bookNo;//调用string::operator=
units_sold=rhs.units_sold;//使用内置的int赋值
revenue=rhs.revenue;//使用内置的double赋值
return *this;//返回一个此对象的引用
}
class Sales_data {
public:
Sales_data() = default;
Sales_data(const string &s, unsigned n, double p):bookNo(s),units_sold(n),revenue(p*n) {
}
Sales_data(const string &s):bookNo(s){}
Sales_data(const Sales_data&);//拷贝构造函数,第一个参数为自身类类型的引用
Sales_data& operator=(const Sales_data &rhs);//拷贝赋值运算符,返回当前对象的引用,参数为另一个对象的引用
string isbn()const { return bookNo; }
Sales_data &combine(const Sales_data&);
private:
double avg_price()const {
return units_sold ? revenue / units_sold : ;
}
string bookNo;
unsigned units_sold = ;
double revenue = 0.0;
};
Sales_data& Sales_data::combine(const Sales_data &rhs) {
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
/* 拷贝构造函数的定义
** 拷贝构造函数应用于对象的拷贝初始化,函数的非引用参数传递和返回值
** 合成拷贝构造函数作用是阻止某些类的拷贝,或者将参数的成员逐个拷贝到正在创建的对象中
** 要记住它仍然是一个构造函数,是用来构造对象的
*/
Sales_data::Sales_data(const Sales_data &orig):bookNo(orig.bookNo),units_sold(orig.units_sold),revenue(orig.revenue) {
cout << "这是Sales_data的拷贝构造函数" << endl;
}
/* 拷贝赋值运算符的定义
** 拷贝赋值运算符重载了赋值(=)运算符,在对象发生赋值操作的时候调用
** 合成的拷贝赋值运算符的作用是阻止某些类的赋值,或者将参数的成员赋予左侧运算对象的相应成员
** 返回值是当前对象的引用
*/
Sales_data& Sales_data::operator=(const Sales_data &rhs) {
cout << "这是Sales_data的拷贝赋值运算符" << endl;
bookNo = rhs.bookNo;
units_sold = rhs.units_sold;
revenue = rhs.revenue;
return *this;
}
int main() {
Sales_data sales_data_1{ "",, };//直接初始化,花括号
Sales_data sales_data_2("", , );//直接初始化,参数匹配
Sales_data sales_data_3 = sales_data_1;//拷贝初始化
Sales_data sales_data_4;
sales_data_4 = sales_data_1;//拷贝赋值运算符
//如果一个对象已经定义了,然后给对象赋值,那么就会调用拷贝赋值运算符;
//如果是用于对象的初始化、非引用类型实参,非引用类型类返回值,那么就调用拷贝构造函数。
return ;
}
[C++] 类的设计(2)——拷贝控制(1)的更多相关文章
- OOP3(继承中的类作用域/构造函数与拷贝控制/继承与容器)
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内.如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义 在编译时进行名字查找: 一个对象.引用或指针的 ...
- C++的那些事:类的拷贝控制
1,什么是类的拷贝控制 当我们定义一个类的时候,为了让我们定义的类类型像内置类型(char,int,double等)一样好用,我们通常需要考下面几件事: Q1:用这个类的对象去初始化另一个同类型的对象 ...
- C++拷贝控制
一.拷贝控制操作 当定义一个类时,显示或隐式地指定了此类型的对象在拷贝.赋值和销毁时所执行的操作,通过三个特殊的成员函数来控制这些操作,分别是拷贝构造函数,赋值运算符和析构函数.拷贝构造函数定义了 ...
- 【c++ Prime 学习笔记】第13章 拷贝控制
定义一个类时,可显式或隐式的指定在此类型对象上拷贝.移动.赋值.销毁时做什么.通过5种成员函数实现拷贝控制操作: 拷贝构造函数:用同类型的另一个对象初始化本对象时做什么(拷贝初始化) 拷贝赋值算符:将 ...
- [C++]类的设计(2)——拷贝控制(拷贝控制和资源管理)
1.类的行为分类:看起来像一个值:看起来想一个指针. 1)类的行为像一个值,意味着他应该有自己的状态.当我们拷贝一个像值的对象时,副本和原对象是完全独立的.改变副本不会对原有对象有任何影响 ...
- [C++]类的设计(2)——拷贝控制(阻止拷贝)
1.阻止拷贝的原因:对于某些类来说,拷贝构造函数和拷贝赋值运算符没有意义.举例:iostream类阻止了拷贝,以避免多个对象写入或者读取相同的IO缓冲. 2.阻止拷贝的方法有两个:新标准中可以将成 ...
- C++类拷贝控制 深拷贝 浅拷贝
普通类型对象之间的复制很简单,而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量,这篇文章将帮你理清C++类对象的拷贝方式 拷贝构造函数,拷贝赋值运算符 首先我们简单了解下默认的拷贝 ...
- C++ Primer : 第十三章 : 拷贝控制之对象移动
右值引用 所谓的右值引用就是必须将引用绑定到右值的引用,我们通过&&来绑定到右值而不是&, 右值引用只能绑定到即将销毁的对象.右值引用也是引用,因此右值引用也只不过是对象的别名 ...
- C++ Primer : 第十三章 : 拷贝控制之拷贝控制和资源管理
定义行为像值的类 行为像值的类,例如标准库容器和std::string这样的类一样,类似这样的类我们可以简单的实现一个这样的类HasPtr. 在实现之前,我们需要: 定义一个拷贝构造函数,完成stri ...
随机推荐
- Jmeter 02 Jmeter断言之响应断言
看完上一篇博客,相信大家应该可以使用Jmeter发送HTTP请求了.那么我们既然是要测试,就肯定需要判断结果了.Jmeter对于请求的响应数据提供了几种断言机制,这里大概说一下比较常用的几种断言. 响 ...
- Codeforces 255C
题意略. 本题考查动态规划,顺便考查一下优化. 这个题目可以归约到最长递增子序列那一类,定义状态:dp[i][j] --- 当前以第i个数结尾,前一个数是第j个数的最长序列. if(a[i] == a ...
- python小白短期基础入门
一.编程语言介绍与分类 1.什么是编程语言 编程语言本质就是人类的语言,主要用于沟通交流.我们通过编程语言与计算机进行互动交流,从而使计算机来帮助我们实现一些特定的功能和一些复杂的工作. 2.编程语言 ...
- Python从入门到精通之环境搭建
本章内容: Windows系统环境搭建 Linux系统环境搭建 Mac OS系统环境搭建 一.下载python安装包 下载地址:https://www.python.org/downloads/ 二. ...
- 关于Socket、TCP/IP、HTTP、FTP及网络编程
来源:陶邦仁 链接:http://blog.jobbole.com/99694/ 既然是网络传输,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,再者如何进行可靠高效 ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- UVA - 315 Network(tarjan求割点的个数)
题目链接:https://vjudge.net/contest/67418#problem/B 题意:给一个无向连通图,求出割点的数量.首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第 ...
- codeforces 768 D. Jon and Orbs(概率dp)
题目链接:http://codeforces.com/contest/768/problem/D 题意:一共有k种球,要得到k种不同的球至少一个,q个提问每次提问给出一个数pi,问概率大小大于等于pi ...
- JavaScript new的运行过程
参考 MDN网站的运算符 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new new 运算符 ...
- WEB-UI自动化测试实践
一.设计背景 随着IT行业的发展,产品愈渐复杂,web端业务及流程更加繁琐,目前UI测试仅是针对单一页面,操作量大.为了满足多页面功能及流程的需求及节省工时,设计了这款UI 自动化测试程序.旨在提供接 ...