牛客错题整理——C++

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

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] = ?

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;

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

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] = ?

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.

相关推荐

  1. 整理——C++

    2024-04-10 13:46:02       14 阅读
  2. 周赛 Round 40(补C

    2024-04-10 13:46:02       16 阅读
  3. 的一道C)变种水仙花

    2024-04-10 13:46:02       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-10 13:46:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-10 13:46:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-10 13:46:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-10 13:46:02       20 阅读

热门阅读

  1. 正则表达式

    2024-04-10 13:46:02       15 阅读
  2. 正则表达式简介

    2024-04-10 13:46:02       15 阅读
  3. Element Plus的deep穿透

    2024-04-10 13:46:02       15 阅读
  4. 计算机的各种转换

    2024-04-10 13:46:02       11 阅读
  5. SpringBoot中ApplicationEvent的用法

    2024-04-10 13:46:02       16 阅读
  6. 要有大不了被裁了的思想

    2024-04-10 13:46:02       13 阅读
  7. 常见Linux嵌入式C语言笔试面试题

    2024-04-10 13:46:02       15 阅读