,友元类的所有成员函数都可以访问授予友元关系的那个类的非公有成员。
classScreen {
friendWindow_Mgr&Window_Mgr::relocate(Window_Mgr::index,Window_Mgr::index,Screen&); //友元成员函数
};
ps:当我们将成员函数声明为友元时,函数名必须用该函数所属的类名字加以限定。
? 友元声明与作用域
为了正确地构造类,需要注意友元声明与友元定义之间的互相依赖。在前面的例子中,类 Window_Mgr 必须先定义。否则,Screen 类就不能将一个Window_Mgr 函数指定为友元。然而,只有在定义类 Screen 之后,才能定义relocate 函数——毕竟,它被设为友元是为了访问类 Screen 的成员。
?
? static类成员
类可以定义共享的 static 数据成员,类也可以定义 static 成员函数。static 成员函数没有 this 形参,它可以直接访问所属类的 static 成员,但不能直接使用非 static 成员。
?
ps:可以通过作用域操作符从类直接调用 static 成员,或者通过对象、引用或指向该类类型对象的指针间接调用。如:
classAccount {
public:
void applyint() { amount += amount * interestRate; }
static double rate() {return interestRate; }
static void rate(double);// sets a new rate
private:
std::string owner;
double amount;
static double interestRate;
static double initRate();
};
Accountac1;
Account*ac2 = &ac1;
rate =ac1.rate(); // through an Account object or reference
rate =ac2->rate(); // through a pointer to anAccount object
rate =Account::rate(); // directly from the class using thescope operator
ps:当我们在类的外部定义 static 成员时,无须重复指定 static 保留字,该保留字只出现在类定义体内部的声明处,同explicit。
pps:因为 static 成员不是任何对象的组成部分,所以 static 成员函数不能被声明为 const。毕竟,将成员函数声明为const 就是承诺不会修改调用该函数的对象,而static成员函数本质上是类名换用(即使用对象调用了!)。 最后, static 成员函数也不能被声明为虚函数(不被重写!!)。
ppps:static 数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。
double Account::interestRate = initRate();
同static成员函数,static 关键字只能用于类定义体内部的声明中,定义不能标示为static。
? 特殊的整型 const static 成员,可以在类的定义体中进行初始化。
classAccount {
public:
static double rate() { return interestRate; }
static void rate(double); // sets a new rate
private:
static const int period = 30; // interest postedevery 30 days
double daily_tbl[period]; // ok: period is constant expression
};
constint Account::period; //没有static,没有初始值
?
ps:const static 数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行定义。在类内部提供初始化式时,成员的定义不必再指定初始值,如上。
?