牛客网错题收集(2)

一.单选题

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的安全性是相对较高的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值