面试笔记5(C预处理器、作用域、static、cosnt以及内存管理)

来源:互联网 发布:mac vi编辑器保存退出 编辑:程序博客网 时间:2024/06/04 20:45

1.C语言的预处理主要有三个方面的内容。

1)宏定义与宏替换

2)文件包含

3)条件编译

2.在c++中,宏替换实现的符号常量功能由const、ENUM代替,带参数的宏替换可由函数模板内联函数代替。

3.如果头文件名包括在尖括号<>里,那么认为该头文件是标准头文件。

 如果头文件在一对引号里,那么认为它是非系统头文件,非系统头文件的查找通常开始于源文件所在的路径。

4.条件编译

#if  /ifdef   /ifndef

#else

#elif

#endif

5.为了保证头文件在给定的源文件中只处理过一次,我们首先检测#ifndef

6.在不同文件中引用改一个已经定义过的全局变量,可以用引用头文件的方式,也可以用extern关键字。

7.同一个函数内的复合语句中定义的变量只在复合语句中有效。

在同一个文件中,当局部变量屏蔽了全局变量,而又想使用全局变量时,有两种方法。一种是使用域操作符::,一种是使用“extern”

8.static的作用是默认初始化为0,包括未初始化的全局静态变量和局部静态变量。未初始化的全局变量也具备这一属性。

都是存储在BBS段内的。

9.static的另外一个作用是保持局部变量的持久。只进行一次初始化并且具有记忆性。始终存在于程序的声明周期。

10.C++中的static。

表示属于一个类而不是属于此类任何特定对象的变量和函数。

static成员可以是函数或数据,都独立于类类型的对象而存在。

11.static数据成员独立于该类的任意对象而存在:每个static数据成员是与类关联的对象,并不与该类的对象关联,也就是说某个类的实例修改了该静态成员变量,其修改值为该类的其他所有实例可见。

static数据成员必须在类定义体的外部定义。static数据成员通常在类定义的外部定义时才初始化。即在类体定义中对静态变量的赋值是错误的。

例外:cosnt static 数据成员可以再类的定义体重初始化。

12.静态成员函数由于不与任何的对象相关联,因此不具有this指针。因而它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数访问静态数据成员。

13.static成员函数不能声明为虚函数、volatile。

注意:静态数据成员变量的值是可以修改的。

14.常量在定义后就不能被修改,所以定义时必须初始化

15.在全局作用域声明的cosnt变量只能存在于那个文件,不能被其他文件访问。通过制定cosnt变更为extern,就可以在整个程序中访问const对象。

16.注意:

c默认const是外部连接的,而c++默认const是内部连接的,如果c++想实现c中的功能,必须要加上extern把连接改成外部连接。

17.c++中个,我们应该用const取代#define

18注意区分cosnt指针和指向const对象的指针。

指向const对象的指针是:const  double *ptr     说明ptr是一个指针,指向const double

const指针          double *const  ptr   也可以是   cosnt (double*)ptr       ptr是一个常量指针。指向double

19.char  *  a[2]定义了一个数组指针 。  char * const a[2]  说明数组元素是常量,

20.如果用const修饰函数返回的指针,这样限定了它指向的内容不能修改从而避免了错误使用导致运行时的崩溃。

注意在函数内定义的指针p,虽然存放在栈上,但是指向的是全局(静态)存储区,而不是指向栈上(如果是栈上,函数结束会进行晴空),可通过函数返回。

21. char  a[10]  ;      a=a+1是错误的,因为a是常量,不可以进行赋值运算。

gcc下的临时变量都作为常量。

22.const成员函数   在函数声明末尾加上const 。

this 的本身类型为  base * const  是一个常量指针。。但现在改成了cosnt  base* cosnt  成了指向常量对象的常量指针。cosnt成员函数不能修改调用该函数的对象(mutable成员除外)

实现const成员函数,使得可以对const对象产生操作。

23.cosnt数据成员

常量数据成员必须在构造函数的成员初始化列表中进行初始化。否则成员无法运行

24.c++中

static 静态成员变量不能再类的内部初始化,在类的内部只能是声明,定义必须在类定义的外部。

int  类名::静态成员       可以不加static

const成员变量不能再类的内部初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。

给cosnt static成员变量赋值时,不需要加static修饰符,但必须加上const

25.在c中使用malloc函数在堆上分配内存,用free释放。

  c++中使用new运算符在堆上分配内存,用delete释放。

26.对于内置类型或没有定义默认构造函数的类型,采用不同初始化方式则有显著的差别。

int  *pi=new  int   int变量没有初始化

int  *pi=new int()   int变量被初始化为0

27.回收new []分配的一组对象的内存空间时用delete[]

28.malloc/free     new/delete的区别

<1 操作对象不同

malloc等是标准库函数,new等是c++的运算符


<2  malloc要手动计算分配的空间,new是自动计算分配的空间

<3  new是类型安全的,malloc不是,new可以指出编译时的错误

<4 malloc 等需要库文件支持,new等则不需要

注意:new创建对象数组,只能使用对象的无参构造函数。

29.内存池可以减少频繁分配内存造成的内存碎片,内存池在真正使用之前,先申请一定数量的、大小相等的内存块留作备用。当有新的内存需求时,就会从内存池中分出一部分内存块,若内存块不够在就行申请新的内存。

30.应用程序一般使用malloc、realoc、new 等函数从堆中分配一块内存,使用完成后,必须调用相应的free或malloc释放该内存块,否则,这块内存就不能被再次使用,我们说这块内存泄露了。


0 0
原创粉丝点击