一.单选题
1.
若需要把一个类外定义的成员函数指明为内联函数,则必须把关键字( )放在函数原型或函数头的前面。
正确答案: B 你的答案: C (错误)
in
inline
inLine
InLiner
https://zhuanlan.zhihu.com/p/48021301
2.
x*=y+8 等价于 x=x*(y+8)。请问这句话是正确的吗?
正确答案: A 你的答案: A (正确)
正确
错误
解释:双目+ 的等级高于+=
3.
定义:int *const ptr;下面哪种说法是正确的()
正确答案: A 你的答案: A (正确)
ptr不可修改,*ptr可修改
ptr不可修改,*ptr不可修改
ptr可修改,*ptr不可修改
ptr可修改,*ptr可修改
解释:
考察const的作用,不需要死记硬背,没那么复杂。
const 的作用就是封锁它后面的东西,即后面的不可改变。
对于 i nt const ptr; 没有const关键字时,为int ptr 此时ptr是指向int的指针。加上const后,const修饰并封锁ptr。即ptr的指向不可改变。同理 int const* ptr(等同 const int *ptr) 。const修饰 * 解引用 ,即 指针指向的内容不可改变。
4.
64位系统下,p=NULL和p=new char[100], sizeof§各为多少?
正确答案: D 你的答案: D (正确)
4,4
4,8
8,4
8,8
解释:指针类型,32位就是4,64位就是8
5.
在c++中,下列描述错误的是( )
正确答案: A 你的答案: A (正确)
在创建对象前,静态成员不存在
静态成员是类的成员
静态成员不能是虚函数
静态成员函数不能直接访问非静态成员
解释:
静态的使用注意事项:
1.静态方法只能访问静态成员(包括成员变量和成员方法)
非静态方法可以访问静态也可以访问非静态
2.静态方法中不可以定义this,super关键字
因为 一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。静态方法在优先于对象存在,所以静态方法中不可以出现this,super关键字。
3.主函数是静态的。
程序运行的时候,静态成员已经加载在内存里面了,但是包含静态成员的对象共享这些静态成员,
比方说,A有一个静态成员public static int i;那么程序运行的时候,这个i就加载进内存了,A的所有对象的i变量都指向这个静态空间的i,也就是说创建对象之前,它就占空间了
1:只有类的成员函数才能说明为虚函数;
2:静态成员函数不能是虚函数;
3:内联函数不能为虚函数;
4:构造函数不能是虚函数;
5:析构函数可以是虚函数,而且通常声明为虚函数
6.
以下程序段执行后结果是()
1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
void main()
{
short *p,*q;
short arr[15]={0};
p=q=arr;
p++;
printf("%d,",p-q);
printf("%d,",(char*)p-(char*)q);
printf("%d",sizeof(arr)/sizeof(*arr));
}
正确答案: D 你的答案: C (错误)
1,0,15
0,2,1
1,1,15
1,2,15
解释: short 占来两个字节,char 占一个字节。指针自增、自减每次移动的偏移量是指针所指向对象的字节大小,所以p++与q的偏移量是2个字节。指针相减的值是指针地址的偏移除以指针每次移位的大小;
1)p-q=1;偏移量为2个字节,每次移动2个字节,所以为1
2)(char *)p-(char *)q,指针的偏移没变,但是每次指针移位是按照(char*)类型移动,即每次移动1个字节,所以是2
3)数字每个元素2个字节,所以sizeof(arr)为30,sizeof(*arr)为2。
7.
下面程序打印结果为()
#include
using namespace std;
class A
{
char a[3];
public:
virtual void fun1(){};
};
class B : public virtual A
{
char b[3];
public:
virtual void fun2(){};
};
class C : public virtual B
{
char c[3];
public:
virtual void fun3(){};
};
int main ()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof© << endl;
return 0;
}
正确答案: B 你的答案: C (错误)
4,20,28
8,20,32
4,12,20
8,16,28
解释:
//基类 内存对齐 //派生类 如果是virtual 继承 ,有这样的一个指针vptr_b_a,这个指针叫虚类指针,也是四个字节, 还要包括类a的字节数, // 如果不是virtual 继承,需要包含基类非函数成员
8.
有如下定义#define D 2 int x=5;floaty=3.83; char c=′D′; 则下面选项中错误的是()。
正确答案: D 你的答案: B (错误)
x++;
y++;
c++;
D++;
解释:d是因为我们不能对宏进行取地址操作,而++操作是先从内存取值到寄存器 然后寄存器加一后再写入内存中必然涉及如地址操作
9.
设x为整型变量,不能正确表达数学关系1<x<5的C++逻辑表达式是()。
正确答案: A 你的答案: D (错误)
1< x <5
x2||x3||x==4
1<x && x<5
! (x<=1)&&! (x>=5)
解释:逻辑表达式,要使用逻辑运算符,逻辑与,逻辑或,逻辑非
10.
有以下程序
main()
{
int a,b,d=25;
a=d/10%9;
b=a&&(-1);
printf("%d,%d\n",a,b);
}
程序运行后的输出结果是( ) 。
正确答案: B 你的答案: D (错误)
6,1
2,1
6,0
2,0
解释:逻辑与&&运算认为0为假,非0为真
11.
十进制数50表示成符合C语言规定的八进制数为________。
正确答案: D 你的答案: C (错误)
20
32
62
062
解释:c语言中八进制表示为了与十进制区分前面要加0
12.
如果要实现一个多线程(非MFC)程序, 选择多线程CRT, 创建线程的时候应该用CreateThread还是_beginthreadex()?
正确答案: B 你的答案: 空 (错误)
CreateThread
_beginthreadex
一样
和具体机器配置相关
解释: _beginthreadex()比较于 CreateThread()有更高的线程安全性,不会造成多个线程共用同一个全局变量的情况。再总结一下区别:
CreateThread()函数是Windows提供的API接口,在C/C++语言另有一个创建线程的函数_beginthreadex(),在很多书上(包括《Windows核心编程》)提到过尽量使用_beginthreadex()来代替使用CreateThread(),这是为什么了?下面就来探索与发现它们的区别吧。
首先要从标准C运行库与多线程的矛盾说起,标准C运行库在1970年被实现了,由于当时没任何一个操作系统提供对多线程的支持。因此编写标准C运行库的程序员根本没考虑多线程程序使用标准C运行库的情况。比如标准C运行库的全局变量errno。很多运行库中的函数在出错时会将错误代号赋值给这个全局变量,这样可以方便调试。但如果有这样的一个代码片段:
if (system(“notepad.exe readme.txt”) == -1)
{
switch(errno)
{
…//错误处理代码
}
}
假设某个线程A在执行上面的代码,该线程在调用system()之后且尚未调用switch()语句时另外一个线程B启动了,这个线程B也调用了标准C运行库的函数,不幸的是这个函数执行出错了并将错误代号写入全局变量errno中。这样线程A一旦开始执行switch()语句时,它将访问一个被B线程改动了的errno。这种情况必须要加以避免!因为不单单是这一个变量会出问题,其它像strerror()、strtok()、tmpnam()、gmtime()、asctime()等函数也会遇到这种由多个线程访问修改导致的数据覆盖问题。
为了解决这个问题,Windows操作系统提供了这样的一种解决方案——每个线程都将拥有自己专用的一块内存区域来供标准C运行库中所有有需要的函数使用。而且这块内存区域的创建就是由C/C++运行库函数_beginthreadex()来负责的。
所以正如上述几位所说,_beginthreadex的安全性是相对较高的。