目录
- class Date
- {
- public:
- void Init(int year, int month, int day)
- {
- _year = year;
- _month = month;
- _day = day;
- }
- void Print()
- {
- cout << _year << "-" << _month << "-" << _day << endl;
- }
- private:
- int _year;
- int _month;
- int _day;
- };
-
- int main()
- {
- Date d1;
- d1.Init(2023, 9, 1);
- d1.Print();
- Date d2;
- d2.Init(2023, 9, 1);
- d2.Print();
- return 0;
- }
-
- class Date
- {
- public:
- // 1.无参构造函数
- Date()
- {}
-
- // 2.带参构造函数
- Date(int year, int month, int day)
- {
- _year = year;
- _month = month;
- _day = day;
- }
- private:
- int _year;
- int _month;
- int _day;
- };
-
- void TestDate()
- {
- Date d1; // 调用无参构造函数
- Date d2(2023, 9, 1); // 调用带参的构造函数
-
- // 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
- // 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象
- // warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)
- Date d3();
- }
- class Date
- {
- public:
- /*
- // 如果用户显式定义了构造函数,编译器将不再生成
- Date(int year, int month, int day)
- {
- _year = year;
- _month = month;
- _day = day;
- }
- */
-
- void Print()
- {
- cout << _year << "-" << _month << "-" << _day << endl;
- }
-
- private:
- int _year;
- int _month;
- int _day;
- };
-
- int main()
- {
- // 将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函
- 数
- // 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再
- 生成
- // 无参构造函数,放开后报错:error C2512: “Date”: 没有合适的默认构造函数可用
- Date d1;
- return 0;
- }
默认生成的构造函数:
验证:
- class Time
- {
- public:
- Time()
- {
- cout << "Time()" << endl;
- _hour = 0;
- _minute = 0;
- _second = 0;
- }
- private:
- int _hour;
- int _minute;
- int _second;
- };
-
- class Date
- {
- private:
- // 基本类型(内置类型)
- int _year;
- int _month;
- int _day;
- // 自定义类型
- Time _t;
- };
-
- int main()
- {
- Date d;
- return 0;
- }
- class Time
- {
- public:
- Time()
- {
- cout << "Time()" << endl;
- _hour = 0;
- _minute = 0;
- _second = 0;
- }
- private:
- int _hour;
- int _minute;
- int _second;
- };
-
- class Date
- {
- private:
- // 基本类型(内置类型)
- int _year = 1970; //c++11允许的补丁
- int _month = 1; //这里不是初始化,而是声明,给缺省值
- int _day = 1; //给的是默认构造函数的缺省值
-
- // 自定义类型
- Time _t;
- };
-
- int main()
- {
- Date d;
- return 0;
- }
3. 析构函数
栈:
- typedef int DataType;
- class Stack
- {
- public:
- Stack(size_t capacity = 3)
- {
- _array = (DataType*)malloc(sizeof(DataType) * capacity);
- if (NULL == _array)
- {
- perror("malloc申请空间失败!!!");
- return;
- }
- _capacity = capacity;
- _size = 0;
- }
- void Push(DataType data)
- {
- //...
- _array[_size] = data;
- _size++;
- }
-
- ~Stack()
- {
- free(_array);
- //_array = nullptr;
- //_capacity = _size = 0;
- }
-
- private:
- DataType* _array;
- int _capacity;
- int _size;
- };
日期类对象:
- class Date
- {
- public:
- Date(int year = 2023, int month = 9, int day = 1)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
- //~Date()
- //{
- // //~Date()没有什么需要清理的
- // cout << "~Date()" << endl;
- //}
-
- //内置类型析构函数不做处理
- private:
- int _year;
- int _month;
- int _day;
- };
自定义队列:
- class MyQueue
- {
- public:
- //...
-
- private:
- size_t _szie = 0;
- Stack _st1;
- Stack _st2;
- };
关于以上三个函数的调用:
由此也可以总结出析构函数的特点:
a.内置类型不做处理
b.自定义类型成员会去调用它的析构函数
4. 拷贝构造函数
- class Date
- {
- public:
-
- Date(int year = 1900, int month = 1, int day = 1)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
- Date(const Date& d) //拷贝构造函数
- {
- _year = d._year;
- _month = d._month;
- _day = d._day;
- }
-
- private:
- int _year;
- int _month;
- int _day;
- };
-
- int main()
- {
- Date d1;
- Date d2(d1);
- return 0;
- }
- class Time
- {
- public:
- Time()
- {
- _hour = 1;
- _minute = 1;
- _second = 1;
- }
-
- Time(const Time& t)
- {
- _hour = t._hour;
- _minute = t._minute;
- _second = t._second;
- cout << "Time::Time(const Time&)" << endl;
- }
-
- private:
- int _hour;
- int _minute;
- int _second;
- };
-
- class Date
- {
- private:
- // 基本类型(内置类型)
- int _year = 2023;
- int _month = 1;
- int _day = 1;
-
- // 自定义类型
- Time _t;
- };
-
- int main()
- {
- Date d1;
-
- // 用已经存在的d1拷贝构造d2,此处会调用Date类的拷贝构造函数
- // 但Date类并没有显式定义拷贝构造函数,则编译器会给Date类生成一个默认的拷贝构
- 造函数
- Date d2(d1);
- return 0;
- }
- // 这里会发现下面的程序会崩溃掉。
- typedef int DataType;
- class Stack
- {
- public:
- Stack(size_t capacity = 10)
- {
- _array = (DataType*)malloc(capacity * sizeof(DataType));
- if (nullptr == _array)
- {
- perror("malloc申请空间失败");
- return;
- }
-
- _size = 0;
- _capacity = capacity;
- }
-
- void Push(const DataType& data)
- {
- // ...
- _array[_size] = data;
- _size++;
- }
-
- ~Stack()
- {
- free(_array);
- }
-
- private:
- DataType *_array;
- size_t _size;
- size_t _capacity;
- };
-
- int main()
- {
- Stack s1;
- s1.Push(1);
- s1.Push(2);
- s1.Push(3);
- s1.Push(4);
- Stack s2(s1);
- return 0;
- }
5. 赋值运算符重载
以日期类对象为例:
- class Date
- {
- public:
- Date(int year = 2023, int month = 1, int day = 1)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
- //私有
- // bool operator==(Date* this, const Date& d2)
- // 这里需要注意的是,左操作数是this,指向调用函数的对象
- bool operator==(const Date& x)
- {
- return _year == x._year
- && _month == x._month
- && _day == x._day;
- }
-
- //private:
- int _year;
- int _month;
- int _day;
- };
-
- //公有
- bool operator==(Date x, Date y)
- {
- return x._year == y._year
- && x._month == y._month
- && x._day == y._day;
- }
-
-
- int main()
- {
- Date d1(2023, 9, 1);
- Date d2(2023, 9, 1);
-
- d1 == d2;
- cout << (d1 == d2) << endl;
-
- return 0;
- }
-------------------------------------------------------------------------------------------------------------------
依旧以日期类为例:
1.复用逻辑
2.请问下面代码为什么要有返回值?为什么要传引用返回?
返回值是为了支持连续赋值,保持运算符的特性,类似于a = b = c 。d2 = d1 ; d3 = d2 = d1 ;
传引用返回是因为this指针出函数作用域后会销毁
3.赋值重载与拷贝构造的区别
4.日期类 + 与 +=
5.关于日期类的前置++与后置++
- #pragma once
-
- #include <iostream>
- using namespace std;
-
- class Date
- {
- //友元
- friend ostream& operator<<(ostream& out, const Date& d); //流插入
-
- friend istream& operator>>(istream& in, Date& d);//流提取
-
- public:
- Date(int year = 2023, int month = 1, int day = 1);
- void Print();//打印
-
- int GetMonthDay(int year, int month) const;//获取每月的天数
-
- bool operator==(const Date& x) const;
- bool operator!=(const Date& x) const;
- bool operator<(const Date& x) const;
- bool operator<=(const Date& x) const;
- bool operator>(const Date& x) const;
- bool operator>=(const Date& x) const;
-
- Date& operator+=(int day);
- Date operator+(int day) const;
-
- //减不仅构成运算符重载,还构成函数重载
-
- //d1 - 100 日期 - 天数
- Date operator-(int day) const;
-
- Date& operator-=(int day);
-
- //d1 - d2 日期 - 日期
- int operator-(const Date& d);
-
-
- //++d1
- Date& operator++();
-
- //d1++
- Date operator++(int);
-
- //--d1 -> d1.operator--();
- Date& operator--();
-
- //d1-- -> d1.operator--(int);
- Date operator--(int);
-
- //void operator<<(ostream& out);
-
- private:
- int _year;
- int _month;
- int _day;
- };
-
-
- ostream& operator<<(ostream& out, const Date& d);//流插入
-
- istream& operator>>(istream& in, Date& d);//流提取
- #include"Date.h"
-
- int Date::GetMonthDay(int year, int month) const
- {
- static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,31 };
-
- if (month == 2 && (((year % 400 == 0) || (year % 4 == 0)) && (year % 100 != 0)))
- {
- return 29;
- }
- else
- {
- return days[month];
- }
- }
-
- Date::Date(int year , int month , int day )
- {
- if (month > 0 && month < 13 &&
- (day > 0 && day <= GetMonthDay(year, month)))
- {
- _year = year;
- _month = month;
- _day = day;
- }
- else
- {
- cout << "日期非法" << endl;
- }
- }
-
- void Date::Print()
- {
- cout << _year << "/" << _month << "/" << _day << endl;
- }
-
- bool Date::operator==(const Date& x) const
- {
- return _year == x._year
- && _month == x._month
- && _day == x._day;
- }
-
- bool Date::operator!=(const Date& x) const
- {
- return !(*this == x);
- }
-
- bool Date::operator<(const Date& x) const
- {
- if (_year < x._year)
- {
- return true;
- }
- else if (_year == x._year && _month < x._month)
- {
- return true;
- }
- else if (_year == x._year && _month == x._month && _day < x._day)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
-
- bool Date::operator<=(const Date& x) const
- {
- return *this < x || *this == x;
- }
-
- bool Date::operator>(const Date& x) const
- {
- return !(*this <= x);
- }
-
- bool Date::operator>=(const Date& x) const
- {
- return !(*this < x);
- }
-
-
- Date& Date:: operator+=(int day)
- {
- if (day < 0) //day为负数
- {
- *this -= -day;
- return *this;
- }
-
- _day += day;
-
- while (_day > GetMonthDay(_year, _month))
- {
- //减去多余的天数
- _day -= GetMonthDay(_year, _month);
-
- //月进位
- _month++;
-
- //年进位
- if (_month==13)
- {
- _month = 1;
- _year++;
- }
- }
-
- return *this;
- }
-
- //+ 复用+=
- Date Date :: operator+(int day) const
- {
- Date tmp(*this);
-
- tmp += day;
-
- return tmp;
- }
-
- //Date Date :: operator+(int day)
- //{
- // Date tmp(*this);
- //
- // tmp._day += day;
- //
- // while (tmp._day > GetMonthDay(tmp._year, tmp._month))
- // {
- // //减去多余的天数
- // tmp._day -= GetMonthDay(tmp._year, tmp._month);
- //
- // //月进位
- // tmp._month++;
- //
- // //年进位
- // if (tmp._month == 13)
- // {
- // tmp._month = 1;
- // tmp._year++;
- // }
- // }
- //
- // return tmp;
- //}
-
-
- //+= 复用+
- //Date& Date::operator+=(int day)
- //{
- // *this = *this + day;
- //
- // return *this;
- //}
-
-
- //++d1
- Date& Date::operator++()
- {
- *this += 1;
- return *this;
- }
-
- //d1++
- Date Date::operator++(int)
- {
- Date tmp(*this);
- *this += 1;
- return tmp;
- }
-
-
- Date& Date::operator-=(int day)
- {
- if (day < 0) //day为负数
- {
- *this += -day;
- return *this;
- }
-
- _day -= day;
- while (_day <= 0)
- {
- --_month;
- if (_month == 0)
- {
- --_year;
- _month = 12;
- }
-
- _day += GetMonthDay(_year, _month);
- }
-
- return *this;
- }
-
- Date Date::operator-(int day) const
- {
- Date tmp(*this);
- tmp -= day;
- return tmp;
- }
-
-
- //--d1
- Date& Date::operator--()
- {
- *this -= 1;
- return *this;
- }
-
- //d1--
- Date Date::operator--(int)
- {
- Date tmp(*this);
- *this -= 1;
- return tmp;
- }
-
- //d1 - d2
- int Date::operator-(const Date& d)
- {
- Date max = *this;
- Date min = d;
- int flag = 1;
-
- if (*this < d)
- {
- max = d;
- min = *this;
- flag = -1;
- }
-
- int count = 0;
- while (min != max)
- {
- ++min;
- ++count;
- }
-
- return count * flag;
- }
-
-
-
- //void Date::operator<<(ostream& out)
- //{
- // cout << _year << "年" << _month << "月" << _day << "日" << endl;
- //}
-
-
- ostream& operator<<(ostream& out, const Date& d)
- {
- cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;
- return out;
- }
-
-
- istream& operator>>(istream& in, Date& d)
- {
- in >> d._year >> d._month >> d._day;
- return in;
- }
-
- class A
- {
- public:
- //const 修饰 *this
- //this指针的类型变成 const A*
- //内部不改变成员变量的成员函数,最好加上const,const对象和普通对象(权限的缩小)都可以调用
- void Print() const
- {
- cout << _a << endl;
- }
-
- A* operator&()
- {
- return this;
- }
-
- const A* operator&() const
- {
- return this;
- }
-
- private:
- int _a = 10;
- };
-
- void Func(const A& x)
- {
- x.Print();
-
- cout << &x << endl;
- }
-
- int main()
- {
- A aa;
- aa.Print();
-
- Func(aa);
-
- cout << &aa << endl;
-
- return 0;
- }
概念性内容均来自比特科技