牛客错题整理——C++

1.运行下图中代码,输出的结果是什么?这段代码有什么问题?

c 复制代码
class A
{
public:
        A()
        {       std::cout << "A is created." << std::endl;        }
 
        ~A()
        {       std::cout << "A is deleted." << std::endl;        }
};
 
class B : public A
{
public:
        B()
        {       std::cout << "B is created." << std::endl;        }
 
        ~B()
        {       std::cout << "B is deleted." << std::endl;        }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
        A* pA = new B();
        delete pA;
        return 0;
}

答案为输出三行,分别是:A is created. B is created. A is deleted。

用new创建B时,回调用B的构造函数。在调用B的构造函数的时候,会先调用A的构造函数。因此先输出A is created. B is created.接下来运行delete语句时,会调用析构函数。由于pA被声明成类型A的指针,同时基类A的析构函数没有标上virtual,因此只有A的析构函数被调用到,而不会调用B的析构函数。因而我们通常规定:继承体系中的析构函数应当为虚函数,以此保证所有构建的实体均能够正常析构。

2.下列关于静态变量与对象变量的说法中错误的是()

A.静态方法可以调用静态变量

B.静态方法可以调用对象变量

C.成员方法(非静态method)可以调用静态变量

D.成员方法(非静态 method)可以调用对象变量

答案为B

A. 静态方法可以调用静态变量 - 这是正确的。静态方法是属于类的,而不是属于对象的,因此它只能访问静态变量,这些变量也是属于类的,而不是属于任何特定对象的。

B. 静态方法可以调用对象变量 - 这是错误的。静态方法不能访问非静态的成员变量(即对象变量),因为这些变量是属于对象的,而不是属于类的。在静态方法中访问非静态成员变量会导致编译错误,因为静态方法不依赖于任何特定的对象实例。

C. 成员方法(非静态method)可以调用静态变量 - 这是正确的。非静态方法(成员方法)可以访问静态变量,因为静态变量是类的成员,可以在类的任何方法(包括静态和非静态方法)中访问。

D. 成员方法(非静态 method)可以调用对象变量 - 这也是正确的。非静态方法是与对象实例关联的,因此它们可以访问和修改对象的成员变量(即对象变量)。

3.下述静态成员的特性中,()是错误的:

A 静态成员函数不能利用 this 推针

B.静态数据变量要在类体外进行初始化

C.静态数据变量既可以通过对象名访间。也可以通过类名来访问

D 静态数据成员只有静态的对象才能访问

答案为D

A 静态成员函数不能利用 this 指针

这是正确的。静态成员函数是属于类的,而不是属于类的某个对象。因此,它们没有与特定对象关联的 this 指针。静态成员函数只能访问静态成员变量和其他静态成员函数,因为它们不依赖于任何对象实例。

B 静态数据变量要在类体外进行初始化

这也是正确的。在C++中,静态数据成员(无论是整型、浮点型还是其他类型)都必须在类定义之外进行初始化。这是因为静态数据成员是与类本身关联的,而不是与类的任何特定对象关联的。因此,它们的初始化不能在类的构造函数中完成,而必须在类定义之外进行。

C 静态数据变量既可以通过对象名访问,也可以通过类名来访问

这同样是正确的。静态数据成员属于类本身,因此它们可以通过类名直接访问。但是,由于它们也是类的成员,因此也可以通过类的对象来访问。不过,通过对象访问静态成员通常是不推荐的,因为这可能会导致混淆。

D 静态数据成员只有静态的对象才能访问

这是不正确的。静态数据成员是类的成员,而不是特定对象的成员。因此,它们可以通过类名或任何类的对象来访问,而不仅仅是静态对象。

4.以下是C++的不同数据类型值的比较语句,请问这些判断语句中作为条件部分的语句编写有问题的有:

A 如果变量bVar是布尔类型:if(false == bVar)doSomeThing();

B 如果变量nVar是int型:if(0 == nVar)doSomeThing();

C 如果变量fVar为浮点型:if(0.02 == fVar){doSomeThing();}

D 如果变量sVar为字符串型:if(""== sVar){doSomeThing();}

答案为 C错

注意是0.02=fVar,应该是==,如果忽略这个,那么两个浮点数比较也是有问题的,应该指定一个误差

5.则a[q - p] = ?

c 复制代码
int a[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
int *p, *q;
p = a;
q = &a[2];

答案为 2

这里q-p的实际运算是:(q的地址值-p的地址值)/sizeof(int),所以为2.

6.有以下定义语句 double a,b; int w; long c;

若各变量已正确赋值,则下列选项中正确的表达式是()

c 复制代码
A a=a+b=b++
B w%(int)(a+b)
C (c+w)%(int)a
D w=a==b;

答案为 BC

D不是表达式,是语句

7.则a[q - p] = ?

c 复制代码
int a[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
int *p, *q;
p = a;
q = &a[2];

答案为 2

这里q-p的实际运算是:(q的地址值-p的地址值)/sizeof(int),所以为2.

相关推荐
Young_2022020214 分钟前
学习笔记——KMP
笔记·学习
ChoSeitaku16 分钟前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
娅娅梨18 分钟前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
兵哥工控22 分钟前
MFC工控项目实例二十九主对话框调用子对话框设定参数值
c++·mfc
汤米粥24 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
Fuxiao___25 分钟前
不使用递归的决策树生成算法
算法
冰淇淋烤布蕾27 分钟前
EasyExcel使用
java·开发语言·excel
我爱工作&工作love我30 分钟前
1435:【例题3】曲线 一本通 代替三分
c++·算法
行然梦实30 分钟前
学习日记_20241110_聚类方法(K-Means)
学习·kmeans·聚类
拾荒的小海螺33 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言