(这只是在下的粗浅理解,不足的地方还请谅解,欢迎留言提出,后期理解深入后会加以改进)
const成员函数
在成员函数后面加const, const修饰this指针所指向的对象,也就是保证调用这个const成员函数的对象在函数中不会被改变
如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,
编译器将指出错误,这无疑会提高程序的健壮性。
下面看个例子
关于const函数的几点规则:
1、const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数
(权限只能被缩小,不能被放大)
2、const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的
3、const成员函数不可以修改对象的数据,不管对象是否具有const性质,在编译时,会对齐进行检查
内联函数:(inline)
以inline修饰的函数叫做内联函数,编译时C++编译器会调用内联函数的展开,没有函数压栈的开销,
内联函数提升程序运行的效率
1、inline是一种以空间换时间的做法,省去调用函数额开销,所有代码很长或者有循环/递归的函数不适宜使用内联
2、inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,
编译器优化时会忽略掉内联
3、inline必须函数定义放在一起,才能成为内联函数,仅将inline放在声明前是不起作用的
4、定义在类内的成员函数默认定义为内联函数
class Date
{
public:
void Func() // 定义在类内部默认为内联函数
{}
void Display();
private:
int _year; // 年
int _month ; // 月
int _day ; // 日
};
inline void Date::Display() // 成员函数定义为内联
{
cout<<"year:" <<_year<< endl;
cout<<"month:" <<_month<< endl;
cout<<"day:" <<_day<< endl;
}
inline void Test() // 全局函数定义为内联
{}
友元:
友元函数:
友元函数是能够访问类中私有成员的非成员函数,从语法上看,但在定义上与普通函数一样
友元关系不具备对称性:A是B的友元,B不一定是A的友元
友元关系不具备传递性:A是B的友元,B是C的友元,但A不一定是C的友元
作用:友元提供了不同类的成员函数之间,类的成员函数与一般函数之间进行数据共享的机制
友元可以让一个不同函数或另一个类中的成员可以访问类中的私有成员和保护成员
好处与缺点:友元的正确使用能够提高程序的运行效率,但也破坏了类的封装性和数据的隐蔽性,
导致了程序可维护型变差,所以友元不可多用
如下Date是Time的友元,可以在Date类中定义 Time t;来访问Time类中的成员
class Time
{
// Date是Time 的友元,所以 Date可以访问Time的所有成员。
friend class Date;
private :
int _hour ;
int _minute ;
int _second ;
};
class Date
{
public:
void Display()
{
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl;
// 定义为友元类后,可以访问Time类对象的所有成员
cout<<"hour:" <<_t. _hour<<endl ;
cout<<"minute:" <<_t. _minute<<endl ;
cout<<"second:" <<_t. _second<<endl <<endl;
}
private :
int _year;
int _month;
int _day;
Time _t;
};
static成员:(类的静态成员)
类里面static修饰的成员你,称之为静态类成员,类的静态成员是该类型的所有对象所共享,属于整个类
使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存
静态成员函数没有隐含this指针参数,所以可以使用类型::作用域访问符直接调用静态成员函数
调用规则:
1、静态成员函数中不能调用非静态成员
2、非静态成员函数中可以调用静态成员,静态成员属于类本生,在类的对象产生之前就已经存在了
3、静态成员变量使用前必须初始化,否则会在linker是出错
静态成员的定义及使用
class Date
{
public:
Date()
{
cout << "Date ()" << endl;
++sCount;
}
void Display()
{
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _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();
}