条款12:复制对象时勿忘其每一部分
来源:互联网 发布:单片机经典项目 编辑:程序博客网 时间:2024/06/07 02:17
复制对象时要把对象的每一部分都赋值到位,尤其在有基类的时候容易遗漏复制
#include<iostream>using namespace std;class Date{public: Date(int d = 1, int m = 1, int w = 1) :day(d), month(m), weekday(w) { cout << "基类构造函数" << endl; } Date(const Date& rhs) { day = rhs.day; month = rhs.month; } Date& operator=(const Date& rhs) { day = rhs.day; month = rhs.month; return *this; } ~Date() { cout << "基类析构函数" << endl; } void printDay() { cout << month << "月" << day << "日" << "周" << weekday << endl; }private: int day; int month; int weekday;};int main(){ //忘记了赋值weekend Date day1; Date day2(2, 2, 2); day1 = day2; day1.printDay(); /* 基类构造函数 基类构造函数 2月2日周1 */ system("pause");}
在继承、派生体系中,对于派生类的复制控制函数,也要调用基类的复制控制,否则复制、赋值等操作只会作用于派生类特有的数据上:
#include<iostream>using namespace std;class Date{public: Date(int d = 1, int m = 1, int w = 1) :day(d), month(m), weekday(w) { cout << "基类构造函数" << endl; } Date(const Date& rhs) { init(rhs); } Date& operator=(const Date& rhs) { if (&rhs != this) { init(rhs); } return *this; } ~Date() { cout << "基类析构函数" << endl; } void printDay() { cout << month << "月" << day << "日" << "周" << weekday << endl; }private: void init(const Date &rhs) { day = rhs.day; month = rhs.month; weekday = rhs.weekday; }public: int day; int month; int weekday;};class DetailDay :public Date{public: DetailDay(const DetailDay& rhs) :year(rhs.year), Date(rhs) { } DetailDay(int y, int m, int d, int w) :year(y), Date(m, d, w) {} DetailDay& operator=(const DetailDay& rhs) { Date::operator=(rhs); year = rhs.year; return *this; } void printDay() { cout << year<<"年"<<month << "月" << day << "日" << "周" << weekday << endl; }private: int year;};int main(){ DetailDay dt(2017, 5, 10, 3); dt.printDay(); system("pause");}
最后有一点需要注意:我们发现,复制构造函数和赋值构造函数里面很多内容是重复的。此时并不要用一个去调用另外一个,良好的编程习惯是定义一个init函数,让这两个函数都调用它,就想像程序中所做的那样。
0 0
- 条款12:复制对象时勿忘其每一部分
- 条款12:复制对象时勿忘其每一部分
- Effective C++——》条款12:复制对象时勿忘其每一部分
- C++复制对象时勿忘每一部分
- 条款12:复制对象时勿忘其每一个成分
- 条款12:复制对象时勿忘其每一个成分
- 条款12:复制对象时勿忘其每一个成分
- 【effective c++】 条款12:复制对象时勿忘其每一个成分
- 条款12:复制对象时勿忘其每一个成分
- Effective C++:条款12:复制对象时勿忘其每一个成分
- 条款:12 复制对象时勿忘其每一个成分
- 条款12:复制对象时勿忘其每一个成分
- 条款12:复制对象时勿忘其每一个成分
- 条款12:复制对象时勿忘其每一个成分
- 条款12:复制对象时勿忘其每一个成分
- 条款12:复制对象时勿忘其每个成份
- 条款12 复制对象勿忘其每一个成分
- 条款12:复制对象时勿忘其每一个成分(Copy all parts of an object.)
- codeforces Gym 100269K——Kids in a Friendly Class(可图性判定)
- C++之多线程
- class javax.mail.MessagingException: 554 DT:SPM 163 smtp9
- MyBatis中Like语句使用方式
- 数据结构-堆的java实现
- 条款12:复制对象时勿忘其每一部分
- 关于mysql按空格分割查询
- js访问、输出及换行
- 1078. Hashing (25)
- javaScript回调进化史(含源码)
- FragmentManager findFragmentById 返回null
- 用shell脚本来判断Apache是否开启
- tensorflow读取SVHN数据集转为TFrecords格式
- Linux下安装mysql