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.