牛客错题整理——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.则aq - 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.则aq - 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.

相关推荐
小饕5 分钟前
RAG学习之【向量数据库】Milvus 从入门到精通:索引、检索、混合搜索一篇打通(RAG 必备)
数据库·人工智能·学习·milvus
是多巴胺不是尼古丁7 分钟前
期末java复习--string
java·开发语言·python
blueman88888 分钟前
VS2022 切换定义(F12 / Go to Definition)反应慢
c++·visual studio
Survivor00113 分钟前
高并发系统流量治理的底层算法
java·开发语言
bIo7lyA8v15 分钟前
算法可视化对教学与调试效率的影响分析的技术8
算法
凡人叶枫16 分钟前
Effective C++ 条款35:考虑 virtual 函数以外的其他选择
java·c++·spring
郝学胜-神的一滴22 分钟前
CMake 017:彩色日志输出实战
linux·c语言·开发语言·c++·软件工程·软件构建·cmake
hunterkkk(c++)25 分钟前
优先队列启发式最短路径快速算法(优化SPFA)-HEAP_SPFA算法
算法
m0_5474866628 分钟前
《数字图像处理:使用MATLAB分析与实现》全套课件PPT
开发语言·matlab·powerpoint
Full Stack Developme36 分钟前
Apache Tika 教程
java·开发语言·python·apache