类和对象
1、类
访问权限:
- 说明为公有的成员可以被程序中任何代码访问;
- 说明为私有的成员只能被类本身的成员函数及友元的成员函数访问,其他类的成员函数,包括其派生类的成员函数都不能访问它们;
- 说明为保护的成员与私有成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类的成员也可以访问。
实例
class A
{
private:
int i;
protected:
int j;
public:
int k;
int geti(){
return i; //类的成员函数可以访问类的私有成员i
}
int getj(){
return j; //类的成员函数可以访问类的保护成员j
}
int getk(){
return k; //类的成员函数可以访问类的公有成员k
}
};
A a; //定义类A的对象a
a.i; //非法,i为A的私有成员
a.j; //非法,j为A的保护成员
a.k; //合法,k为A的公有成员
2、友元
(1)友元函数是一种特殊的函数,它需要在类体内进行说明,可以访问类的私有成员,但又不是类的成员函数。友元函数是一种能够访问类中的私有成员的非成员函数。
友元的作用在于可以提高程序的运行效率,但是它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
示例
#include <iostream> using namespace std; class Point_T { public: Point_T(double a,double b) { x=a;y=b; cout<<"点:("<<x<<","<<y<<")"<<endl; } friend double dist(Point_T &a,Point_T &b) //友元函数 { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } private: double x,y; }; int main() { Point_T p1(2,3),p2(5,5); cout<<dist(p1,p2)<<endl; //调用友元函数 system("pause"); return 0; }
另一种形式
#include <iostream> using namespace std; class Point_T { public: Point_T(double a,double b) { x=a;y=b; cout<<"点:("<<x<<","<<y<<")"<<endl; } friend double dist(Point_T &a,Point_T &b); //声明友元函数 private: double x,y; }; double dist(Point_T &a,Point_T &b) //定义友元函数 { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main() { Point_T p1(2,3),p2(5,5); cout<<dist(p1,p2)<<endl; //调用友元函数 system("pause"); return 0; }
运行结果:
(2)友元类
友元还可以是一个类,即一个类B可以作为另一个类A的友元。当一个类B作为另一个类A的友元时,就意味着这个类B的所有成员函数都是另一个类A的友元函数。
注意:
- 友元的关系式单向的而不是双向的。如声明B类是A类的友元类,不等于A类是B类的友元类,A类中的成员函数不能访问B类中的私有数据。
- 友元的关系不能传递,如果B类是A类的友元类,C类是B类的友元类,不等于C类是A类的友元类。
#include <iostream> using namespace std; class A { public: A() {x=5;} friend class B; //定义类B是类A的友元类 private: int x; }; class B { public: void disp1(A tmp) { tmp.x++; cout<<"disp1:x="<<tmp.x<<endl; } void disp2(A tmp) { tmp.x--; cout<<"disp2:x="<<tmp.x<<endl; } }; int main() { A obj1; B obj2; obj2.disp1(obj1); obj2.disp2(obj1); system("pause"); return 0; }
类B是类A的友元类,类B包括两个成员函数,这两个成员函数可以当成类A自己的友元函数一样使用。
3、基类和派生类
继承方式:
- public:公有继承
当派生类的继承方式是public继承时,基类的public和protected成员的访问属性在派生类中保持不变,而基类的private成员不可访问,即基类的public和protected成员分别作为派生类的public和protected成员,派生类的其他成员可以直接访问它们。
- private:私有继承(默认的继承方式)
当派生类的继承方式是private继承时,基类的public和protected成员可以被继承到派生类中,但访问属性都变为private,而基类的private成员不可访问,即基类的public和protected成员都作为派生类的private成员,派生类的其他成员可以直接访问它们。
- protected:保护继承
当派生类的继承方式是protected继承时,基类的public和protected成员可以被继承到派生类中,但访问属性都变为protected,而基类的private成员不可访问,即基类的public和protected成员都作为派生类的protected成员,派生类的其他成员可以直接访问它们。