23.c/c++程序员面试宝典-类成员
在c++中,运行库可以定义类的成员,类的成员包括数据、函数和嵌套类型,它们一起组成了类。
面试题100 成员变量有哪些访问方式****
分析:在类的成员中,类的数据变量就是类的成员变量。
在c、c++中,类的成员变量有3种访问方式,分别是private,public和protected,它们的访问权限如下所示:
private:只能由该类中的方法访问,是私有变量,不能被该类的对象访问;
protected:可以被该类中的方法和其友元函数访问,但不能被该类的对象访问;
public:可以被该类中的方法和其友元函数访问,是公有变量,也可以由该类的对象访问。
在c语言中,如果没有声明访问权限,默认的访问权限是public,而在c++中默认的访问权限是private。所以在类中的成员中如果需要外部调用都需要加上关键字public声明为公有类型,这一特性同样适用于类中的成员函数。
【答案】成员变量根据访问权限有private,protected和public3种访问方式。
面试题101 成员变量有哪些访问控制方式****
分析:在c++中,对成员变量进行访问控制主要有一下几个目的。
第一:对普通函数和其他类的成员函数来说,访问控制可以保护类的成员变量数据不被随便修改。
第二:类可以对它本身的内部数据维护负责,只有类自己才能够访问自己的私有成员变量。
第三:类的外部接口,把一个类分成公有的和受保护的两部分,对于使用者来说它只要会用就可以,无须了解类的内部完整结构,起到黑盒的效果,使用起来更加轻松简单。
第四:类与其他代码的关联性,类的功能是独立的,不需要依靠应用程序的运行环境,这个程序可以用它,另外一个也可以用它,使得你可以轻易实现类的相互替换。
成员变量的访问控制方式和成员变量的访问方式一样,有private,protect和public3种。下面举一个例子来看看类是怎样实现访问控制的。示例代码如下:
#include<iostream>
#include"ballscore.h"
class getscore
{
protected:
const static int goods=5; //得分
const static int bads=-3; //扣分
float gradescore; //平均得分
public:
float GetGS(float good,float bad) //good为得分次数,bad为失分次数
{
Gradescore=(good * goods + bad * bads)/(good+bad);
return gradescore; //返回平均得分
}
};
void main()
{
Ballscore eff;
cout<<jeff.GetGS(10,3);
jim.gradescore=5.5; //注意,想修改jim的平均成绩是不允许的
cin.get();
}
在上面的代码中实现 一个计算平均得分的类,类中有一个公共的计算平均得分的方法和受保护的原分、失分和平均得分属性。在主函数的调用中,gradescore属性是受保护的,所以不可以在外部修改它的值,而GetGS方式是可以在外部被调用的。
【答案】在c、c++中,是通过声明private、protect和public3种访问权限来对成员变量进行访问控制的。
面试题102 如何访问静态成员***
分析:声明为static的类成员能在类的范围内共享,这样的类成员就是类的静态成员。在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,因此保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
使用静态数据成员可以节省内存,因为它是所有对象所公有的。因此,对多个对象来说,静态数据成员只会在内存中开辟一块存储空间,供所有对象共用,静态成员在类加载的时候就存在于内存中。静态数据成员的值对于每个对象都是一样,但是它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
类的静态成员是可以独立访问的,也就是说,不需要创建类的实例就可以访问静态成员。类的静态函数只能调用静态成员,因为静态函数不包含this指针。
静态数据成员被类的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。示例代码如下:
class base
{
public:
static int _num; //声明静态成员
};
int base::_num=0; //静态数据成员的真正定义
class derived : public base
{
};
main()
{
base a;
derived b;
a._num ++;
cout<<"base class static data number _num is"<<a._num<<endl;
b._num++;
cout<<"derived class static data number _num is"<<b._num<<endl;
}
上面代码运行的结果如下:
1, 2
由此可见,派生类和基类通用了一个静态成员。
类的静态成员可以成为成员函数的可选参数,而普通成员则不可以。示例代码如下:
class base
{
public:
static int _staticVar;
int _var;
void foo1(int i=staticVar); //正确,_staticVar为静态数据成员
void foo2(int i=_var); //错误,_var为普通数据成员
}
类的静态成员的类型可以是所属类的类型,而普通成员则不可以。普通成员的只能声明为所属类类型的指针或引用。示例代码如下:
class base
{
public:
static base _object1; //正确,静态数据成员
base _object2; //错误
base *pobject; //正确,指针
base &mobject; //正确,引用
}
【答案】静态成员可以独立访问,不需要创建类的实例,它也不能用实例来进行调用。类的静态方法只能访问类的静态成员。