在类的内部所有成员之间都可以通过成员函数直接访问,但是类的外部不能访问对象的私有成员。
例2.3 一个存在错误的程序 #include <iostream.h> class Date { public: void setDate(int y,int m,int d); void showDate(); private: int year; int month; int day; }; void Date∷setDate(int y,int m,int d) { year=y; month=m; day=d; } inline void Date∷showDate() { cout<<year<<"."<<month<<"."<<day<<endl; } void main() { Date date1,date2; cout<<"Date1 set and output:"<<endl; date1.setDate(1998,4,28); cout<<date1.year<<"."<<date1.month<<"."<<date1.day<<endl; //错误 date1.showDate(); cout<<"Date2 set and output: "<<endl; date2.setDate(2002,11,14); cout<<date2.year<<"."<<date2.month<<"."<<date2.day<<endl; //错误 date2.showDate();• }在定义对象时,若定义的是指向对象的指针,则访问此对象的成员时,要用“->”操作符。
void main( ) { Date *date3; date3->setDate(2001,8,15); //…… } 3.3 类成员的访问属性类成员有三种访问属性:公有(public)、 私有(private) 和保护(protected) 。
说明为公有的成员不但可以被类中成员函数访问;
还可在类的外部,通过类的对象进行访问。
说明为私有的成员只能被类中成员函数访问,不能
在类的外部,通过类的对象进行访问。
说明为保护的成员除了类本身的成员函数可以访
问外,该类的派生类的成员也可以访问,但不能在类的
外部,通过类的对象进行访问。类成员的访问属性
类的成员对类对象的可见性和对类的成员函数的可见性是不同的。
类的成员函数可以访问类的所有成员,而类的对象对类的成员的访问是受类成员的访问属性的制约的。
3.4 类中成员的访问方式类中成员互访:直接使用成员名
类外访问:使用“对象名.成员名”方式访问 public 属性的成员
class Sample{ public: int k; int geti(){return i;} int getj(){return j;}int getk(){return k;} private: int i; protected: int j; }; //…… Sample a; //定义类Sample的对象a a.i; //非法,类Sample的对象a不能访问类的私有成员i a.j; //非法,类Sample的对象a不能访问类的保护成员j a.k; //合法,类Sample的对象a能访问类的公有成员k //……一般来说,公有成员是类的对外接口,而私有成员和保护成员是类的内部数据和内部实现,不希望外界访问。
将类的成员划分为不同的访问级别有两个好处:一是信息隐蔽,即实现封装;二是数据保护,即将类的重要信息保护起来,以免其它程序不恰当地修改。
3.5 对象赋值语句两个同类型的变量之间可以相互赋值。同类型的对象间也可以进行赋值,当一个对象赋值给另一个对象时,所有的数据成员都会逐位拷贝。
例2.5 #include<iostream.h> class abc{ public: void init(int i,int j) { a=i; b=j; } void show(){ cout<<a<<" "<<b<<endl; } private: int a,b; }; main() { abc o1,o2; o1.init(12,34); o2=o1; // 将对象o1数据成员的值赋给对象o2 o1.show(); o2.show(); return 0; } 说明:在使用对象赋值语句进行对象赋值时,两个对象的类型必须相同,如果对象的类型不同,编译时将出错。
两个对象之间的赋值,仅仅使这些对象中数据成员相同,而两个对象仍是分离的。
例2.5的对象赋值是通过缺省的赋值运算符函数实现的。
当类中存在指针时,使用缺省的赋值运算符进行对象赋值,可能会产生错误。
3.6 类的作用域所谓类的作用域就是指在类声明中的一对花括号所形成的作用域。
一个类的所有成员都在该类的作用域内,一个类的任何成员可以访问该类的其他成员。
一个类的成员函数可以不受限制地访问类的成员,而在类的外部,对该类的数据成员和成员函数的访问则要受到一定的限制,有时甚至是不允许的,这体现了类的封装功能。
例2.6 理解类的作用域 # include<iostream.h> class myclass{ public: int i; void init(int); void show(){ cout<<“i=” <<i<<endl;} // 可以访问类中的数据成员i }; void myclass::init(int si){ i=si;} // 可以访问类中的数据成员i int fun(){ return i; } // 非法,不能直接访问类中的i void main() { myclass ob; ob.init(5); // 给数据成员i赋初值5 ob.show(); i=8; // 非法,不能直接访问类中的i,可改写成ob.i=8 ob.show(); }