取地址及const取地址操作符重载
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 = 1900, int month = 1, int day = 1);
// 拷贝构造函数
// d2(d1)
Date(const Date& d);
// 赋值运算符重载
// d2 = d3 -> d2.operator=(&d2, d3)
Date& operator=(const Date& d);
// 析构函数
~Date();
// 日期+=天数
Date& operator+=(int day);
// 日期+天数
Date operator+(int day);
// 日期-天数
Date operator-(int day);
// 日期-=天数
Date& operator-=(int day);
// 前置++
Date& operator++();
// 后置++
Date operator++(int);
// 后置--
Date operator--(int);
// 前置--
Date& operator--();
// >运算符重载
bool operator>(const Date& d);
// ==运算符重载
bool operator==(const Date& d);
// >=运算符重载
bool operator >= (const Date& d);
// <运算符重载
bool operator < (const Date& d);
// <=运算符重载
bool operator <= (const Date& d);
// !=运算符重载
bool operator != (const Date& d);
// 日期-日期 返回天数
int operator-(const Date& d);
private:
int _year;
int _month;
int _day;
}
将const修饰的“成员函数"”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
例子:
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << "Print()" << endl;
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
void Print() const
{
cout << "Print()const" << endl;
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
void Test()
{
Date d1(2022,1,13);
d1.Print();
const Date d2(2022,1,13);
d2.Print();
}
在 C++ 中,const
对象、非 const
对象、const
成员函数和非 const
成员函数之间的关系是理解对象和成员函数修饰符的重要方面。
思考下面的几个问题:
const
对象可以调用非 const
成员函数吗?答案:不可以。
当你有一个 const
对象时,它被视为不可修改的。这意味着你不能调用会修改对象状态的非 const
成员函数。例如:
class MyClass {
public:
void nonConstFunction() {
// 这个函数会修改对象的状态
}
};
const MyClass obj;
obj.nonConstFunction(); // 错误:无法从 const 对象调用非 const 成员函数
const
对象可以调用 const
成员函数吗?答案:可以。
非 const
对象可以调用 const
成员函数,因为 const
成员函数承诺不修改对象的状态。例如:
class MyClass {
public:
void constFunction() const {
// 这个函数不会修改对象的状态
}
};
MyClass obj;
obj.constFunction(); // 正确:可以从非 const 对象调用 const 成员函数
const
成员函数内可以调用其它的非 const
成员函数吗?答案:不可以。
在 const
成员函数内部,不能调用任何非 const
成员函数,因为 const
成员函数不允许修改对象的状态。这是为了保持 const
的语义。例如:
class MyClass {
public:
void nonConstFunction() {
// 这个函数会修改对象的状态
}
void constFunction() const {
nonConstFunction(); // 错误:无法在 const 成员函数中调用非 const 成员函数
}
};
const
成员函数内可以调用其它的 const
成员函数吗?答案:可以。
非 const
成员函数可以调用 const
成员函数,因为 const
成员函数不会修改对象的状态。如下所示:
class MyClass {
public:
void constFunction() const {
// 这个函数不会修改对象的状态
}
void nonConstFunction() {
constFunction(); // 正确:可以在非 const 成员函数中调用 const 成员函数
}
};
const
对象不能调用非 const
成员函数。const
对象可以调用 const
成员函数。const
成员函数不能调用非 const
成员函数。const
成员函数可以调用 const
成员函数。这些规则确保了对象的状态被正确管理和保护,符合 C++ 的设计原则。
这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
class Date
{
public :
Date* operator&()
{
return this ;
}
const Date* operator&()const
{
return this ;
}
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需 要重载,比如想让别人获取到指定的内容
希望对你有帮助!加油!
若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!