数据共享和保护
一
这个代码是写静态成员以及静态成员函数的
#include <iostream>
using namespace std;
class A {
int i,j;
static int c;
public:
A(int a=0,int b=0) { i=a; j=b; c++; } //静态成员可以在类中直接访问
~A() { c--; }
static void f() { cout<<"c="<<c<<endl; }
/*
刚才试验了一下如果写的是
static void f() { cout<<"i="<<i<<endl; }
会编译错误,就是说静态成员函数只能访问静态成员
想一想这个很对,因为不同对象只有静态成员始终一样啊,其他私有成员肯定不行
*/
};
int A::c=0;
int main() {
A a(4,8),b,d;
a.f();//静态成员函数,可以通过对象访问,格式为(对象.成员)
{
A z(3,6), f;
A::f(); //也可以使用类名访问静态成员函数
}
A::f();
return 0;
}
二
已知f1和f2是同一个类的两个成员函数,但f1不能调用f2,下列选项中符合要求的是( )。
A、f1和f2都是静态函数
B、f1和f2都不是静态函数
C、f1是静态函数,f2不是静态函数
D、f1不是静态函数,f2是静态函数
ans:C
静态数据成员需要使用静态成员函数访问,普通成员函数可以调用静态成员函数以便操作静态成员,静态成员函数不能调用普通成员函数,普通成员函数也可以访问静态成员。不过普通成员函数得通过对象访问函数,不能像静态成员函数那样用`类名::静态函数名`来访问
三
友元
友元函数:
有时候我们需要一个类外定义的函数能够访问类中的private和protected函数,那么就使用友元函数,注意友元函数并不是属于任何一个类的成员函数。
#include <iostream>
using namespace std;
class Box
{
double width;
public:
friend void printWidth( Box box );
//声明一下这个函数是该类的友元函数,就可以从外面访问类中的私有和保护成成员
void setWidth( double wid );
};
// 成员函数定义
void Box::setWidth( double wid )
{
width = wid;
}
// 请注意:printWidth() 不是任何类的成员函数
void printWidth( Box box )
{
/* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */
cout << "Width of box : " << box.width <<endl;
}
// 程序的主函数
int main( )
{
Box box;
// 使用成员函数设置宽度
box.setWidth(10.0);
// 使用友元函数输出宽度
printWidth( box );
return 0;
}
友元类
注意友元的关系是单向的,这个和人类之前的朋友关系不同
仔细体会下面的代码
#include<iostream>
using namespace std;
class CCar
{
private:
int price=0;
friend class CDriver; //声明 CDriver 为友元类
public:
void p(){
cout<<price;
}
};
class CDriver
{
public:
CCar myCar;
void ModifyCar() //改装汽车
{
myCar.price += 1000; //因CDriver是CCar的友元类,故此处可以访问其私有成员
}
};
int main()
{
CCar a;
CDriver b;
b.ModifyCar();
b.myCar.p();
return 0;
}
四/数据的保护
主要利用const,这个等期末复习时候更新
- 常数据成员必须被初始化,并且不能被更新
class A{
publie:
A(){data=0;}
~A(){}
int GetData ( ) const { return data;}
void SetData(int n) {data=n;}
private:
int data;
};
const A a;
A b;
下列函数调用中错误的是( )。
A. a.GetData();
B. a.SetData(10);
C. b.GetData();
D. b.SetData(10);
我的答案: B正确答案: B