西交《面向对象程序设计》在线作业
试卷总分:100 得分:0
一、单选题 (共 50 道试题,共 100 分)
在下列的各类函数中,( )不是类的成员函数。
A.构造函数
B.析构函数
C.友元函数
D.拷贝构造函数
在创建派生类对象时,构造函数的执行顺序是( )。
A.对象成员构造函数、基类构造函数、派生类本身的构造函数;
B.派生类本身的构造函数、基类构造函数、对象成员构造函数;
C.基类构造函数、派生类本身的构造函数、对象成员构造函数;
D.基类构造函数、对象成员构造函数、派生类本身的构造函数。
友元的作用之一是( )。
A.提高程序的运行效率。
B.加强类的封装性。
C.实现数据的隐蔽性。
D.增加成员函数的种类。
由C++目标文件连接而成的可执行文件的缺省扩展名为( )。
A.cpp
B.exe
C.obj
D.lik
用new运算符创建一个含有10个元素的一维整型数组的正确语句是( )。
A.int p=new int(10);
B.int p=new int[10];
C.int *p=new int[10];
D.int *p=new int(10);
以下关于函数模板的论述中,正确的是( )。
A.一旦定义了函数模板,就不能再定义同名的重载函数;
B.从同一个函数模板实例化后得到的多个模板函数属于函数重载;
C.函数模板中只有一种参数;
D.在定义函数模板时,template语句与函数模板定义语句之间可以有别的语句。
已知:p是一个指向类A数据成员m的指针,A1是类A的一个对象。如果要给A1的m赋值为5,( )是正确的。
A.A1.p=5;
B.A1->p=5;
C.A1.*p=5;
D.*A1.p=5;
一个类的构造函数为 “B(int ax, int bx): a(ax), b(bx) {}”,执行 “B x(1,2),y(3,4);x=y;”语句序列后x.a的值为( )。
A.1
B.2
C.3
D.4
下述静态数据成员的特性中,( )是错误的。
A.声明静态数据成员时前面要加修饰符static。
B.静态数据成员要在类体外进行初始化。
C.在程序中引用静态数据成员时,要在静态数据成员名前加和作用域运算符。
D.静态数据成员是本类中个别对象所共享的。
下述静态数据成员的特性中,( )是错误的。
A.声明静态数据成员时前面要加修饰符static。
B.静态数据成员要在类体外进行初始化。
C.在程序中引用静态数据成员时,要在静态数据成员名前加和作用域运算符。
D.静态数据成员是一个类的个别对象所共享的。
下面是重载双目运算符+的普通函数原形,其中最符合+原来含义的是( )。
A.Value operator+(Value,Value);
B.Value operator+(Value,int);
C.Value &operator+(Value,Value*);
D.Value &operator+(Value&,Value&);
下面是五条顺序出现的声明语句,非法的初始化语句是( )。
A.int i=–1;
B.const int ic=i;
C.const int *pc={图}
D.int *const cpi={图}
E.const int *const cpic={图}
下面是四条顺序出现的声明语句,非法的初始化语句是( )。
A.int i=–1;
B.const int ic=i;
C.const int *pc={图}
D.int *const cpi={图}
下面关于引用的说法错误的是( )。
A.引用是被引用对象的别名
B.对引用的修改就是对被引用对象的修改,反之亦然
C.引用不一定立即初始化
D.引用不能建立数组
下面对友元的错误描述是( )。
A.友元函数不可访问对象的private成员
B.一个类的成员函数可以是另一个类的友元
C.友元类和友元函数均用关键字friend声明
D.友元函数可以访问对象的protected成员
下面对模板的声明,正确的是( )。
A.template
B.template
C.template
D.template
下列说法错误的是( )。
A.在类中,成员的默认访问特性是私有的;
B.类封装了数据和操作;
C.类实质上是一种数据类型;
D.在类的定义中,必须包含private、public
E.protected三种存取方式对应得部分。
下列说法错误的是( )。
A.在类中不能对所定义的数据成员进行初始化;
B.类的公有成员函数是类与外界的接口;
C.同一个类的两个对象占用相同的内存空间;
D.类实现数据隐藏。
下列说法不正确的是( )。
A.在类中,成员的默认访问特性是私有的。
B.类封装了数据和操作。
C.类实质上是一种数据类型。
D.在类的定义中,必须包含private、public
E.protected三种存取方式对应得部分。
下列说法不正确的是( )。
A.在类中不能对所定义的数据成员进行初始化。
B.类的公有成员函数是类与外界的接口。
C.同一个类的两个对象占用相同的内存空间。
D.类实现数据隐藏。
下列函数中,( )不能重载。
A.一般的成员函数;
B.一般的非成员函数;
C.析构函数;
D.构造函数。
下列关于运算符重载的描述中,( )是正确的。
A.运算符重载可以改变运算数的个数;
B.运算符重载可以改变优先级;
C.运算符重载可以改变结合性;
D.运算符重载不可以改变语法结构。
下列关于虚基类的说法错误的是( )。
A.有引入虚基类的目的是解决二义性的问题;
B.因为虚基类可被多个派生类继承,因此可以有多个副本以适应不同的派生类;
C.若某个类被说明为虚基类,则被重复继承的该类成员在派生类对象中只有一个副本;
D.在派生类对象创建时,要保证虚基类的构造函数只被调用一次。
下列关于私有继承的说法中正确的是( )。
A.基类成员对派生类新定义的成员函数是不可见的;
B.基类成员对派生类新定义的成员函数是可见的;
C.只有基类成员中的公有成员对派生类新定义的成员函数是可见的;
D.基类成员中的保护成员对派生类新定义的成员函数是可见的。
下列关于类的访问控制机制说法错误的是( )。
A.静态数据成员通常都定义为公有类型。
B.一个对象的私有成员对于同类的另一个对象是可见的。
C.友元机制破坏了类的封装性。
D.基类的保护成员对派生类新定义的成员函数是可见的。
下列对引用的陈述中错误的是( )。
A.每一个引用都是其所引用对象的别名,因此必须初始化;
B.形式上针对引用的操作实际上作用于它所引用的对象;
C.一旦定义了引用,一切针对其所引用对象的操作只能通过该引用间接进行;
D.不需要单独为引用分配存储空间。
下列对派生类的描述中,( )是错的。
A.一个派生类可以作为另一个派生类的基类;
B.派生类至少有一个基类;
C.派生类的成员除了它自己的成员外,还包含了它的基类的成员;
D.派生类中继承的基类成员的访问权限到派生类保持不变;
下列对继承关系的描述中,正确的是( )。
A.在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的;
B.在公有继承中,基类中只有公有成员对派生类的对象是可见的;
C.在私有继承中,基类中只有公有成员对派生类是可见的;
D.在私有继承中,基类中的保护成员对派生类的对象是可见的;
下列对继承关系的描述中,( )是正确的。
A.在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的;
B.在公有继承中,基类中只有公有成员对派生类的对象是可见的;
C.在私有继承中,基类中只有公有成员对派生类是可见的;
D.在私有继承中,基类中的保护成员对派生类的对象是可见的;
下列程序段不会发生二义性的是( )。
A.int fun(double p){…;}
B.int fun(float p){…;} float fun(float p){…;}float fun(unsigned p){…;} int x;int x; x=fun(0);x=fun(0);
C.int fun(int i,int j=2){…;}
D.int fun(int i=2,int j=2){…;} float fun(int i){…;}int fun(int *p){…;} cout{图}
下列程序段不会发生二义性的是( )。
A.int fun(double p){…;}
B.int fun(float p){…;} float fun(float p){…;}float fun(unsigned p){…;} int x;int x; x=fun(0);x=fun(0);
C.int fun(int i,int j=2){…;}
D.int fun(int i=2,int j=2){…;} float fun(int i){…;}int fun(int *p){…;} cout{图}
下列不是C++基本数据类型的是( )。
A.int
B.string
C.char
D.void
设置虚基类的目的是( )。
A.简化程序;
B.消除二义性;
C.提高运行效率;
D.减少目标代码;
若有语句 int *p = new int[5]; int * pi; 则以下语句中,执行时会造成delete[ ] p 语句的执行出错的是( )。
A.(*p)++;
B.p++;
C.pi=p;
D.pi=p+3;
若有如下函数模板定义,则正确使用该函数模板的语句是( )。 template void add(type a, type b, type &c) { c=a+b?; }
A.float x,y,z;add(x,y,z)?;
B.int x,y,z;add(x,y,&z)?;
C.float x,y?;int z;add(x,y,z)?;
D.float x,y?;int z;add(x,y,&z)?;
派生类的构造函数的成员初始化列表中,不能包含( )。
A.基类的构造函数;
B.派生类中子对象的初始化;
C.基类的子对象初始化;
D.派生类中一般数据成员的初始化;
类模板的作用是可以将其实例化后得到一个具体的( )。
A.类
B.对象
C.模板类
D.模板函数
基类A中有成员函数fn1()、fn2(),在派生类B中重载了成员函数fn1()(即重新定义了fn1()),但没有重载其成员函数fn2()。如果在派生类B中调用基类A的成员函数fn1()(不是B中重载的数fn1())和fn2(),则正确的方式是( )。
A.A::fn1()和fn2();
B.fn1()和A::fn2();
C.A::fn1()和A::fn2();
D.fn1()和fn2();
函数重载与函数模板的说法错误的是( )。
A.当函数的函数体不同时,可以把函数设计为重载函数;
B.当函数体相同,仅仅操作的数据类型不同时,可把函数设计为模板;
C.重载函数和函数模板都是抽象的,都需实例化;
D.函数模板有待于实例化为模板函数,重载函数可以直接引用。
关于运行时多态的下列描述中,( )是错误的。
A.运行时多态是以虚函数为基础的;
B.运行时多态是在运行时确定所调用的函数代码的;
C.用基类指针或引用所标识的派生类对象来操作虚函数才能实现运行时多态;
D.运行时多态是在编译时确定操作函数的。
关于以下程序段中语法错误的正确描述是( )。 #include voidmain() { constchar*p1=”string1”; char*constp2=”string”; char*p3=”string3”; p1[2]=’a’;//① p2[2]=’b’;//② p1=p3;//③ p2=p3;//④ }
A.①②③④均错误
B.①和④错误
C.②和③错误
D.③和④错误
关于静态成员,正确的说法是( )。
A.静态成员函数可以直接访问该类中的非静态成员
B.非静态成员函数不能直接访问该类中的静态成员
C.静态数据成员同其它数据成员一样通过构造函数进行初始化
D.静态成员在任何对象创建之前就已经创建
关于继承中出现的二义性的描述中,( )是错误的。
A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性;
B.解决二义性的最常用的方法是对成员名的限定法;
C.在单继承情况下,派生类中对基类成员的访问也会出现二义性;
D.一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进
关于基类和派生类的关系,( )是错误的。
A.派生类对象属于基类;
B.可以用派生类指针指向派生类对象;
C.可以将基类对象赋值给派生类对象;
D.派生类对象指针可转换为基类指针。
关于C++中的继承机制,错误的说法是( )。
A.虚拟继承限定基类只能通过一条路径派生出派生类;
B.解决多继承带来的二义性的方法之一是对成员名加以限定;
C.派生类的构造函数的成员初始化列表中,可包含基类中的子对象;
D.继承是一种组织类的基本手段。
对于下面的两条语句,正确的描述是( )。 MyObject a(2), b(a), c; c = b = a;
A.拷贝构造函数执行了1次;
B.赋值运算符重载函数执行了3次;
C.拷贝构造函数函数执行了3次;
D.赋值运算符重载函数执行了1次;
对于如下类的定义,下面语句组中出现语法错误的是( )。 class X{ int a; public: X(int x=0) {a=x;} }; class Y:class X{ int b; public: Y(int x=0,int y=0):X(x) {b=x;} };
A.X *pa=new Y(1,2);
B.Xa1=Y(1,3);
C.Yb1(2,3);X&a3=b1;
D.Xa4(10);Yb2=a4;
对于类模板,其类型形参可以作为( )。
A.成员函数的形参类型
B.成员函数的返回类型
C.数据成员的类型
D.以上三种均可
带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化( )。
A.与虚基类下面的派生类个数有关
B.多次
C.二次
D.一次
不可以成为类的数据成员的是( )。
A.自身类的对象
B.另一个类的对象
C.自身类的指针或引用
D.其他基本数据类型