赞
踩
目录
class Date {};
对于一下Date类:
- #include <iostream>
- using namespace std;
-
- 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(2024, 2, 4);
- d1.Print();
-
- Date d2;
-
- d2.Init(2024, 2, 5);
- d2.Print();
-
- return 0;
- }
对于Date类,可以通过Init公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置信息,未免过于麻烦,那么,能否在对象创建时,就将信息设置进去呢?
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。
1. 函数名与类名相同;
2. 无返回值;
3. 对象实例化时编译器自动调用对应的构造函数;
4. 构造函数可以重载;
- #include <iostream>
- using namespace std;
-
- 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(2024, 2, 4); // 调用带参的构造函数
- Date d3();
-
- }
注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数的声明。 如Date d3();声明了d3函数,该函数无参,返回一个日期类的对象。
5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成;
- #include <iostream>
- using namespace std;
-
- class Date
- {
- public:
-
- // 如果用户显式定义了构造函数,编译器将不再生成
- /*Date(int year, int month, int day)
- {
- _year = year;
- _month = month;
- _day = day;
- }*/
-
- private:
- int _year;
- int _month;
- int _day;
- };
-
- int main()
- {
- Date d1;
-
- return 0;
- }
关于编译器生成的默认成员函数,不禁产生疑问:不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象_year/_month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么用??
6. C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int/char……,自定义类型就是我们使用class/struct/union等自己定义的类型,观察下面的程序,就会发现编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数。
- #include <iostream>
- using namespace std;
-
- 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;
- }
- #include <iostream>
- using namespace std;
-
- 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 = 2024;
- int _month = 2;
- int _day = 4;
-
- // 自定义类型
- Time _t;
- };
- int main()
- {
- Date d;
-
- return 0;
- }
7. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。
注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。
- #include <iostream>
- using namespace std;
-
- class Date
- {
- public:
- Date()
- {
- _year = 2024;
- _month = 2;
- _day = 4;
- }
-
- Date(int year = 2024, int month = 2, int day = 4)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
- private:
- int _year;
- int _month;
- int _day;
- };
-
- void Test()
- {
- Date d1;
-
- }
- #include <iostream>
- using namespace std;
-
- 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)
- {
- // CheckCapacity();
- _array[_size] = data;
- _size++;
- }
-
- ~Stack()
- {
- if (_array)
- {
- free(_array);
- _array = NULL;
- _capacity = 0;
- _size = 0;
- }
- }
-
- private:
- DataType* _array;
- int _capacity;
- int _size;
- };
-
- void TestStack()
- {
- Stack s;
-
- s.Push(1);
- s.Push(2);
-
- }
- #include <iostream>
- using namespace std;
-
- class Time
- {
- public:
- ~Time()
- {
- cout << "~Time()" << endl;
- }
-
- private:
- int _hour;
- int _minute;
- int _second;
- };
-
- class Date
- {
- private:
- // 基本类型(内置类型)
- int _year = 2024;
- int _month = 2;
- int _day = 4;
-
- // 自定义类型
- Time _t;
- };
-
- int main()
- {
- Date d;
-
- return 0;
- }
- #include <iostream>
- using namespace std;
-
- class Date
- {
- public:
- Date(int year = 2024, int month = 2, int day = 4)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
- // Date(const Date& d) // 正确写法
- 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;
- }
- #include <iostream>
- using namespace std;
-
- 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 = 1970;
- int _month = 1;
- int _day = 1;
-
- // 自定义类型
- Time _t;
- };
- int main()
- {
- Date d1;
-
- // 用已经存在的d1拷贝构造d2,此处会调用Date类的拷贝构造函数
- // 但Date类并没有显式定义拷贝构造函数,则编译器会给Date类生成一个默认的拷贝构造函数
- Date d2(d1);
- return 0;
- }
- #include <iostream>
- using namespace std;
-
- 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)
- {
- // CheckCapacity();
- _array[_size] = data;
- _size++;
- }
-
- ~Stack()
- {
- if (_array)
- {
- free(_array);
- _array = nullptr;
- _capacity = 0;
- _size = 0;
- }
- }
-
- 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;
- }
- #include <iostream>
- using namespace std;
-
- class Date
- {
- public:
- Date(int year, int minute, int day)
- {
- cout << "Date(int,int,int):" << this << endl;
- }
-
- Date(const Date& d)
- {
- cout << "Date(const Date& d):" << this << endl;
- }
-
- ~Date()
- {
- cout << "~Date():" << this << endl;
- }
-
- private:
- int _year;
- int _month;
- int _day;
- };
-
- Date Test(Date d)
- {
- Date temp(d);
- return temp;
- }
-
- int main()
- {
- Date d1(2024, 2, 4);
-
- Test(d1);
-
- return 0;
- }
- #include <iostream>
- using namespace std;
-
- // 全局的operator==
- class Date
- {
- public:
- Date(int year = 1900, int month = 1, int day = 1)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
- //private:
- int _year;
- int _month;
- int _day;
- };
-
- bool operator==(const Date& d1, const Date& d2)
- {
- return d1._year == d2._year
- && d1._month == d2._month
- && d1._day == d2._day;
- }
-
- void Test()
- {
- Date d1(2024, 2, 4);
- Date d2(2024, 2, 5);
-
- cout << (d1 == d2) << endl;
- }
-
- int main()
- {
-
- Test();
-
- return 0;
- }
- #include <iostream>
- using namespace std;
-
- class Date
- {
- public:
- Date(int year = 2024, int month = 2, int day = 4)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
- // bool operator==(Date* this, const Date& d2)
- // 这里需要注意的是,左操作数是this,指向调用函数的对象
- bool operator==(const Date & d2)
- {
- return _year == d2._year
- && _month == d2._month
- && _day == d2._day;
- }
-
- private:
- int _year;
- int _month;
- int _day;
- };
- #include <iostream>
- using namespace std;
-
- class Date
- {
- public:
- Date(int year = 2024, int month = 2, int day = 4)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
- Date(const Date& d)
- {
- _year = d._year;
- _month = d._month;
- _day = d._day;
- }
-
- Date& operator=(const Date& d)
- {
- if (this != &d)
- {
- _year = d._year;
- _month = d._month;
- _day = d._day;
- }
-
- return *this;
- }
-
- private:
- int _year;
- int _month;
- int _day;
- };
- #include <iostream>
- using namespace std;
-
- class Date
- {
- public:
- Date(int year = 2024, int month = 2, int day = 4)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
- int _year;
- int _month;
- int _day;
- };
- // 赋值运算符重载成全局函数,注意重载成全局函数时没有this指针了,需要给两个参数
- Date& operator=(Date& left, const Date& right)
- {
- if (&left != &right)
- {
- left._year = right._year;
- left._month = right._month;
- left._day = right._day;
- }
-
- return left;
- }
- #include <iostream>
- using namespace std;
-
- class Time
- {
- public:
- Time()
- {
- _hour = 1;
- _minute = 1;
- _second = 1;
- }
-
- Time& operator=(const Time& t)
- {
- if (this != &t)
- {
- _hour = t._hour;
- _minute = t._minute;
- _second = t._second;
- }
-
- return *this;
- }
-
- private:
- int _hour;
- int _minute;
- int _second;
- };
-
- class Date
- {
- private:
- // 基本类型(内置类型)
- int _year = 1970;
- int _month = 1;
- int _day = 1;
-
- // 自定义类型
- Time _t;
- };
-
- int main()
- {
- Date d1;
- Date d2;
-
- d1 = d2;
-
- return 0;
- }
- #include <iostream>
- using namespace std;
-
- class Date
- {
- public:
- Date(int year = 2024, int month = 2, int day = 4)
- {
- _year = year;
- _month = month;
- _day = day;
- }
- // 前置++:返回+1之后的结果
- // 注意:this指向的对象函数结束后不会销毁,故以引用方式返回提高效率
- Date& operator++()
- {
- _day += 1;
- return *this;
- }
- // 后置++:
- // 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载
- // C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递
- // 注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存一份,然后给this + 1
- // 而temp是临时对象,因此只能以值的方式返回,不能返回引用
- Date operator++(int)
- {
- Date temp(*this);
- _day += 1;
- return temp;
- }
-
- private:
- int _year;
- int _month;
- int _day;
- };
-
- int main()
- {
- Date d;
- Date d1(2024, 2, 4);
-
- d = d1++;
- d = ++d1;
-
- return 0;
- }
- #include <iostream>
- using namespace std;
-
- class Date
- {
- public:
- // 获取某年某月的天数
- int GetMonthDay(int year, int month)
- {
- static int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,
- 31 };
- int day = days[month];
- if (month == 2
- && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
- {
- day += 1;
- }
- return day;
- }
-
- // 全缺省的构造函数
- Date(int year = 2024, int month = 1, int day = 1)
- {
- _year = year;
- _month = month;
- _day = day;
- }
-
- void Print()
- {
- cout << _year << "/" << _month << "/" << _day << endl;
- }
-
- // 拷贝构造函数
- // d2(d1)
- Date(const Date& d)
- {
- _year = d._year;
- _month = d._month;
- _day = d._day;
- }
-
- // 赋值运算符重载
- // d2 = d3 -> d2.operator=(&d2, d3)
- Date& operator=(const Date& d)
- {
- if (this != &d)
- {
- _year = d._year;
- _month = d._month;
- _day = d._day;
- }
- return *this;
- }
-
- // 析构函数
- ~Date()
- {
-
- }
-
- // 日期+=天数
- Date& operator+=(int day)
- {
- _day += day;
- while (_day > GetMonthDay(_year, _month))
- {
- // 月进位
- _day -= GetMonthDay(_year, _month);
- ++_month;
-
- // 月满了
- if (_month == 13)
- {
- ++_year;
- _month = 1;
- }
- }
-
- return *this;
- }
-
- // 日期+天数
- Date operator+(int day)
- {
- Date tmp(*this);
- tmp += day;
- return tmp;
- }
-
- // 日期-=天数
- Date& operator-=(int day)
- {
- if (day < 0)
- {
- return *this += (-day);
- }
-
- _day = _day - day;
- while (_day < 1)
- {
- _month -= 1;
- if (_month == 0)
- {
- _month = 12;
- --_year;
- }
-
- _day += GetMonthDay(_year, _month);
- }
-
- return *this;
- }
-
- // 日期-天数
- Date operator-(int day)
- {
- Date ret = *this;
- return ret -= day;
- }
-
- // 前置++
- Date& operator++()
- {
- _day += 1;
- return *this;
- }
-
- // 后置++
- Date operator++(int)
- {
- Date temp(*this);
- _day += 1;
- return temp;
- }
-
- // 后置--
- Date operator--(int)
- {
- Date tmp(*this);
- *this -= 1;
- return tmp;
- }
-
- // 前置--
- Date& operator--()
- {
- *this -= 1;
- return *this;
- }
-
- // <运算符重载
- bool operator < (const Date& d)
- {
- if (_year < d._year)
- {
- return true;
- }
- else if (_year == d._year && _month < d._month)
- {
- return true;
- }
- else if (_year == d._year && _month == d._month && _day < d._day)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
-
- // ==运算符重载
- bool operator==(const Date& d)
- {
- return _year == d._year
- && _month == d._month
- && _day == d._day;
- }
-
- // <=运算符重载
- bool operator <= (const Date& d)
- {
- return *this < d || *this == d;
- }
-
- // >运算符重载
- bool operator>(const Date& d)
- {
- return !(*this <= d);
- }
-
- // >=运算符重载
- bool operator >= (const Date& d)
- {
- return !(*this < d);
- }
-
- // !=运算符重载
- bool operator != (const Date& d)
- {
- return !(*this == d);
- }
-
- // 日期-日期 返回天数
- int operator-(const Date& d)
- {
- Date min = *this;
- Date max = d;
- int flag = -1;
- if (min > max)
- {
- min = d;
- max = *this;
- flag = 1;
- }
-
- int ret = 0;
- while (max > min)
- {
- min++;
- ret++;
- }
- return ret * flag;
- }
-
- private:
- int _year;
- int _month;
- int _day;
- };
- #include <iostream>
- using namespace std;
-
- class Date
- {
- public:
- Date* operator&()
- {
- return this;
- }
-
- const Date* operator&()const
- {
- return this;
- }
-
- private:
- int _year; // 年
- int _month; // 月
- int _day; // 日
- };
感谢大佬们滴支持!!!
一起互三啦!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。