5-7 定义一个Cat类,拥有静态数据成员numOfCats,记录Cat的个体数目;静态成员函数getNumOfCats(),读取numOfCats.设计程序测试这个类,体会静态数据成员和静态成员函数的用法。
#include<iostream>
using namespace std;
class Cat{
static int numOfCats;
public:
Cat(){ numOfCats++; }
~Cat(){ numOfCats--;}
static int getNumOfCats();
};
int Cat::getNumOfCats(){
return numOfCats;
}
int Cat::numOfCats=0;
int main(){
Cat A;
cout<<Cat::getNumOfCats()<<endl;
cout<<A.getNumOfCats();
return 0;
}
5-10在一个文件中定义一个全局变量n,主函数main(),在另一个文件中定义函数fnl(),在main()中对n赋值,再调用fnl(),在fnl()中也对n赋值,显示n最后的值。
#include<iostream>
#include "test2.cpp"
using namespace std;
int n;
int main(){
n=1;
fnl();
cout<<n;
return 0;
}
//test2.cpp
#include<iostream>
using namespace std;
extern int n;
void fnl(){
n=2;
}
extern int n;
5-12 在函数fnl()中定义一个静态变量n,fnl()中对n的值加1,在主函数中,调用nl()十次,显示n的值。——static静态,让局部变量延长生存期
#include<iostream>
using namespace std;
void fn1(){
static int n1=0;
int n2=0;
n1++;
n2++;
cout<<"n1= "<<n1<<endl;
cout<<"n2= "<<n2<<endl;
}
int main(){
for(int i=0;i<10;++i)
fn1();
return 0;
}
5-13 定义类X,Y,Z,函数 h(X*),满足:类X有私有成员i,Y的成员函数 g(X*) 是X的友元函数,实现对X的成员i加1;类Z是类X的友元类,其成员函数 f(X*) 实现对X的成员i加5;函数 h(X*) 是X的友元函数,实现对X的成员i加10,在一个文件中定义和实现类,在另一个文件中实现main()函数。
-嵌套调用:
- 先声明了才能调用。
- 类只声明不实现的时候不能有对象,此时可以不写对象(X* )vs(X* x)
- 此时函数声明可以没有具体形参名字,只有形参类型 (X* ),实现加名字(X* x)
- friend 完整的声明:friend class A; friend void Y::g(X* );
#include<iostream>
using namespace std;
//先写才能调用
class X;
class Y{
public:
void g(X* );
};
class Z{
public:
void f(X* );
};
class X{
int i;
public:
X( ){ i=0; }
friend void Y::g(X* );
friend class Z;
friend void h(X*);
void showi(){ cout<<i<<endl;
}
};
void Y::g(X* x){x->i++;}
void Z::f(X* x){x->i+=5;}
void h(X* x){x->i+=10;}
int main(){
X x;
x.showi();
Z z;
z.f(&x);
x.showi();
Y y;
y.g(&x);
x.showi();
h(&x);
x.showi();
return 0;
}
5-14 定义Boat与Car两个类,二者都有weight属性,定义二者的一个友元函数getTotalWeight().计算二者的重量和。
#include<iostream>
using namespace std;
class Car;
class Boat{
double weight;
public:
Boat(int w=0):weight(w){ }
friend double getTotalWeight(Boat& b,Car&a);
};
class Car{
double weight;
public:
Car(int w=0):weight(w){ }
friend double getTotalWeight(Boat&b,Car&a);
};
double getTotalWeight(Boat& b,Car& a){
return b.weight+a.weight;
}
int main(){
Boat b(3);
Car c(5);
cout<< getTotalWeight(b,c);
return 0;
}
小结
-嵌套调用:
- 先声明了才能调用。
- 类只声明不实现的时候不能有对象
- 此时函数声明可以没有具体形参名字,只有形参类型 (X* ),实现加名字(X* x)
- friend 完整的声明:friend class A; friend void Y::g(X* );