c++考试参考题
1、对c++和c语言的兼容性,描述正确的是 (c++兼容c )
2、c++中使用流进行输出,其中输出到屏幕的对象是(cin)
3、对使用关键字new所开辟的动态内存空间,释放时必须使用(delete)
4、class成员声明时没有使用private关键字,则默认是(private)
5、如果一个类没有定义任何构造函数,下列描述正确的是()
编译期总是会自动生成一个不带参数的构造函数
6、一个类可以有几个析构函数(1个)
7、int Func(int, int)不可以与下列哪个函数构成函数重载()
double Func(int, int)
8、函数参数有默认值,下列说法正确的()
该参数之后的参数都需要有默认值
9、c++中解决菱形继承冲突的机制是(虚基类)
10、已定义类A并有合法语句 A* p = new A(5) ,那么说法正确的是()
类A一定有一个显示定义的构造函数
11、在一个类中,哪些成员可以是多个
静态成员函数
12、new和mallco的区别说法不正确的是(new和mallco可以互换使用)
13、int id[sizeof(unsigned long)]; 这个对吗?为什么?
正确,sizeof是编译期运算符
14、某文件中定义的静态全局变量(或称静态外部变量)其作用域是 (本文件 ) ?
15、引用与指针的区别不正确的是?
引用和指针都可以指向空值
16、const与 #define的比较不正确的是?(IDE可以对宏定义进行调试)
17、const与constexpr的说法不正确的是(const是编译期常量)
18、malloc/free 与 new/delete的说法不正确的是 ()
由于c++是兼容c语言的,可以使用malloc替换new,free替换delete使用
19、若数组名作实参而指针变量作形参,函数调用实参传给形参的是?
数组第一个元素的地址
20、构造函数声明为explicit A(int n),下列代码不正确的是()
A a{1.0}
21、关于内联函数的说法正确的是()
内联函数会做类型检查
22、“new”in c++ is a?
operator
23、final关键字的作用说法错误的是()
可以修饰类静态方法
24、关于继承的说法错误的是?()
c++不允许多继承
25、const不能修饰哪些信息()
可以修饰类的静态方法
26、访问权限说法错误的是()
子类无法访问父类受保护成员
27、关于类对象成员初始化的顺序说法错误的是()
根据类的构造函数参数初始化列表的顺序初始化
28、虚表的说法正确的是()
虚函数表是在编译时创建的
29、有继承关系的类,析构函数为什么要定义为虚析构()
只有虚函数才能正确释放内存,否则可能会导致内存泄漏
30、下列方法定义会冲突的是()
void print(const int) const;
void print(const int);
31、引用与指针的区别
- 指针和引用的自增运算结果不一样
- sizeof的大小不一样
- 引用定义时必须初始化并且不能改变
32、static的说法正确的是
- 可以隐藏变量和函数
- static变量默认是0
33、虚函数和内联函数的说法正确的是
虚函数是运行时确定
内联函数是编译时替换的
虚函数不可以是内联函数
34、必须使用初始化列表进行初始化的是
引用成员
常量成员
当调用一个成员类的构造函数,而它拥有一组参数时
当调用一个基类的构造函数,而它拥有一组参数时
35、多态的实现方式有哪些
重载、模板、覆盖、虚函数
36、继承的缺点有哪些
父类的内部细节对子类是可见的 子类与父类是一种高耦合,违背了面向对象思想。 子类从父类继承的方法在编译时就确定下来了,所以无法在运行期间改变从父类继承的方法的行为。 如果对父类的方法做了修改的话(比如增加了一个参数),则子类的方法必须做出相应的修改。
37、组合的优点有哪些
当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象时不可见的。 当前对象与包含的对象是一个低耦合关系,如果修改包含对象的类中代码不需要修改当前对象类的代码。 当前对象可以在运行时动态的绑定所包含的对象。可以通过set方法给所包含对象赋值。
38、属于右值的是()
b+c的返回值
字符串"hello world"
int func()的返回值
lambda表达式
39、关于stl中vector的说法错误的是()
当空间大小不足时,新分配的空间大小为原空间大小的2倍
40、set与hash_set的区别
都可以自动进行排序
41、map插入方式有几种?
用insert函数插入value_type数据
用insert函数插入pair数据
用数组方式插入数据
在insert函数中使用make_pair()函数
42、map[]与find的区别
map[]访问的元素不存在时会插入一个默认值并返回
43、野指针时怎么产生的
指针p被free或者delete之后,没有置为nullptr
指针操作超越了变量的作用范围
指针变量没有被初始化
44、const与#define的区别
const定义的常量是变量带类型,而#define定义的只是个常数不带类型
const不能重定义,而define可以通过#undef取消某个符号的定义,进行重定义
define预处理后,占用代码段空间,const占用数据段空间
define只是简单的字符串替换没有类型检查。而const是有数据类型的,是要进行判断的,可以避免一些低级错误;
define只在预处理阶段起作用,简单的文本替换,而const在编译、链接过程中起作用;
45、lambda函数说法错误的是()
不需要返回值
46、模板的说法正确的是()
模板的声明和实现必须放在h文件中
47、如何禁止隐式转换()
explicit
48、如何禁止被继承()
基类定义为final类
基类构造函数定义为private
49、父类指针所指向的对象如何安全转换为子类对象
dynamic_cast
50、c++的标准流对象
cout、cin
51、关于模板函数说法正确的是()
模板函数最终会编译成多少个函数是可以确定的
使用模板函数会导致编译时间变长
52、关于模板函数的使用说法错误的是()
模板函数必须要有参数
53、关于模板类的使用说法正确的是()
模板类中可以有模板方法
全特化模板类不能单独定义
54、关于模板类特化说法错误的是()
模板类不允许进行特化
55、哪些是编译期数据()
static constexpr typedef enum
56、关于实现模板元编程中的while循环的说法正确的是()
必须借助元数据
需要有递归表达式
需要使用特化模板来中止循环
57、关于模板元编程中实现分支判断的说法正确的是()
模板特化来实现分支
模板的偏特化实现分支
58、下面代码是交换两个变量,以下代码能正确执行的是:
template<class T>
void swap(T&& a, T&& b){
T c = a;
a = b;
b = c;
}
int a = 123, b = 456;
swap(move(a), move(b));
59、能指向函数 void print(int n) 的函数指针的是()
void (*pFun)(int) = print;
typedef void (*pFUN)(int);
pFUN pfun = &print;
60、能指向类成员函数,下面成员函数的函数指针的是()
class Base{
void print(int n){}
}
typedef void (Base::*pClassFun)(int);
pClassFun p = &Base::print;
void (Base::*pClassFun)(int) = &Base::print;
61、关于NULL和nullptr说法错误的是
c++中 NULL是((void *)0)
62、关于下面代码说法正确的是
template<class T>
void print(T&& n){
func(n);
}
func(n)可能会有错误,需要std::forward(n)进行传递
63、move和forward的说法正确的是
move的返回结果是右值
64、现有如下函数: void print(int, double, float), 使用bind能够不正确转换的是()
auto f = bind(print, std::placeholders::_1);
65、关于stl中智能指针说法错误的是()
weak_ptr要lock之后就可以正常使用
66、function对象可以指向的对象是()
普通函数 仿函数 lambda表达式 类成员方法 类成员属性 类静态方法
67、计算int arr[100]中的偶数个数,使用count_if时第三个参数可以使用()
//method1:
std::count_if(arr, arr+100, [](int n){ return n%2 == 0; })
//method2:
struct check{
bool operator()(int n){
return n%2==0;
}
};
std::count_if(arr, arr+100, check());
//method3
bool check(int n){
return n%2 == 0;
}
std::count_if(arr, arr+100, check);
//method4
bool check(int n){
return n%2 == 0;
}
std::count_if(arr, arr+100, &check);"
68、在c++11中auto类型不能正确推导的是
auto a[] = {1, 2, 3};
69、在c++11中,代码 get(12,‘A’) 能正确编译的是()
//method1:
auto get(int a, int b) -> decltype(a + b){
return a + b;
}
//method2:
template <class T, class U>
auto get(T a, U b) -> decltype(a + b)
{
return a + b;
}
70、以下add模板函数能够正确编译并且能够完美使用的是()
template <class T1, class T2>
auto add(T1 a, T2 b) -> decltype(a + b)
{
return a + b;
}
71、关于placement new的说法正确的是()
可以在栈空间创建对象
不会申请内存,只会调用构造函数
可以在堆空间创建对象
不可以delete,而要显示调用析构
72、请问class D的大小(20字节)
class A{ int a; };
class B : public A{ int b; };
class C : public A{ int c; };
class D: public B, public C{ int d; };
73、模板不定参数如何展开()
要有递归表达式
使用特化模板来中止递归
使用普通函数来中止递归
74、模板函数与普通函数的匹配优先级说法正确的是()
普通函数的优先级比模板函数高
75、请问class B的大小(24字节)
class A{ int a; };
class B : virtual public A{ double b; };
76、请问class D的大小(40字节)
class A{ int a; };
class B : virtual public A{ int b; };
class C : virtual public A{ int c; };
class D: public B, public C{ int d; };
77、纯虚类和纯虚函数说法正确的是
有纯虚函数的类就是纯虚类
纯虚类的子类也可以是纯虚类
78、防止类被外部实例化的方式有哪些
删除默认构造函数
将构造函数定义为非公有
定义一个无用的纯虚函数
79、关于异常的说法错误的是()
自定义异常必须继承自std::exception类
80、有以下类,obj是A类对象,obj的地址为0x7ffdaf91d6bc,请问成员属性c的地址是多少(0x7ffdaf91d6c4)
struct A{ int a; short b; int c; };
81、有以下类,obj是A类对象,obj的地址为0x7ffe86fe18b0,请问成员属性c的地址是多少(0x7ffe86fe18c0)
struct A{ virtual ~A(){} int a; short b; int c; };
82、对于派生类的构造函数,在定义对象时构造函数的执行顺序为?
1 :基类的构造函数 2 :成员对象的构造函数 3 :派生类本身的构造函数
83、如果n的地址为0x7ffe0ecd138c,以下代码会输出什么()
int n = 1;
cout << "address 1 = " << &n << endl;
cout << "address 2 = " << &(n++) << endl;
cout << "address 3 = " << &(++n) << endl;
编译错误,无法对n++取地址
84、以下代码输出信息()
struct A{
void* operator new(size_t sz){
void* o = malloc(sz);
cout << "1";
return o;
}
A(){ cout << "2" << endl; }
A(int a, int b){ cout << "3" << endl; }
};
int main(int argc, char const *argv[]) {
A* p = new A();
return 0;
}
12
85、能够正确初始化A对象的有哪些()
struct A{
A(){ }
A(int a, int b){ }
};
int main(){
A p = {1, 2}; //可以
A p{1, 2}; //可以
A* p = new A{1,2}; //可以
A* p = new A{}; //可以
A p{}; //可以
}
86、关于封装,下列说法中不正确的是()
通过封装,对象的属性都是不可见的
87、假设A为一个类,那么A的正确的拷贝构造函数的原型声明是()
A(const A& a);
88、假设A为一个类,那么A的正确的移动构造函数的原型声明是()
A(A&& a);
89、c++中用memset来对类对象清零说法正确的是()
会清空虚函数表
90、 int (*s[10])(int) 表示的是什么()
可以指向int func(int)函数数组
|