预处理
#宏定义求最大值
>#define MAX(x,y) ((x)>(y)?(x):(y))
#const与define区别define
>在编译前执行,无数据类型,仅仅在编译前做替换const存在于程序中数据段,分配空间,有数据类型
#const在C++中的作用
>修饰常量 : 编译器对其进行数据静态类型安全检查
>修饰形参 :func( A const &a); 传入a的引用可以提高效率,但引用容易改变原值,所以加const保护
>修饰函数返回值:当返回指针时给返回值加const , 则返回值不能被直接修改,并且赋值给 const修饰的变量
>修饰成员函数:对于不需要修改成员变量的成员函数,都应该加const以避免误修改成员变量。
#static有什么作用
>在函数体,维持静态变量在函数调用过程不变
>用来将变量或函数的作用于限制在本模块(文件)内
>static函数在内存中只有一份
>类中的static成员,所有对象共享。不属于具体对象,因此需要在类外面初始化,并且不能试用this指针
#.static全局变量/局部变量/函数 与 普通全局变量/局部变量/函数 的区别
a、全局变量:static作用域在当前文件(只能被初始化一次,防止在别的文件被引用)
b、局部变量:static变量只初始化一次,下次调用使用上次的值
c、函数:static函数在内存中只有一份,普通函数每调用一次都维持一份复制品。
#.C++中的static静态成员
a、静态成员变量目的:替代全局变量
b、特征:类定义前就已经分配空间,因此必须在类外面初始化
c、satic成员的引用:<类名>::<静态成员名>
d、satic属于整个类而不是某个对象,因此没有this指针,因此他只能访问类的静态数据和静态函数
#求以下sizeof空间占用
>char p[] = "Hello"; // 6, p为数组,保存了 Hello+ ,
>char p[20] = "Hello"; //20 ,p为数组,20个元素
>char str[]="Hello"; char p = str; // 4, p为指针
>void func( char p[100] ){} // 4, p为指向数组的指针
>void *p = malloc(100); // 4 , p为指向100字节堆内存的指针
>sizeof 一个空类对象 // 1,普通函数不占空间,但编译器会安插一个char成员,以便可以分配地址
>sizeof一个含有虚函数的对象 // 4 ,虚函数指针(指向虚函数表)
>sizeof虚继承自A同时虚继承自B // 8 ,针对每个基类的继承会有不同的虚指针
#.sizeof和strlen区别
char str[] = "hellow" , sizeof(str)=strlen("hellow")+1
#.内联函数inline 与宏定义的区别
>inline在编译时展开,宏在预编译时展开
>inline函数可在编译时直接嵌入到目标代码,而宏只是做字符替换
>inline函数会对数据类型,语法进行检测,宏不会
>宏参数容易引起二义性
>inline是为了提高调用效率
>只有inline函数能访问类成员,宏定义则不行,起到封装性
引用和指针
#引用和指针区别
>初始化,引用创建的同时必须初始化。
>修改,引用初始化后不可在引用别的对象,但指针可以重新指向别的对象
>不存在 NULL 的引用 ,因此不需要在使用引用前检查引用的合法性
>基于以上两点,引用比指针安全
内存
#内存分配
>malloc , 分配sie个字节空间,未初始化
>calloc ,分配n块长度为size空间,已初始化
>reallc ,拓展空间到size
>new , delete ,在构造和析构函数中用来申请,释放内存
面向对象
#.构造和析构
a.构造可重载,析构不能
b.为什么基类的析构函数是虚函数:在析构时防止只析构基类而不析构派生类的状况发生