day03

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 <iostream>       
#include <vector>
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 <iostream>
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<B *>(c);
    A * a2 = dynamic_cast<A *>(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类的析构函数

 

posted @ 2019-07-01 11:37  Mr_Song_D  阅读(663)  评论(0编辑  收藏  举报