静态成员
同类的多个成员实现数据共享(全局变量破坏封装性,但静态成员要注意作用域)
●静态数据成员
1.只能在类体外初始化,通过类名引用(而不是对象)
2.在类外可以用对象引用公共静态数据成员,也可用类名引用静态数据成员
3.私有静态数据成员必须通过公共成员函数引用(公共成员函数可以引用静态和非静态数据成员)
●静态成员函数
1.可被对象或者类调用(一般用类Box::)
2.静态成员函数没有this指针,故不能访问本类中的非静态成员,而主要用来访问静态数据成员
(若要调用,则应该用对象或者对象的引用做参数)
友元
1.友元函数
●友元函数
类外定义的普通函数作为类的友元,若要访问类中的私有数据,需要建立形参对象才能访问
friend void display(Time &);
void display(Time &t){cout << t.hour;}
●友元成员函数
Time的成员函数访问Date的数据成员
需要Date类的提前声明,类内此函数的友元类引用,友元类中的友元函数声明
class Date;
class Time
{public:
void display();
void display(Date &);}
class Date
{friend void Time::display(Date &);}
void Time::display(Date &d)
{cout << d.month;}
t1.display();
t1.display(d1);//也要通过对象t1调用类中函数;
2.友元类
若类B是类A 的友元类,B中所有函数可以访问A中的数据成员
友元是封装的补充,一般不建议使用
单向性,不可传递
class Date;
class Time
{friendDate;
Public:…………}
总结:若B想访问A,那么A就必须在本类中声明friendB(函数或类),那么B就是A的友元
模板
首先看一下函数模板,T为数据类型
功能相同而数据类型不同的函数
Template<typename T>
T max(Ta, T b, T c){…returna;}
int i1=1,i2=2,i3=3,i;
i=max(i1,i2,i3);
类模板
功能相同而数据类型不同的类
Template<typename T>
class Compare
{public:Compare(T a, T b); T max();
private:T x, y;}
Compare<int>cmp(1,2);
注意:如果在类模板外定义成员函数,每个都要加template:
templare<typenameT>
void Compare<T>::display(){…………;}
说明:
模板类型参数可以有多个,可以是类型也可以是参数
templare<typename T,typename N,int KV>
class Some;
Some<int, double,5>obj;
总结:
static :同类不同对象的共享数据
友元:类之间(或对函数)的定向共享
模板:数据类型或参数的参数化