abstract类中不可以有private的成员_5 C++学习刷题5--C++类的实现:类的实现、成员访问和this指针...

一、前言

本部分为C++语言刷题系列中的第5节,主要讲解两个知识点:类的概念、类的实现、成员访问限定符(private和public)和this指针。欢迎大家提出意见、指出错误或提供更好的题目!

二、知识点讲解

由第一节的知识可知,我们对所模拟的实现世界进行系统分析后,可以得到许多对象,以及每个对象的状态和行为信息。然后,我们对这些对象进行分类描述,采用类来描述属于同一类别的所有对象。由于对象具有状态和行为,因此C++类中也有相应的成员变量和成员函数。

722cc5dbb7c1a56c85e47e7eff3c6933.png

知识点1:类定义包含两部分:类头由关键字class 及其后面的类名构成;类体由一对花括号包围起来,并且花括号后有分号。在类体中,可以对类的成员变量和成员函数进行声明。在类外实现成员函数时,需要使用作用域运算符(::)

class Integer

{

int i;

public:

Integer (int a) { i = a; }

int square();

};

int Integer::square( )

{

return i*i;

}

知识点2:类的成员可以依据其自己的属性设置为公有型(public)、保护型(protected)和私有型(private)。其中,公有型成员在类内和类外的任何地方都可以被访问,而私有型成员则仅能在类里被访问。

7c96f5974aa4652ce1ef850f239d6ee8.png

知识点3:C++语言通过封装机制将对象的成员变量和成员函数形成一个独立的逻辑单元,即每一个对象的成员变量和成员函数都是相对独立、互不干扰,对象的成员函数可以直接访问本对象的成员变量或直接调用本对象的成员函数。这一现象是通过this指针来实现的。

class Simple

{

private:

int x, y ;

public :

void SetXY(int a, int b) { x = a ; y = b ; }

};

void main()

{

Simple ob; ob.SetXY(10,20);

}

为了实现成员函数setXY与成员变量x、y的关联,编译器在编译时,进行如下处理:

class Simple

{

private:

int x, y ;

public :

void SetXY(int a, int b, Simple *this) { this->x=a; this->y=b; }

};

void main()

{

Simple ob; ob.SetXY(10,20,&ob);

}

结论:对象型成员函数(非静态成员函数)中都隐藏有this指针,指向调用此成员函数的对象。因此对象型成员函数中,可以通过this指针访问此对象的所有其它成员

三、试题解析

1.下列关于类成员的叙述中,正确的是( )。

A.成员函数只能在类体内定义

B.类数据成员必须声明为私有的

C.在类中定义成员数据时,也可以同时对其进行初始化

C.类定义中包括数据成员和函数成员的声明

答案:C

解析:成员函数既可以在类中直接定义,也可以先在类中进行声明,然后在类的外边进行实现,因此选项A错误。类的数据成员可以根据数据属性设置为public、protected或private,选项B错误。在类中只能定义成员变量,但能同时进行初始化操作,成员变量的初始化主要在构造函数,选项C错误。

2.有如下类定义:

class Cup

{

public:

void SetPrice(double val);

private:

double price;

};

若要在类体外给出对成员函数SetPrice的定义,下列选项中正确的是( )。

A. void Cup::SetPrice(double val) { price=val; }

B. void Cup.SetPrice(double val) { price=val; }

C. void SetPrice(double val) { Cup::price=val; }

D. void SetPrice(double val) { Cup.price=val; }

正确答案:A

解析:本题考查如何在类体外定义成员函数。在类体外定义成员函数时,需要在成员函数名称前使用作用域运算符::,所以A选项正确。

3. 若有如下类定义

class Fruit

{

char name[20];

public:

void Print();

private:

double price;

};

则下列叙述中,正确的是( )。

A.类中有1个公有数据成员

B.类中有1个私有数据成员

C.类中有2个私有数据成员

D.数据成员name的访问权限未知

正确答案:C

解析:在C++类中,没有标明成员函数或成员变量的访问权限的默认为private,故char name[20]是私有数据成员,而print()是公有成员函数不是数据,因此A,B,D均错误,选C。

4.下列关于类的权限描述错误的是( )。

A.类本身的成员函数可以访问自身的任何成员

B.通过类的对象可以访问该类的所有成员

C.普通函数不能直接访问类的公有成员,必须通过成员函数对其访问

D.一个类可以将另一个类的对象作为成员

正确答案:B

解析:类的私有成员,只能在类里被访问,即只能在类的成员函数中被访问。在类的外边,都只能通过对象来访问对象的成员,并且是公有成员,选项B是错误的。类的成员变量,既可以是基本数据类型,也可以对象型的数据成员。

5.下列关于this指针的叙述中,错误的是( )。

A.通过this指针可以访问类的成员对象

B.通过this指针可以访问类的友元函数

C.通过this指针可以访问类的全部数据成员

D.通过this指针可以访问类的非静态成员函数

正确答案:B

解析:this指针代表调用成员函数的对象本身。只要是对象型的成员函数(非友元函数和静态成员函数)内部都隐含有this指针,因此可以通过this指针而访问对象所非静态成员,选项A、C、D正确;类的友元函数不是对象的成员函数,this指针不能访问,同理,静态成员函数属于类的成员而不是对象的成员,this指针也不能访问,B选项错误。

四、试题测试

1.下列关于类成员函数特性的叙述中,错误的是( )。

A.成员函数可以递归

B.成员函数可以重载

C.成员函数都是内联函数

D.成员函数可以设置默认参数值

2.下列关于成员函数特征的描述中,( )是不正确的。

A.成员函数可以设置缺省参数值

B.成员函数可以是静态的

C.除析构函数外,成员函数可以重载

D.成员函数一定是内联函数

3.有如下定义:

Class Foo

{

Public:

Foo(int v){ value=v; } //1

~Foo() { } //2

Private:

Foo() { } //3

int value=0; //4

};

其中存在语法错误的行是( )。

A、1 B、2 C、3 D、4

4.类的私有成员可在何处访问( )。

A.通过子类的对象访问

B.本类及子类的成员函数中

C.通过该类对象访问

D.本类的成员函数中

5.有如下定义:

int f1();

static int f2();

class MA

{

public:

int f3();

static int f4();

friend int f1();

friend static int f2();

};

在所描述的函数中,具有隐含的this指针的是()。

A.f1

B.f2

C.f3

D.f4

6.this指针存在的目的是( )。

A.保证基类公有成员在子类中可以被访问

B.保证每个对象拥有自己的数据成员,但共享处理这些数据成员的代码

C.保证基类保护成员在子类中可以被访问

D.保证基类私有成员在子类中可以被访问

------------------------------

欢迎大家提出意见、指出错误或提供更好的题目,只有大家的共同努力,才能帮助更多人掌握C++的基本概念,顺利通过考试!

ee6ab414ae921e6c986d40730790da93.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值