A、10B、20C、不确定值D、程序有错误
★考核知识点:
C++与C的主要差异–引用和返回引用的函数
参见讲稿章节:
1-15
附1.1.8(考核知识点解释)
引用就是一个别名,声明引用不会再为其分配存空间,而是与所引用对象占据同一片存空间。
因此,对引用的操作与对所有引用对象的操作效果完全一样。
可以为指针变量声明引用,其声明形式为:
数据类型*&引用名=指针变量名;
9、下列关于类和对象的叙述中,错误的是(A)。
A、一个类只能有一个对象B、对象是类的具体实例
C、类是某一类对象的抽象D、类和对象的关系是一种数据类型与变量的关系
★考核知识点:
面向对象方法基本概念–对象、类、实例和消息
参见讲稿章节:
2-01
附1.1.9(考核知识点解释)
类是现实世界中客观事物的抽象,即将具有相似静态属性和动态行为的对象集合归纳为一个类。
类是用户自定义的数据类型,与基本数据类型一样,需要声明类数据类型的变量,即对象,通过对一个个的实际对象实施不同的操作,来解决问题。
声明对象的过程叫做类的实例化。
10、有如下类声明:
classSample{intx;};
则Sample类成员x是Sample类的(C)。
A、公有数据成员B、保护数据成员
C、私有数据成员D、以上选项都不正确
★考核知识点:
类成员的访问控制
参见讲稿章节:
2-07
附1.1.10(考核知识点解释)
类中可以出现多个访问说明符,每个访问说明符可以出现多次,不同的访问说明符出现的顺序没有限制。
如果没有指明是哪种访问级别,C++编译系统默认为私有(private)成员。
11、C++中,关于构造函数和析构函数,正确的描述是(C)。
A、在定义类时,必须自定义构造函数和析构函数,在创建对象时自动调用构造函数,在释放对象时自动调用析构函数
B、构造函数和析构函数均可以重载
C、已知类Student以及Student*p;在使用p=newStudent;时自动调用无参构造函数创建动态对象,在deleltep;时自动调用析构函数释放动态对象
D、构造函数和析构函数都可以成为虚函数
★考核知识点:
构造函数、析构函数
参见讲稿章节:
2-04,2-09
附1.1.11(考核知识点解释)
在C++中,对象的初始化工作是由构造函数来完成的。
构造函数是一种特殊的成员函数,C++规定可以在类声明一个或多个构造函数,以满足对象多样性的初始化需要。
构造函数具有如下特征:
①构造函数名与类名相同。
②构造函数无任何函数返回类型说明。
③一个新的对象被创建时(通过对象声明语句或使用new运算符在堆区创建动态对象),属于该对象的构造函数被编译系统自动调用,完成该对象数据成员的初始化工作。
④如果在类声明中没有给出构造函数,系统会自动给出一个默认的无参构造函数:
<类名>(){}
⑤如果在类中声明了多个构造函数,这就是构造函数的重载。
要求这些构造函数要有不同的参数表,系统自动调用构造函数时按照函数重载的规则选择其中的一个构造函数。
在对象的生存期结束时,有时也需要执行一些操作。
这些工作就可以放在析构函数中。
析构函数是一个特殊的由用户定义的公有成员函数,析构函数具有如下特征:
①析构函数名为:
~<类名>,如~IntArray。
②构造函数无任何函数返回类型说明。
③析构函数无参数,所以不能被重载。
④如果在类声明中没有给出析构函数,系统会自动给出一个默认的析构函数:
~<类名>(){}
⑤当对象的生命周期结束及用delete释放动态对象时,系统自动调用析构函数完成对象撤销前的处理。
12、在类的定义中,用于对类的数据成员进行初始化并执行其他部管理操作的函数是(C)。
A、友元函数B、虚函数C、构造函数D、析构函数
★考核知识点:
构造函数
参见讲稿章节:
2-04
附1.1.12(考核知识点解释)
一个新的对象被创建时(通过对象声明语句或使用new运算符在堆区创建动态对象),属于该对象的构造函数被编译系统自动调用,完成该对象数据成员的初始化工作。
13、对于拷贝构造函数,正确的描述是(A)。
A、在C++语言中,如果不自定义类的拷贝构造函数,则每个类都有默认的拷贝构造函数
B、必须为每个类定义拷贝构造函数
C、如果要使用拷贝构造函数,则必须在类中先定义
D、当定义了类的构造函数时,如果要使用拷贝构造函数,则必须定义拷贝构造函数
★考核知识点:
拷贝构造函数
参见讲稿章节:
2-10
附1.1.13(考核知识点解释)
拷贝构造函数有如下特征:
(1)拷贝构造函数名与类名相同,形参只有一个,是对象的引用,所以,不能重载拷贝构造函数。
拷贝构造函数的原形为:
<类名>(<类名>&对象名);
(2)拷贝构造函数无任何函数返回类型说明。
(3)如果在类声明中没有给出拷贝构造函数,系统会自动给出一个默认的拷贝构造函数,该拷贝构造函数只进行对象数据成员间的对位拷贝,即所谓的“浅拷贝”。
(4)在某些情况下,用户必须在类定义中给出一个显式的拷贝构造函数,以实现用户指定的用一个对象初始化另一个对象的功能,即所谓的“深拷贝”。
(5)在以下3种情况下,系统会自动调用拷贝构造函数:
①当使用下面的声明语句用一个已存在的对象初始化一个新对象时,系统会自动调用拷贝构造函数:
<类名><新对象名>(<已存在对象名>);
或
<类名><新对象名>=<已存在对象名>;
②对象作为实参,在函数调用开始进行实参和形参结合时,会自动调用拷贝构造函数,完成由已知的实参对象初始化形参新对象的功能。
③如果函数的返回值是类的对象,在函数调用完成返回时,系统自动调用拷贝构造函数,用return后面的已知对象来初始化一个临时新对象(所创建的临时对象只在外部表达式围有效,表达式结束时,系统将自动调用析构函数撤销该临时对象)。
14、有关静态成员的描述错误的是(D)。
A、某个类的静态数据成员由该类的所有对象所共享
B、类的公有静态数据成员既可以用类的对象访问,也可以直接用作用域运算符“:
:
”通过类名来访问
C、静态数据成员既可以是私有成员,也可以是公有成员
D、类中一旦定义了静态数据成员,就必须定义静态成员函数,以便对静态数据成员进行操作
★考核知识点:
类的静态数据成员
参见讲稿章节:
2-13
附1.1.14(考核知识点解释)
在类的成员前如果加上关键字static,这种成员就是类的静态成员。
类的静态成员包括静态数据成员和静态成员函数。
类的静态成员的特点是:
静态成员属于类,不属于任何对象。
无论有多少对象或没有对象,静态成员都只有一份存于公用存中,被该类的所有对象共享。
在类定义中的数据成员声明前加上关键字static,就使该数据成员成为静态数据成员。
静态数据成员可以是public(公有)、private(私有)或protected(保护)的。
在下面定义的Account类中,m_rate被声明为私有静态成员。
在类中声明的静态数据成员属于引用性说明,并不实际分配存。
在创建对象时,会为对象的数据成员分配存储空间。
但由于静态数据成员不属于任何对象,所以在创建对象时也不会为该类的静态数据成员分配存储空间。
所以,类设计者需要在类外对静态数据成员进行定义。
静态数据成员的定义形式如下:
<类型><类名>:
:
<静态数据成员名>[=<初值>];
类的静态数据成员不属于任何类,类的公有静态数据成员的一般访问形式是:
<类名>:
:
<静态数据成员名>
也可以是:
<对象名>.<静态数据成员名>
或
<对象指针>-><静态数据成员名>
后两种访问方式中的“对象名”或“对象指针”只起到类名的作用,与具体对象无关。
如果成员函数被声明为static的,它就是静态成员函数。
像静态成员数据一样,静态成员函数与具体对象无关。
静态成员函数不能访问一般的数据成员,它只能访问静态数据成员,也只能调用其他的静态成员函数。
对类的静态成员函数的调用形式通常是:
<类名>:
:
<静态成员函数调用>
可以用成员访问操作符点(.)和箭头(->)为一个类对象或指向类对象的指针调用,只是,这时候使用的只是对象的类型,与具体对象无关。
15、如果类A被说明成类B的友元,则(B)。
A、类A的成员函数不得访问类B的所有成员
B、类A的成员函数可以访问类B的所有成员
C、类A的成员即类B的成员
D、类B的成员即类A的成员
★考核知识点:
类的友元
参见讲稿章节:
2-16
附1.1.15(考核知识点解释)
将一个类声明为另一个类的友类的语法形式为:
friend<友类名>;
或
friendclass<友类名>;
将A类声明为B类的友类。
声明后,A类的任何成员函数都有权访问B类中的任何成员,包括私有成员和保护成员。
16、下列关于this指针的说法,正确的是(D)。
A、this指针一定指向常量型数据
B、this指向的数据不可更改
C、静态成员函数中也可以访问this指针
D、this指针本身可直接作为成员函数的返回值
★考核知识点:
this指针
参见讲稿章节:
2-15
附1.1.16(考核知识点解释)
每个类成员函数都含有一个指向被调用对象的指针,这个指针被称为this指针。
this指针是一个隐含于每一个非静态成员函数中的特殊指针,就是成员函数的一个类指针类型的形参。
当对一个对象调用非静态成员函数时,编译程序先将该对象的地址传递给成员函数的this指针,以及完成其他的参数传递,然后再进入成员函数部进行处理。
在成员函数部存取数据成员或调用其他成员函数时,都是通过this指针隐式地引用它所指向的对象的成员数据和成员函数。
事实上,也可以通过this指针显式引用它所指向对象的成员数据和成员函数。
由于有了this指针的存在,使得类中相同的成员函数会根据this指针指向对象的不同而操作不同对象的数据成员。
类的静态成员函数没有this指针。
这是因为静态成员函数为类的所有对象所共有,不属于某一个对象。
一般情况下,this指针隐式使用就可以了。
但某些情况下需要显式使用。
下面是需要显式使用this指针的两种情况:
(1)在类的非静态成员函数中返回类对象本身的时候,直接使用“return*this;”。
(2)另外一种情况是当参数与成员变量名相同时。
17、派生类中的成员不能访问基类中的(A)。
A、私有成员B、公有成员C、保护成员D、以上都可以
★考核知识点:
函数重定义和派生类的继承方式
参见讲稿章节:
3-05
附1.1.17(考核知识点解释)
以公有方式继承时,基类的公有成员和保护成员的访问控制方式在派生类中保持不变,仍作为派生类的公有成员和保护成员,基类的私有成员在派生类中不能直接访问。
以私有方式继承时,基类的公有成员和保护成员在派生类中都作为私有成员,基类的私有成员在派生类中不能直接访问。
以保护方式继承时,基类的公有成员和保护成员在派生类中都作为保护成员,基类的私有成员在派生类中无法直接访问。
18、基类的(B)在私有继承时在派生类中为私有成员函数,在公有和保护继承时在派生类中为保护成员函数。
A、私有成员函数B、保护成员函数
C、公有成员D、保护数据成员
★考核知识点:
函数重定义和派生类的继承方式
参见讲稿章节:
3-05
附1.1.18(考核知识点解释)
以公有方式继承时,基类的公有成员和保护成员的访问控制方式在派生类中保持不变,仍作为派生类的公有成员和保护成员,基类的私有成员在派生类中不能直接访问。
以私有方式继承时,基类的公有成员和保护成员在派生类中都作为私有成员,基类的私有成员在派生类中不能直接访问。
以保护方式继承时,基类的公有成员和保护成员在派生类中都作为保护成员,基类的私有成员在派生类中无法直接访问。
19、类型兼容是指在基类对象可以出现的地方,都可以使用公有派生类的对象,已知:
classBaseClass
{//…};
classDerivedClass:
publicBaseClass
{//…};
BaseClassb,*pb;
DerivedClassd,*pd;
下面不属于类型兼容的是(C)。
A、b=d;B、BaseClass&bb=d;
C、pd=&b;D、pb=&d;
★考核知识点:
类型兼容
参见讲稿章节:
3-09
附1.1.19(考核知识点解释)
类型兼容是指在基类对象可以出现的任何地方,都可以用公有派生类的对象来替代。
类型兼容所指的是如下三种情况:
(1)派生类对象可以赋值给基类对象;
(2)派生类对象可以初始化基类的引用;
(3)基类指针可以指向派生类对象。
20、以下说确的是(C)。
A、重定义函数就是派生类的构造函数
B、重定义函数就是派生类的析构函数,要求同名
C、一个虚析构函数的版本被调用执行后,接着就要执行其基类版本
D、基类和派生类都分别给出了一个虚函数的不同版本
★考核知识点:
虚析构函数
参见讲稿章节:
3-12
附1.1.20(考核知识点解释)
在调用派生类对象的析构函数后,会自动调用基类对象的析构函数来释放基类中定义的指针成员。
21、下列关于虚函数的说明中,正确的是(B)。
A、从虚基类继承的函数都是虚函数
B、虚函数不得是静态成员函数
C、只能通过指针或引用调用虚函数
D、抽象类中的成员函数都是虚函数
★考核知识点:
虚析构函数
参见讲稿章节:
3-12
附1.1.21(考核知识点解释)
只有类的成员函数才能声明为虚函数。
因为虚函数只适用于有继承关系的类对象,所以普通函数不能声明为虚函数。
静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象。
联函数不能是虚函数,因为联函数不能在运行中确定其位置。
即使虚函数放在类的部定义,编译时,仍将其看作是非联的。
构造函数不能是虚函数。
因为构造时,对象还是一片未定型的空间。
只有在构造完成后,对象才能成为一个类的名副其实的实例。
22、友元重载运算符obj1>obj2被C++编译器解释为(A)。
A、operator>(obj1,obj2)B、>(obj1,obj