又到了期末周,突击一下c++吧@—@
第一次实验
1、已知学生记录的定义为:
struct student
{
int no;
char name[20];
char sex;
struct 注意年月日都是结构体,不是student里面的
{
int year;
int month;
int day;
}birth;
};
struct student s;
假设变量s中的"生日"应是"1988年5月10日",对"生日"的正确赋值语句是 【 正确答案: d】
(A) year=1988; month=5; day=10;
(B) brith.year=1988; birth.month=5; birth.day=10;
(C) s.year=1988; s.month=5; s.day=10;
(D) s.birth.year=1988; s.birth.month=5; s.birth.day=10;
2、直接打
已知:
union u_type
{
int i;
char ch;
}temp;
执行语句"temp.i=305;"后,temp.ch的值为 【 正确答案: D】
(A) 266 (B) 256 (C) 10 (D) 1
3、设有以下说明语句: 【 正确答案: c】
struct strutype
{
int a;
float b;
}var;
则下面叙述中错误的是
(A) struct是结构类型的关键字
(B) struct strutype是用户定义的结构类型
(C) var是用户定义的结构类型名
(D) a和b都是结构成员名
(A) struct
是结构类型的关键字 - 正确。在 C 语言中,struct
确实是用来定义结构体类型的关键字。
(B) struct strutype
是用户定义的结构类型 - 正确。这里 struct strutype
定义了一个名为 strutype
的结构体类型。
(C) var
是用户定义的结构类型名 - 错误。var
并不是结构类型名,而是该结构体类型的一个变量名。struct strutype
是结构类型名,而 var
是这个类型的一个实例或对象。
(D) a
和 b
都是结构成员名 - 正确。在结构体 struct strutype
中,a
是一个整型成员,b
是一个浮点型成员。
因此,错误的叙述是 (C)。
4、以下对结构类型变量std1的定义中错误的是 【 正确答案: d】
(A)#define STUDENT struct student
STUDENT
{ int num;
float age;
} std1;
(B)struct student
{ int num;
float age;
};
struct student std1;
(C)struct
{ int num;
float age;
} std1;
(D)struct
{ int num;
float age;
} student;
struct student std1;
这个选项首先定义了一个匿名结构体,并定义了一个名为 student
的变量(注意这里 student
是一个变量名,而不是类型名)。然而,在下一行中,它尝试使用 struct student
来定义 std1
,但此时 student
并没有作为一个类型名被定义。因此,struct student std1;
这行代码是错误的,因为编译器不知道 student
是一个结构体类型。
5、
假设sizeof(int)为4,sizeof(char)为1,sizeof(double)为8,已知:
union
{
int i;
char c;
double d;
}test;
则sizeof(test)为 【 正确答案: b】
(A)13;
(B)8;
(C)16;
(D)4;
6、
若有以下说明和语句:
struct student
{
int age;
int num;;
}std, *p;
p = &std;
则以下对结构变量 std 中成员 age 的引用方式不正确的是 【 正确答案: d】
(A) std.age
(B) p->age
(C) (*p).age
(D) *p.age
(A) std.age
- 这是正确的。直接通过结构体变量名加.
和成员名来访问成员。
(B) p->age
- 这是正确的。p
是一个指向student
结构体的指针,所以可以使用->
运算符来访问成员。
(C) (*p).age
- 这也是正确的。*p
解引用指针p
,得到结构体变量std
,然后再通过.
和成员名来访问成员。
(D) *p.age
- 这是不正确的。这里的.
运算符优先级高于*
运算符,所以p.age
首先会被尝试解析,但p
是一个指针,不是一个结构体,所以不能使用.
来访问成员。正确的做法是先解引用指针,即(*p).age
。
7、
若有以下说明和语句,则下面表达式中值为1002的是 【 正确答案: d】
struct student
{
int age;
int num;
};
struct student stu[3] = {{1001, 20}, {1002, 19}, {1003, 21}};
struct student *p;
p = stu;
(A) (p++)->num
(B) (p++)->age
(C) (*p).num
(D) (*++p).age
第二次实验
1、
2、
第三次实验
1、为了区分一元运算符的前缀和后缀运算,在后缀运算符进行重载时,额外添加一个参数,其类型是 【 正确答案: c】
A void
B char
C int
D float
2、下面关于运算符重载的说法中,错误的是 【 正确答案: a】
A 可以对C++所有运算符进行重载
B 运算符重载保持固有的结合性和优先级顺序
C 运算符重载不能改变操作数的个数
D 在运算符函数中,不能使用缺省的参数值
第四次实验
1、C++流中重载了运算符<<,它是一个 【 正确答案: d】。
(a)用于输出操作的成员函数 (b)用于输入操作的非成员函数
(c)用于输入操作的成员函数 (d)用于输出操作的非成员函数
第五次实验
1、
有如下类定义:
class base{ public:int x; protected: int y; private: int z; };
派生类采用什么方式继承可以使x成为自己的公有成员 【 正确答案: a】 。
(a)公有继承 (b)保护继承 (c)私有继承 (d)以上三个都对
2、
在公有派生的情况下,有关派生类对象和基类对象的关系的关系,不正确的叙述是 【 正确答案: C】
A 派生类的对象可以赋给基类对象
B 派生类的对象可以初始化基类的引用
C 派生类的对象可以直接访问基类中的成员
D 派生类的对象的地址可以赋给指向基类的指针
第六次实验
1、
在私有继承的情况下,允许派生类直接访问的基类成员包括 【 正确答案: B】
A 公有成员和私有成员
B 公有成员和保护成员
C 保护成员和私有成员
D 公有成员、私有成员和保护成员
2、
派生类的对象对其基类成员中 【 正确答案: A】是可以访问的
A 公有继承中的公有成员
B 公有继承中的保护成员
C 私有继承中的公有成员
D 以上三者都对
3、
下列虚基类的声明正确的是 【 正确答案: A】
A class derived:virtual public base
B virtual class derived:public base
C class virtual derived:base
D class derived: base1 virtual
4、在公有派生的情况下,有关派生类对象和基类对象的关系的关系,不正确的叙述是 【 正确答案: C】
A 派生类的对象可以赋给基类对象
B 派生类的对象可以初始化基类的引用
C 派生类的对象可以直接访问基类中的成员
D 派生类的对象的地址可以赋给指向基类的指针
5、直接打,看报错位置
#include<iostream>
using namespace std;
class base
{
int n;
public:
base(int a,int b,int c)
{
n=a;x=b;y=c;
}
protected:
int x,y;
};
class derived:public base
{
public:
int m;
derived(int a,int b,int c,int d):base(a,b,c){m=d;}
};
int main()
{
derived s(1,2,3,4);//①
cout<<s.n<<endl;//②
cout<<s.x<<s.y<<endl;//③
cout<<s.m<<endl;//④
}
有语法错误的语句是 【 正确答案: B】 。
(a)①② (b)②③ (c)③④ (d)①④
6、
class base{ int x; public: base(int n){ x=n;} }; class derived: public base{ int y; public: derived(int a,int b); };
下列对构造函数derived的定义,正确的是 【 正确答案: A】。
(A) derived::derived(int a,int b):base(a),y(b){}
这个选项是正确的。它首先调用了基类 base
的构造函数,传递了参数 a
,然后初始化了 derived
类的成员 y
,传递了参数 b
。
(B) derived::derived(int a,int b):x(a),y(b){}
(C) derived::derived(int a,int b):base(a),derived(b){}
(D) derived::derived(int a,int b):x(a),derived(b){}
7、
class base{ int i; public: void set(int n){ i=n;} int get( )const{ return i; } }; class derived: protected base{ protected: int j; public: void set(int m, int n){ base::set(m); j=n;} int get( )const{ return base::get( )+j; } };
则类derived中保护的数据成员和成员函数的个数是 【 正确答案: C】。
(A)1 (B)2 (C)3 (D)4
第七次实验
1、假定AA为一个类,a为该类私有的数据成员,GetValue( )为该类公有函数成员,它返回a的值,x为该类的一个对象,则访问x对象中数据成员a的格式为( 【 正确答案: D】 )
(A) x.a
(B) x.a()
(C) x->GetValue()
(D) x.GetValue( )
2、
下列关于虚基类的描述中,错误的是( 【 正确答案: C】 )
(A) 使用虚基类可以消除由多继承产生的二义性
(B) 构造派生类对象时,虚基类的构造函数只被调用一次
(C) 声明 class B:virtual public A 说明类B为虚基类
A
作为B
的基类时是以虚基类的方式被继承
(D) 建立派生类对象时,首先调用虚基类的构造函数
3、
下列运算符中,不能重载的是 ( 【 正确答案: C】 )
(A) &&
(B) !=
(C) .
(D) ->
4、
下列关于类和对象的叙述中,错误的是( 【 正确答案: A】 )
(A) 一个类只能有一个对象
(B) 对象是类的具体实例
(C) 类是对某一类对象的抽象
(D) 类和对象的关系是一种数据类型与变量的关系
5、
下列关于类定义的说法中,正确的是( 【 正确答案: A】 )
(A) 类定义中包括数据成员和函数成员的声明
(B) 类成员的缺省访问权限是protected
(C) 数据成员必须被声明为私有的
(D) 成员函数只能在类体外进行定义
6、
析构函数可以返回( 【 正确答案: D】 )
(A) 指向某个类的指针
(B) 某个类的对象
(C) 状态信息表明对象是否被正确地析构
(D) 不可返回任何值
7、
设A为自定义类,现有普通函数int fun(A& x)。则在该函数被调用时( 【 正确答案: C】 )
(A) 将执行复制构造函数来初始化形参x
(B) 仅在实参为常量时,才会执行复制构造函数以初始化形参x
(C) 无需初始化形参x
(D) 仅在该函数为A类的友元函数时,无需初始化形参x
8、
在下面类声明中,关于生成对象不正确的是( 【 正确答案: C】 )
class point
{ public:
int x;
int y;
point(int a,int b) {x=a;y=b;}
};
(A) point p(10,2);
(B) point *p=new point(1,2);
(C) point *p=new point[2];
(D) point *p[2]={new point(1,2), new point(3,4)};
C不对是因为缺少无参构造函数,这一点初学者在实际操作的时候也是常犯的错误
9、
下列函数中,( 【 正确答案: C】 )不能重载。
(A) 成员函数
(B) 非成员函数
(C) 析构函数
(D) 构造函数
10、
在C++中不能重载的运算符是( 【 正确答案: A】)
(A) ? :
(B) +
(C) -
(D) <=
11、
下列运算符中,( 【 正确答案: C】)运算符不能重载
(A) &&
(B) [ ]
(C) ::
(D) <<
12、
有如下类定义:class Foo
{
public:
Foo(int v):value(V){ } //①
~Foo(){} //②
private:
Foo(){} //③
int value=0; //④
};
其中存在语法错误的行是: 【 正确答案: D】
(A) ①
(B) ②
(C) ③
(D) ④
13、
下列情况中,不会调用拷贝构造函数的是 【 正确答案: B】
(A) 用一个对象去初始化同一类的另一个新对象时
(B) 将类的一个对象赋值给该类的另一个对象时
(C) 函数的形参是类的对象,调用函数进行形参和实参结合时
(D) 函数的返回值是类的对象,函数执行返回调用时
14、
下面关于new和delete操作符的说法,哪个是不正确的: 【 正确答案: C】
(A) 使用new操作符,可以动态分配全局堆中的内存资源。
(B) 用new申请的数组,必须用delete[] 释放。
(C) 用new申请的空间,即使不调用delete 释放掉,当程序结束时也会自动释放掉。
(D) 执行语句A * p=new A[100] 时, 类A的构造函数会被调用100次。
15、
已知f1和f2是同一类中的两个成员函数,若f1的实现代码体内不能调用f2, 则可能的情况是 【 正确答案: B】
(A) fl和f2都是静态函数
(B) fl是静态的,f2不是
(C) f1不是静态的,f2是静态的
(D) fl和f2都不是静态函数
静态成员函数:
- 静态成员函数属于类本身,而不属于类的任何特定对象。
- 它们可以直接通过类名来调用,而不需要创建类的对象。
- 它们不能访问类的非静态成员(包括非静态成员函数和非静态数据成员),因为它们不关联于类的任何特定对象。
第八次实验
1、
在C++中,用于实现运行时多态性的是 【 正确答案: d】
A 内联函数
B 重载函数
C 模板函数
D 虚函数
2、
一个对象所占的内存空间中可以保存下面哪类数据? 【 正确答案: D】
(A) 静态数据成员
(B) 内置函数代码
(C) 所有成员函数的入口地址
(D) 虚函数表的入口地址
3、
下列哪种函数可以是虚函数: 【 正确答案: D】
(A) 自定义的构造函数
(B) 拷贝构造函数
(C) 静态成员函数
(D) 析构函数
4、
模板对类型的参数化提供了很好的支持,因此 【 正确答案: b】
A.类模板的主要作用是生成抽象类
B.类模板实例化时,编辑器将根据给出的模板实参生成一个类
C.在 类模板中的数据成员都具有同样类型
D. 模板中的成员函数都没有返回值
5、
如果一个类至少有一个纯虚函数,那么就称该类为 【 正确答案: a】
A 抽象类
B 派生类
C 虚基类
D 以上都不对
6、
下列关于抽象类的说明中不正确的是 【 正确答案: c】
A 含有纯虚函数的类称为抽象类
B 抽象类不能被实例化,但可声明抽象类的指针变量
C 抽象类的派生类可以实例化
D 纯虚函数可以被继承
7】
请将下列程序补充完整,使得输出结果为:
Destructor Derived
Destructor Base
#include <iostream>
using namespace std;
class Base
{
public:
virtual ~Base() 【 正确答案: virtual ~Base ()】 { cout << "Destructor Base"<< endl; }
};
class Derived : public Base
{
public:
【 正确答案: ~Derived () 或 virtual ~Derived ()】 { cout << "Destructor Derived" << endl; }
};
int main ()
{
Base *pBase = new Derived;
delete pBase;
}