c/c++面试题(7)零碎知识总结

1.变量的声明和定义有什么区别?

声明:变量的声明做了两件事情

         a.告诉编译器这个变量已经匹配到一块内存上了,下面的代码用到的变量或对象是在别处定义的.

            声明可以出现很多次.

         b.告诉编译器这个变量名已经被我占用了,其他的的变量将不能再使用.

定义:告诉编译器创建一个对象,为这个对象分配一块内存并给它取一个名字,这个名字就是常说的

        变量名或对象名.同一变量或对象的定义只能出现一次.

本质区别:声明没有分配内存,而定义则是创建了对象并为这个对象分配了一块内存.

2.sizeof和strlen之间的区别?

   a.sizeof是一个操作符,而strlen是一个库函数,使用需要包含<string.h>头文件.

   b.sizeof的参数可以是数据类型或变量,而strlen函数只能以结尾为‘\0‘的字符串的作为参数.

   c.编译器在编译的时候就计算出了sizeof的结果.而strlen函数必须在运行的时候才能计算出来.

  d.sizeof计算的是数据类型占用的内存的大小,而strlen计算的字符串实际的长度,不包括‘\0‘;

     注意strlen在计算字符数组的时候,遇到0的时候和遇到‘\0‘的效果一样.

  e.数组作为sizeof的参数不会退化,而作为strlen的参数的时候会退化为一个字符指针.

3.简要的说下static的用途.C语言关键字static 和 C++的关键字static之间的区别?

  a.在C语言中static可以修饰局部变量,全局变量和函数.

     static修饰的局部变量,改变了它的存储方式,由原来的栈区改变成静态区.实际上就是影响了它的

     生命周期,作用域并没有改变.好处是具有继承特性,每次调用时候都要创建的开销.

      static修饰的全局变量,改变了它的声明周期,但是存储方式并没有改变,普通的全局变量和静态的

      全局变量都是在静态存储区域,只是改变了它的作用域.由原来的在整个源程序都可以使用到只有

      定义它的那个源文件使用.

      static修饰的函数也是改变它的作用域,static修饰的函数又叫内部函数;只能在本模块内使用,

      而不能被其他的模块使用.

   b.C++中除了上述的用途之外,static还可以定义类的成员变量和函数.

       static定义的成员变量和函函数是隶属于类,而不是对象.所有的用类实例化的对象都共享

      一份,访问static成员的时候有两种方式:一是通过类域解析::一个是通过实例化的对象.

      C++的静态成员可以在多个对象间进行通信,传递信息.

4.C中的malloc/free和C++中new/delete之间的区别?

  a.maloc/free是C的标准库函数,可以覆盖,但是不能重载,C和C++都可以使用.而new/delete是操作符,

     可以重载,只能在C++中使用.

  b.对于非内部的数据类型的对象而言,光用malloc/free是无法满足对象的要求的.对象在创建的时候需要

     执行构造函数,对象在消亡之前需要执行析构函数.而malloc/free是库函数而不是运算符,不在编译器

     的控制范围之内,编译器不能将执行构造函数和析构函数的任务强加给malloc/free.因此C++需要有一

     个能够完成动态分配内存和初始化的new,以及一个能够完成清理和释放内存的运算符delete.

  c.new的返回值是指定类型的指针,可以自动的计算所需要分配的内存的大小.而malloc的返回值是一个

    void类型的指针,使用的使用要进行强制类型转换,并且分配的大小也要程序员的手动进行计算.

  d.new/delete完全覆盖了malloc/free的功能,只所以还保留malloc/free,是因为我们在写C++程序的时候有

      时会调用用C编写的代码,而C中又没有new/delete操作符.

  e.new的时候做两件事情:内存被分配,为被分配的内存调用一个或多个构造函数构建对象.

     delete的时候也是一样:为将要被释放的内存调用一个或多个析构函数,释放内存.

4.写一个标准的宏MIN,并说明下一个宏的一些用的注意事项?

   #define  MIN(a,b)   ((a) < (b) ? (a) :(b))

   调用的时候要注意它的副作用,例如

   ((++*p)<=(x)?(++*p):(x))这种三目操作符最好不要用来比较带有自增或自减的表达式,因为在运算的

   过程式会多改变一次,就违背了原来的本意.

5.一个指针可以是volatile吗?

   可以.因为指针和普通的变量一样也是一个变量,有时也会有变化程序的不可控制性.常见的例子:

   子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰这个指针.

   volatile修饰的指针通常是共享指针,通常是这个指针被多个服务共享的时候,这个时候就有可能

   在编译器的检测能力之外改变它的值.

6.简述strcpy,sprintf,memcpy的区别?

   char* strcpy(char* dest,const char* src);

   int     sprintf(char* str,cosnt char* format,...);

   void* memcpy(void* dest,void* src,size_t n);

   1.操作的对象不同,strcpy的两个操作对象均为字符串,sprintf的操作源对象可以是多种数据类型,

      目的操作对象是字符串,memcpy的两个对象是两个任意类型的可以操作的内存地址,不限制

      任何的类型.

   2.执行的效率不同,memcpy最高,strcpy次之,sprintf效率最低.

   3.实现的功能不同,strcpy主要实现字符串变量间的拷贝,它不检测边界.sprintf主要实现其他数据格式

      到字符串之间的转换.memcpy主要是内存块间的拷贝.

7.设置地址为0x67a9的整型变量的值为0xaa66;

   int* p = (int*)0x67a9;

   *p = 0xaa66;

    无论是什么平台地址长度和整型数据的长度都是一样的,即一个整型数据可以强制类型转换成地址

    指针类型的只要有意义即可.

8.C++中的重载,覆盖,隐藏之间的区别?

   a.重载(overload)的特征:函数名相同,同一作用域下参数列表不同的函数才形成重载.它对于返回类型

      和是否是virtual函数没有关系.重载的功能就是同一函数名具有不同的行为.

   b.覆盖(override)的特征:它指的是派生类的函数覆盖基类的函数,因此作用域不同.并且覆盖的要求

      函数名相同,参数列表相同并且返回类型都必须相同.基类的成员函数必须是虚函数.

      所谓的覆盖指的是:用基类对象的指针或引用访问虚函数根据实际的指向来实际的决定所调用的函数

   c.隐藏(hide)的特征:隐藏指的是派生类的函数隐藏(屏蔽)了与其同名的基类的函数.在调用一个类成员函数的

      时候,编译器会沿着类的继承链逐级的向上查找函数的定义,如果找到了,那么就停止查找了.所以如果一个

      派生类和它的基类都有同一个同名的函数,编译器最终选择派生类中的函数,那么就说派生类中的成员函数

      隐藏了基类中的成员函数,也就是说它阻止了编译器继续向上查找的行为.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

c/c++面试题(7)零碎知识总结,布布扣,bubuko.com

c/c++面试题(7)零碎知识总结

上一篇:java 代理模式详解


下一篇:4.JAVA之GUI编程事件监听机制