1.有以下程序段
int * p;
p = ______malloc(sizeof(int));
若要求使p指向一个int型的动态存储单元,在横线处应填入的是?
答:( int * )
解析:malloc返回一个void*类型的指针,需要强制转化成int*类型的指针,这样才能表明指针的地址和指向内存单元的大小。
2.以下程序
#include <stdio.h>
void fun( char ** p)
{
int i;
for(i=0;i<4;i + + )printf("% s",p[i]);
}
main( )
{
char *s[6]={ "ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX" };
fun(s);
printf("\n");
}
程序运行后的输出结果是?
答:ABCDEFGHIJKLMNOP
解析:以上语句定义了一个指针数组 s。首先这是一个数组,这个数组里存储的是指针,也就是说s[1], s[2] ...等存储的都是指针,类型是 char*。而数组名是指向第一个元素的常量指针,因此 s 是指向指针的指针,所以函数 fun 的形参定义是 char **。fun(s) 将指针 s 的值传递给形参 p,所以 p = s。
3.有如下程序,执行后输出的结果是( )
#include <iostream.h>
class cla{
static int n;
public:
cla(){n++;}
~cla(){n--;}
static int get_n(){return n;}
};
int cla::n= 0;
int main()
{
cla *p =new cla;
delete p;
cout<<"n="<<cla::get_n()<<endl;
return 0;
}
答:n=0
解析:类的实例化:cla *p = new cla,p分配在栈上,p指向的对象分配在堆上。n为静态成员变量,没有this指针,属于类域,所有对象共享。
实例化——调用构造函数,所以n++;
delete——调用析构函数,所以n--。
最后输仍旧为0。
4.关于类与对象,下面哪一种说法是错误的?
A.一个对象是某个类的一个实例
B.一个实例是某个类型经实例化所产生的一个实体
C.创建一个对象必须指定被实例化的一个类
D.一个类的多个对象之间不仅持有独立的数据成员,而且成员函数也是独立的
答:D
解析:静态成员变量、静态成员函数是由同一类中的所有对象共享的。
5.
#include<iostream>
using namespace std;
class A{
public:
void test()
{ printf("test A"); }
};
int main(){
A* pA = NULL;
pA->test();
return 0;
}
其实这个是可以正常运行的
原因如下:
因为对于非虚成员函数,C++这门语言是静态绑定的。这也是C++语言和其它语言Java, Python的一个显著区别。以此下面的语句为例:
pA->test();
这语句的意图是:调用对象 pA 的 test 成员函数。如果这句话在Java或Python等动态绑定的语言之中,编译器生成的代码大概是:
找到 pA 的 test 成员函数,调用它。(注意,这里的找到是程序运行的时候才找的,这也是所谓动态绑定的含义:运行时才绑定这个函数名与其对应的实际代码。有些地方也称这种机制为迟绑定,晚绑定。)
但是对于C++。为了保证程序的运行时效率,C++的设计者认为凡是编译时能确定的事情,就不要拖到运行时再查找了。所以C++的编译器看到这句话会这么干:
1:查找 pA 的类型,发现它有一个非虚的成员函数叫 test 。(编译器干的)
2:找到了,在这里生成一个函数调用,直接调A:: test ( pA )。
所以到了运行时,由于 test ()函数里面并没有任何需要解引用 pA 指针的代码,所以真实情况下也不会引发segment fault。这里对成员函数的解析,和查找其对应的代码的工作都是在编译阶段完成而非运行时完成的,这就是所谓的静态绑定,也叫早绑定。
正确理解C++的静态绑定可以理解一些特殊情况下C++的行为。
5.C和Objective-C的混合使用,以下描述错误的是()
选项:
A.cpp文件只能使用C/C++代码
B.cpp文件include的头文件中,可以出现objective-C的代码
C.mm文件中混用cpp直接使用即可
D.cpp使用objective-C的关键是使用接口,而不能直接使用代码
答:B
解析:obj-c 的编译器处理后缀为 m 的文件时,可以识别 obj-c 和 c 的代码,处理 mm 文件可以识别 obj-c,c,c++ 代码,但 cpp 文件必须只能用 c/c++ 代码,而且 cpp 文件 include 的头文件中,也不能出现 obj-c 的代码,因为 cpp 只是 cpp。