1.内联函数本意是指一个函数如果功能不复杂就将它直接包含到调用的位置

2.设有以下定义,值为5的枚举常量是?
enum week{sun,mon, tue=3,wed,thu,fri, sat,}w

答案:thu

解析:
枚举类型定义形式:enum typeName (valueName1, valueName2, valueName3, …);
1.如果给定枚举名字,未给名字对应值时,枚举值默认从0开始,往后逐个加1
2.如果给定某个枚举名字和枚举名,往后的值就从给定枚举值开始,逐个往后递增1

3.下列程序的运行结果是?
class A { public: void f() { cout << "A::f()"; } }; class B: public A { public:
void f() { cout << "B::f()"; } }; int main() { B b; b.f(); return 0; }
答案:B::f()

解析:
如果子类的函数与父类的名称相同,但是参数不同,父类函数被隐藏(重定义)

如果子类函数与父类函数的名称相同&&参数也相同&&但是父类函数没有virtual,父类函数被隐藏

如果子类函数与父类函数的名称相同&&参数也相同&&但是父类函数有virtual,父类函数被覆盖(重写)

4.设“int a=15,b=26;”,则“cout << (a,b); ”的输出结果是多少?

答案:26

解析:逗号运算符,返回最右边的值
(2,3)的值是3
((2,3),4)的值是4

5.在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为多少?

答案:1

解析:类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的二地址。同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。所以,
空类的sizeof为1,而不是0,多重继承的空类的大小也是1

6.如果定义如下类:
class Empty{}
请选择编译器为之生成的函数有哪些?

答案:构造函数,析构函数、拷贝构造和赋值运算符

7.在32位编译器下sizof§为()
class P { private: int ival; public: P(); ~P(); int GetVal(){ return ival; };
virtual int SetVal(int val) { ival=val; }; };
答案:8

解析:
1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑
2.普通成员函数与sizeof无关
3.虚函数由于要维护在虚函数表,所以要占据一个指针大小,也就是4字节
4.类的总大小也遵守类似class字节对齐的,调整规则。
本题中,int ival占4个字节,同时virtualintSetVal(intval)占用4个字节,一共是占用8个字节,选B

8.如何捕获下面代码中的异常?
class A { public: A(){} }; void foo(){ throw new A; }
答案:catch (A * x)

解析:throw new A; throw出的是A *类型的指针所以 catch(A * x);

9.定义数组int A [6][9],若将其作为参数传入方法中,则对应的形参可以定义为()

A.int(*s)[9]
B.int *s[9]
C.int D[6][]
D.int D[][9]

答案:AD

解析:编译器会忽略数组第一维的长度,所以参数数组中第一维的长度可以省略,第二维不可以
int(*s)[9] 是表示 指向 大小为9的 数组指针

10.下列函数中,能声明为虚函数的是()?

A.构造函数
B.公有成员函数
C.析构函数
D.私有成员函数

答案:BCD

解析:
什么样的函数不能声明为虚函数?
1.不能被继承的函数。
2.不能被重写的函数。

1)普通函数
普通函数不属于成员函数,是不能被继承的。普通函数只能被重载,不能被重写,因此声明为虚函数没有意义。因为编译器会在编译时绑定函数。
而多态体现在运行时绑定。通常通过基类指针指向子类对象实现多态。
2)友元函数
友元函数不属于类的成员函数,不能被继承。对于没有继承特性的函数没有虚函数的说法。
3)构造函数

首先说下什么是构造函数,构造函数是用来初始化对象的。假如子类可以继承基类构造函数,那么子类对象的构造将使用基类的构造函数,而基类构造函数并不知道子类的有什么成员,显然是不符合语义的。从另外一个角度来讲,多态是通过基类指针指向子类对象来实现多态的,在对象构造之前并没有对象产生,因此无法使用多态特性,这是矛盾的。因此构造函数不允许继承。
4)内联成员函数

我们需要知道内联函数就是为了在代码中直接展开,减少函数调用花费的代价。也就是说内联函数是在编译时展开的。而虚函数是为了实现多态,是在运行时绑定的。因此显然内联函数和多态的特性相违背。
5)静态成员函数
首先静态成员函数理论是可继承的。但是静态成员函数是编译时确定的,无法动态绑定,不支持多态,因此不能被重写,也就不能被声明为虚函数。

11.类B是类A的公有派生类,类A和类B中都定义了虚函数func(),p是一个指向类A对象的指针,则p->A::func()将()?

A.调用类B中函数func()
B.即调用类A中函数,也调用类B中的函数
C.调用类A中函数func()
D.根据p所指的对象类型而确定调用类A中或类B中的函数func()

答案:C

解析:不论指针p是属于类A还是类B,也不论指针p指向的对象属于类A还是类B(当然,不能用类B的指针指向类A的对象),因为加了作用域说明符A::,因此都只会调用类A的函数

12.继承是面向对象的三个特点之一,下列关于继承特点的说法正确的有?

A.公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。
B.私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
C.公有继承的特点是基类的公有成员和保护成员都成为派生类的公有成员,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。
D.保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

答案:ABD

解析:只有公有继承会保持都不变,私有继承都变成私有成员,保护继承都变成保护成员

13.对于c/c++的下列运算符中,能够被重载的是()

A.&&
B.!=
C…
D.->

答案:ABD

解析:
下列运算符不允许重载(5个),以外,C++中的所有运算符都可以重载
. (成员), *(指针) , ::(域运算符) , ?:(三目运算符),siezof(容量度);
而下列只能通过成员函数来重载(4个);
=(赋值),[],(),->(指向并访问)

14.以下关于引用和指针的描述,正确的是?

A.引用和指针都是指向变量的内存地址
B.引用可以表示指针
C.引用和指针都是实现多态效果的手段
D.引用本身是目标变量的别名,对引用的操作就是对目标变量的操作

答案:BCD

解析:
A.引用和指针都是指向变量的内存地址,错误
引用等价于* const ptr,也就是对一个指针常量取值,指针才能指向内存地址,这也解释了引用为什么必须要初始化,且后面无法修改引用。int a
=10; int& r = a;在编译器底层就已经替换成r = * const ptr = *
(&a),这就解释了为什么对引用取地址和原变量相等,看起来变量和引用使用相同的地址,因为&(&*)a= ptr = &a
B.引用可以表示指针,正确
指针的引用是存在的
C.引用和指针都是实现多态的手段,正确
根据引用和指针的关系,当然指针能多态,引用就能多态
D.引用本身是目标变量的别名,对引用的操作就是对目标变量的操作,正确。
这个算C++ primer中的原话

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:766591547
关注微信