1、考虑函数原型void test (int a ,int b = 7,char z = '#'),下面的函数调用中,属于不合法的调用的是()
A test (5)
B test (5, 8)
C test (6, '#')
D test (0, 0, '#')
答案: C
解析:
1.在具有多个参数的函数中指定默认值时,默认参数都必须出现在不默认参数的右边,一旦某个参数开始指定默认值,它右边的所有参数都必须指定默认值。
2.在调用具有默认参数的函数时,若某个实参默认,其右边的所有实参都应该默认。。
3.C选项的意图是希望跳过第二个参数,传递第三个参数,但是实际上会发生类型转换把#转换为int,所以编译起来其实是通过的
2、引用可以是void类型吗?
A 不可以 B 可以
答案: A
解析:void类型没有分配内存,而引用必须是另一个固定内存变量的别名,所以不能指向void;
3、假设寄存器是8位,用补码形式存储机器数,包括一位符号位,那么十进制数-25在寄存器表示为:
答案:E7H
解析:十进制数-25的原码为10011001,反码为11100110,补码是反码加1,即为11100111,转化为十六进制即为E7
4、若执行fopen 函数时发生错误,则函数的返回值是()。
答案:0
解析:【解释】执行fopen函数时,如果文件打开成功,则返回该文件结构体的指针,如果打开失败(例如,读打开时文件不存在,写打开时文件不能创建),则返回NULL(即0)。
5、(单选题)
#include#include using namespace std; int main(void) { vector<int>array; array.push_back(100); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(300); array.push_back(500); vector<int>::iterator itor; for(itor=array.begin();itor!=array.end();itor++) { if(*itor==300) { itor=array.erase(itor); } } for(itor=array.begin();itor!=array.end();itor++) { cout<<*itor<<""; } return 0; }
下面这个代码输出的是()
答案:100 300 300 500
解析:vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
如下:
iterator erase( iterator _Where);
iterator erase( iterator _First, iterator _Last);
如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
在本题中,当 *itor==300成立时,删除第一个值为300的元素,同时itor指向下一个元素(即是第二个值为300的元素),
在for(;;itor++)执行itor,itor指向第三个值为300的元素,进入下一个循环
进入循环满足*itor==300,重复上面的过程,执行完循环,itor执行值为500的元素。
所有整个过程中,只删除了2个值为300的元素。
6、单选题
下列叙述中正确的是()
A 在scanf函数中的格式控制字符串是为了输入数据用的,不会输出到屏幕上,
B 在使用scanf函数输入整数或者实数时,输入数据之间只能使用空格来分隔
C 在printf函数中,各个输出项只能是变量
D 使用printf函数无法输出百分号%
答案: A
解析:
1.scanf 函数中的格式控制字符串是为了输入数据用的 , 无论其中有什么字符 , 也不会输出到屏幕上 , 所以 A 正确。 scanf() 的格式控制串可以使用其他非空白字符 , 如逗号 , 但在输入时必须输入这些字符 , 以保证匹配就可以 , 所以 B 错误。 Printf 函数可以输出常量也可以输出变量 , 所以 C 错误。 Prinf 函数可以用 "\%" 来输出百分号 %, 所以 D 错误。
2.
A. 正确
B. “只能使用空格”,错误-----还可以使用逗号啊
C. “只能是变量”,错误-----printf(“hello,world”),一个变量也没有
D. “不能输出%”-----使用了转义字符 \ 就可以了
7、在Windows编程中下面的说法正确的是()
A 两个窗口,他们的窗口句柄可以是相同的
B 两个窗口, 他们的处理函数可以是相同的。
C 两个窗口, 他们的窗口句柄和窗口处理函数都不可以相同。
答案:B
解析:答案B
窗口句柄就相当于一个身份证,是一个整数,如果两个窗口的句柄相同的话,就会出现消息不知道传给哪个窗口了。
8、下面对静态数据成员的描述中,正确的是?
A 静态数据成员可以在类体内进行初始化
B 静态数据成员不可以被类的对象调用
C 静态数据成员不受private控制符的作用
D 静态数据成员可以直接用类名调用
答案: D
解析:static数据成员必须在类体之外进行定义。通常在定义时才进行初始化。但是,当类型为const static时的整形时可以在类体内进行初始化。因此A有正确的地方,但是也有错误的情况,因此不选A。 选D
A错误。只有基本类型的静态常量才可以在类内初始化。
B错误。静态数据成员可以被类的对象调用。
C错误。静态数据成员可以被private之类的修饰作用,被private修饰之后,只有类的友元和成员函数可以访问。
D正确。静态成员变量可以使用ClassName::静态变量名这种方式进行访问。访问权限根据其被public、private之类的修饰限定。
http://zhidao.baidu.com/link?url=jbAgTLhVlo2dxIFv2zSSO41t0OpvNCEdWYPbi_p_8HKW0EAGbNDw8-f7WP0qfIRmDp5S8ren218eye3lCgQgO_
9、以下的代码有什么问题吗?
struct Test
{
Test(int ){}
Test (){}
void fun (){}
};
void main (void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}
会出现的问题是:b.fun()会出错
解析:
1.
Test a(1); //新建了一个对象
a.fun(); //因此可以调用函数
Test b(); //声明了一个函数,并没有新建对象
b.fun(); //没有新建对象,则不能调用函数
2.一不小心就错了!关键要看题目考察的本质!
本质:类对象的声明中加小括号()和不加小括号()的区别:不加小括号()表示实例化了一个类对象,调用默认构造函数;加小括号()则表示声明了一个函数,参数为空,返回类型为类类型。
所以,Test b();运行后不会出现问题,而后面的b.fun()由于b不是类对象,不能调用类成员函数而导致编译错误!
10、
(单选题)
有如下程序段:
#include
using namespace std;
class A {
public:
~A() {
cout << "~A()";
}
};
class B{
public:
virtual ~B() {
cout << "~B()";
}
};
class C: public A, public B {
public:
~C() {
cout << "~C()";
}
};
int main() {
C * c = new C;
B * b1 = dynamic_cast(c);
A * a2 = dynamic_cast(b1);
delete a2;
}
则程序输出:
解析:
1.创建一个类对象c,然后动态类型转换,让一个B *b1指针指向c,再一次动态类型转换,让一个基类A *a2指针指向b1,当delete a2时,调用析构函数,但是基类A的析构函数不是虚函数,所以只调用A的析构函数,结果应该是:~A()
2.main()函数中,第一句只用了new,调用了构造函数,没用delete,不会调用析构函数,内存泄露。第二句、第三句只是定义了指向不同对象的指针,不会产生对象,所以构造函数、析构函数都没调用,最后一句delete调用析构函数,因为基类A的析构函数不是虚函数,所以只调用A的析构函数,输出:~A(),如果A的析构函数加上virtual, 输出:~C()~B()~A(),与直接delete c输出一样。 析构函数声明为虚函数,这样析构时,先调用派生类的析构函数,再调用基类的析构函数,防止内存泄露。
3.动态的多态通过虚函数实现,基类指针指向派生类的对象,若指针调用的函数派生类中存在,且在基类中声明为虚函数,则调用的函数是派生类中的函数。 析构函数总是要声明为虚函数,这样析构时,先调用派生类的析构函数,再调用基类的析构函数,防止内存造成泄露 A类的析构函数未声明为虚函数,所以A类的指针,只可以调用A类的析构函数