23.c/c++程序员面试宝典-类成员

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;  //正确,引用

}


【答案】静态成员可以独立访问,不需要创建类的实例,它也不能用实例来进行调用。类的静态方法只能访问类的静态成员。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值