const关键字:
C语言—>const只能修饰变量 C++—>const修改全局或者局部变量、修饰成员函数、修饰成员变量 若一定修改某个成员变量时在定义该成员变量的时候,使用mutable关键字修改该成员
class Date
{
public:
void Print()const
{
_day++;
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
mutable int _day;
};
静态成员函数:
0.通过对象.静态成员函数(…)||类名::静态成员函数(…) 1.必须被static修饰 2.没有this指针,不能直接访问非静态成员变量 3.不可被const修饰
普通成员函数:
0.必须通过对象.静态成员函数(…) 1.不需要static修饰 2.具有隐藏的this指针,可访问普通成员函数 3.可被const修饰
class Date
{
public:
static int Getcount()
{
return _count;
}
private:
int _year;
int _month;
static int _count;
};
int Date::_count = 0;
int main()
{
TestDate();
cout << Date::Getcount() << endl;
}
构造函数:
成员变量顺序和初始化列表顺序须保持一致
初始化列表可以不写,不写不代表编译器不执行初始化列表 如果用户满没有显示写出初始化列表,编译器会自动补全 对于类中内置类型成员变量,使用随机值填充 对于类中自定义类型的成员变量,调用对应类的无参或者全缺省参数初始化构造
explicit Date(int year = 1999, int month = 1, int day = 1) :_year(year), _month(month), _day(day)
{}
void TestDate4()
{
Date d(2022);
}
拷贝构造函数 :
Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
void TestDate1()
{
Date d1(1999, 1, 1);
Date d2(d1);
}
void TestDate2(Date d)
{
}
Date TestDate3()
{
Date d;
return d;
}
重载:
重载==
bool operator==(const Date& d)
{
return _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;
}
重载 后置++ 前置++
Date& operator++(int)
{
Date temp(*this);
_day += 1;
return temp;
}
Date& operator++()
{
_day += 1;
return *this;
}
重载流运算符: 第一个参数必须是ostream&,因此该运算符不能重载成类的成员函数,只能重载成全局函数,并在类中声明友元函数 类的成员函数**(不使用)**:
void operator<<(ostream& out)
{
out << _year << "/" << _month << "/" << _day << endl;
}
全局函数,在类中的友元函数:
class Date
{
public:
Date(int year = 1999, int month = 1, int day = 1) :_year(year), _month(month), _day(day)
{
}
friend ostream& operator<<(ostream& out, const Date& d);
friend istream& operator>>(istream& in, Date& d);
private:
int _year;
int _month;
int _day;
};
ostream& operator<<(ostream& out, const Date& d)
{
out << d._year << "/" << d._month << "/" << d._day ;
}
istream& operator>>(istream& in, Date& d)
{
in >> d._year >> d._month >> d._day;
}
int main()
{
Date d1(2222,2,2);
cout<<d1;
}
析构函数
~Date()
{
}
友元函数:
1.不是成员函数,则没有this指针 2.不能被const修饰,因为没有this指针 3.不受访问限定符约束,因为不是类的成员函数 4.一个类可拥有多个友元函数 5.不具有交换性
class Time
{
public:
Time(int hour,int minute,int second):_hour(hour),_minute(minute),_second(second)
{}
friend void TestFriend();
private:
int _hour;
int _minute;
int _second;
};
class Date
{
public:
Date(int year = 1999, int month = 1, int day = 1) :_year(year), _month(month), _day(day)
{
}
friend void TestFriend();
private:
int _year;
int _month;
mutable int _day;
};
void TestFriend()
{
Date d(2002,1,1);
d._day+=1;
Time t(16,2,1);
t._second+=1;
}
内部类:(外部类的友元类)
是一个独立的类,不属于外部类,更不能通过外部类的对象去访问内部类的成员
class List
{
class ListNode
{
public:
ListNode(ListNode* next, int data = 0) :_next(nullptr), _data(data)
{
}
private:
ListNode* _next;
int _data;
};
public:
List(List* head) :_head(nullptr)
{
}
public:
void PushBack(int data)
{
}
void PushFront(int data)
{
}
void PopBack()
{
}
void PopFront()
{
}
private:
List* _head;
};
|