const修饰成员函数
在成员函数后面加一个const, const修饰this指针指向的对象, 保证调用这个const成员函数的对象在函数内不会被改变
注意:成员函数如果不修改成员变量,则加上const,成员函数如果要修改成员变量,此时就不能给其加上const修饰了
1.const对象不能调用非const成员函数,可以调用const成员函数
2.非const对象可以调用非const成员函数和const成员函数
3.const成员函数可以调用其他的const成员函数,但是不能调用其他的非const成员函数
4.非const成员函数内可以调用其他const成员函数和非const成员函数
总结一下,对象在调用成员函数的时候作用域只能缩小,不能增大.
inline内联
用inline关键字修饰的函数 叫做内敛函数,编译器在进行编译的时候,会在调用该函数的地方将该函数进行展开, 没有函数的压栈过程,因此内联函数运行效率较高
1.inline是一种以空间换时间的做法, 省去了调用函数时候的压栈开销, 因此循环递归等不适宜内联函数
2.内联函数只是一个建议,编译会将其自动优化,如果涉及到的函数是递归循环等, 编译器会将内联忽略
3.定义在类内的函数默认为是内联函数
宏的优点以及缺点
宏的优点
增加代码的复用性,提高性能
宏的缺点
宏不方便调试,因为宏的展开是在预处理阶段对其进行展开的
宏的可读性较差,可维护性较差, 如果不注意会导致错误
宏无类型,安全机制较差
友元
友元函数:突破类的封装过程
在c++中友元函数允许在类外访问该雷的所有成员函数,就像成员函数一样, 友元函数只需要在该函数前面加上关键字friend
友元函数可以通过对象访问所有成员,私有和保护也一样
友元类:
有两个类 A 和 B, 其中A类的私有成员之一是B类的一个对象, 此时此时A类就是B类的友元类
class Date
{
friend void Show(const Date& d);
friend ostream& operator << (ostream& out, const Date& d);
friend istream& operator >> (istream& in, Date& d);
friend class Time;
public:
Date(int year = 1900, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{
cout << "Date(int year = 1900, int month = 1, int day = 1)" << endl;
}
void Display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
~Date()
{
cout << "~Date()" << endl;
}
Date(const Date& d)
{
this -> _year = d._year;
this -> _month = d._month;
this -> _day = d._day;
cout << "Date(const Date& d)" << endl;
}
Date& operator = (const Date& d)
{
this -> _year = d._year;
this -> _month = d._month;
this -> _day = d._day;
cout << "Date& operator = (const Date& d)" << endl;
return *this;
}
private:
int _year;
int _month;
int _day;
};
class Time
{
public:
Time(int year = 1900, int month = 1, int day = 1, int hour = 0, int minute = 0, int second = 0)
:_hour(hour)
,_minute(minute)
,_second(second)
{
_d._year = year;
_d._month = month;
_d._day = day;
}
void Show()
{
cout << _d._year << "-" << _d._month << "-" << _d._day << endl;
cout << _hour << ":" << _minute << ":" << _second << endl;
}
private:
int _hour;
int _minute;
int _second;
Date _d;
};
注意: 不是任何时候友元都比较好, 我们应该知道友元是对类的封装的一个突破, 所以应在下档的时候使用.
类的静态成员
类里面的成员用static 关键字进行修饰的都叫做静态成员. 其中静态成员是属于这个类的不属于某个对象,即static成员属于这个类的所有对象,不被某个对象所独有
静态成员函数没有隐含的this指针,那么在访问静态成员函数的时候只需要使用了类型::作用域访问符便可以调用该静态成员函数
//代码展示:
class Date
{
public:
Date()
{
sCount++;
cout << "Date() " << endl;
}
void Display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
static void PrintCount()
{
cout << "Date count:" << sCount << endl;
}
private:
int _year;
int _month;
int _day;
private:
static int sCount;
};
int Date::sCount = 0;
void Test()
{
Date d1,d2;
Date::PrintCount();
}
注意静态成员函数不能访问非静态成员,但是非静态成员函数可以访问静态成员
几个小细节
1.匿名对象(date())存在的生命周期是它所在的那一行, 同时也要注意当我们已经自己写了拷贝构造函数的时候, 此时编译器就不会自动生成构造函数
2.等号两边两个类型不同的时候小类型会转向大类型
3.在写工程时,为什么.cpp和.h分开
(1)方便阅读
(2)封装(开源和闭源)
(3)提高编译速度