【笔试题】【day7】
目录
第一题(什么时候使用内联函数)
第二题(缺省参数默认值必须从右往左依次给出)
第三题(类定义的权限问题)
第四题(成员变量一定要通过初始化列表来初始化的问题)
第五题(运算符重载的操作数位置)
第六题(友元函数的相关知识)
第七题(内存空间的开辟位置的问题)
第一题(什么时候使用内联函数)
在()情况下适宜采用 inline 定义内联函数
A 函数体含有循环语句
B 函数体含有递归语句
C 函数代码少、频繁调用
D 函数代码多,不常调用
内联函数的概念:inline修饰的函数称为内联函数
内联函数的特性:在编一阶段,会将内联函数展开--将函数调用直接使用函数体来进行替换
内联函数的作用:少了函数调用参数压栈以及创建栈帧等开销--可以提高程序运行的效率
注意:inline是一个建议性的关键字--一般情况 建议:没有循环 没有递归 函数体不是很长。
C
第二题(缺省参数默认值必须从右往左依次给出)
在 C++ 语言中,对函数参数默认值描述正确的是()
A 函数带默认值的参数只能有一个
B 一个函数的参数若有多个,则参数默认值的设定可以不连续
C 函数参数必须设定默认值
D 在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值
缺省参数(默认参数):在声明和定义函数时,可以给函数的参数带上一个默认值,在调用函数时,如果用户没有传递实参,则使用定义时所给的默认值,如果用户传递了实参,就是用用户传递的实参--备胎
全缺省参数:每个参数都有默认值
半缺省参数:部分参数局具有默认值,并且:默认值必须从右往左依次给出。
void f(int a,int b=20,int c=10)编译成功
void f(int a=10,int b,int c=20)编译失败
D
第三题(类定义的权限问题)
下面关于类定义的说法中,正确的是:
A 类定义中包括数据成员和函数成员的声明
B 类成员的缺省访问权限是保护的
C 数据成员必须被声明为私有的
D 成员函数只能在类体外进行定义
类定义的两种方式
1.可以将声明和成员函数的定义放在全部类中
2.类中只放成员变量和成员函数的声明,成员函数的定义可以放在.cpp文件中,注意:成员函数名前必须加类名
class:默认访问权限private
struct:默认访问权限public
建议将成员变量设置为private,将成员函数设置为public
A
第四题(成员变量一定要通过初始化列表来初始化的问题)
有一个类A,其数据成员如下:
class A {
...
private:
int a;
public:
const int b;
float* &c;
static const char* d;
static double* e;
}
则构造函数中,成员变量一定要通过初始化列表来初始化的是:______。
A a b c
B b c
C b c d e
D b c d
E b
F c
初始化列表位置才是真正的初始化,构造函数中只是赋值。
初始化列表中:只能对类中非静态的成员变量进行初始化。
(静态的成员变量是所有的类共享的,我们应该把对它的初始化放到类外,统一进行初始化,只需要初始化一次)
哪些成员必须在初始化列表的位置初始化?
1.const修饰的成员变量
2.引用类型的成员变量
3.类的类型对象,该类没有默认的构造函数。
1)const修饰的变量是常量,值只有一次初始话的机会,后面就不能在修改了
2)引用不能有空引用,必须要初始化
3)比方说我们的B类中没有默认构造函数,有一个B(int x)的构造函数,那么我们的另外一个类A去调用我们这个类B的时候,就必须在初始化列表的位置初始化这个B
A() :B(30) { }
B
第五题(运算符重载的操作数位置)
C++ 中,有如下类模板定义:
template<class T> class BigNumber{
long n;
public:
BigNumber(T i) :n(i) {}
BigNumber operator+(BigNumber b) {
return BigNumber(n + b.n);
}
};
已知 b1, b2 是 BigNumber 的两个对象,则下列表达式中错误的是()
A 3+3
B b1+3
C b1+b2
D 3+b1
如果将运算符重载成类的成员函数,形参个数要比该运算符需要的参数个数少1
因为:成员函数具有隐藏的this指针!
对于b1+3:
重载的这个+是对两个BigNumber的对象进行相加的
如果类中具有单个参数的构造函数,该构造函数具有类型转化的作用
我们的类中具有一个单参的构造函数,所以我们的编译器在编译的时候,会调用单参构造函数将3转换成为BigNumber对象,然后再进行相加。
C的话直接调用我们上面的两个两个BigNumber的对象进行相加就行
D的话因为我们的第一个参数一定是隐藏的this,编译器只会对我们operator+后面的那个操作数进行隐式类型转换,并不会对我们的第一个参数也就是我们的隐藏的this指针所指向的对象进行隐式类型转换,所以我们的D是错误的
D
第六题(友元函数的相关知识)
下面有关友元函数与成员函数的区别,描述错误的是?
A 友元函数可以让本类和友元类对象调用
B 友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数
C 类的成员函数是属于类的,调用的时候是通过指针this调用的
D 友元函数是有关键字friend修饰,调用的时候也是通过指针this调用的
友元函数:不是类的成员函数--但是在友元函数中可以访问类中私有的成员
成员函数:具有隐藏的this,受访问限定符的限制,通过对象来调用
D:友元函数不是成员函数,没有隐藏的this指针,不能通过this调用
D
第七题(内存空间的开辟位置的问题)
对于以下代码,说法正确的是()
char * p = new char[100];
A p 和 new出来的内存都在栈上
B p 和 new出来的内存都在堆上
C p在栈上 new出来的在堆上
D p在堆上 new出来的在栈上
new:C++中用来从动态申请空间的 默认情况下 new底层调用的是operator new-->malloc
new:默认情况下申请的空间在堆上。
全局作用域中:p的空间是在数据段中
函数体中:p的空间在栈上
C