6. this指针:在成员函数中访问数据成员或调用其他成员函数不需要指定对象,因为他们都是通过一个隐藏的this 指针确定当前的对象。 例如:void Time :: showTime() {cout<<hour’:’<<minute<<’:’<<second<<endl;} 而实际上编译器会把this指针作为成员函数的参数,即上述函数定义等同于: void Time :: showTime(Time* this) { cout<<this->hour’:’<< this->minute<<’:’<< this->second<<endl;} 在一个成员函数中经常需要调用其他函数(非本类的成员函数),而有时需要把当前对象(即对象的地址)作为参数传递给被调用函数,这是必须使用this指针。 区别于非静态成员函数,静态成员函数没有this指针,因为静态成员函数属于整个类,它只有一个运动实例,不需要通过对象,通过类就可以调用它。 7. 友元 定义:友元的另一种类型是友元类,一个类可以声明另一个类为其友元类,友元类的所有成员函数都可以访问 声明其为友元类的所有成员。 构成:一个函数要成为一个类的有元函数,需要在类的定义中声明该函数,并在函数声明的前面加上关键字friend。 作用:友元提供了不同类或不同类的成员函数之间以及成员函数和一般函数之间的数据共享机制。 注意:友元关系是单方向的,不具有交换性和传递性。 8. 常对象和常对象成员:对于急需要共享又需要安全的数据,可以利用const来进行保护。 常对象:常对象的数据成员的值在对象的整个生存期内不能被改变,必须利用构造函数进行初始化,且以后不能再被更新。声明格式有以下两种: const<类名><对象名>(初始值类表) <类名> const <对象名>(初始值类表) 例如:const Time meeting(8,30,00); 10. 常成员函数:可以使用const关键字限制成员函数对数据成员进行修改操作,这种使用const关键字进行声明的 成员函数称为常成员函数。格式如下: <函数类型> <函数名> (<参数表>) const; 例如,下面声明的成员函数MemberFun()就不能修改对象的数据成员。 void MemberFun() const; 在常成员函数中只能调用常成员函数,而调用其他普通函数可能会造成简介修改数据成员。 常数据成员:可以使用const关键字将数据成员声明为常数据成员。常数据成员的初始值只能通过构造函数获取,并且只能在构造函数的初始化列表中设置其初始值。静态常数据成员初始化只能在类体外进行。 11. 继承与派生:C++中,可以在已有类的基础上定义一个新类,新类称为原有类的派生类或子类,而原有类称为 新定义类的基类或父类。 语法如下: class<派生类名> : [<派生方式>] <基类名>{… //派生类新增加的成员声明列表}; 例如: class Car : public Vehicle{… //在派生类Car中新增加的成员}; 基类中原有成员的访问权限在派生类中可以被修改,它们的访问权限由派生类定义中的<派生方式>决定。但注意,为了不破坏基类的封装性,无论采用哪种派生方式,基类的私有成员在派生类中都是不可见的,即不允许在派生类的成员函数中访问基类的私有成员。 public:punlic(公有派生)是类继承中最常见派生方式。这样就可以在派生类的成员函数中访问基类中原有的非私有成员,并能通过派生类的对象直接访问基类中原有的公有成员。 private:采用private(私有派生),只允许在派生类的成员函数中访问基类的非私有成员,不能通过派生类的对象直接访问基类的任何成员。 protected:采用protected(保护派生),基类中所有的公有和保护成员在派生类中都成为保护成员。 总结:派生方式就是把基类的非私有成员在派生类中以什么类型存在。 |