const,引用,inline
如何替代宏的?区别?优势?
inline函数 和 static函数 和 #define 比较
1:#define: #define是在预编译的时候,进行的没有类型检查的单纯替换,而inline是在编译的时候进行的有类型检查的代码展开。
2:#define没有调试的可能,如果代码里面有#define所替换的函数,只能祈祷不要出错,因为程序无法调试。而inline在debug版本下是有调试的代码的,在release版本下没有调试的信息。
3:#define,是宏替换,是代码处不加任何验证的简单替代,而内联函数是将代码直接插入调用处,而减少了普通函数调用时的资源消耗。
4:宏不是函数,只是在编译前预处理阶段将程序中有关字符串替换成宏体。 inline是函数,但在编译中不单独产生代码,而是将有关代码嵌入到调用处。
5:Static:static总是使得变量或对象的存储形式变成静态存储,连接方式变成内部连接,对于局部变量(已经是内部连接了),它仅改变其存储方式;对于全局变量(已经是静态存储了),它仅改变其连接类型。(1 连接方式:成为内部连接;2 存储形式:存放在静态全局存储区)
6:inline因为在调用的地方直接代码展开,所以它不存在栈帧的开辟,顾没有额外的开销。而普通函数却需要栈的开辟。另外,普通函数会生成符号,存储在符号表里面,inline不会生成符号表。
7:static修饰的数据或函数,只是本文件可见,inline函数也是本文件可见
“const 引用 inline ”
Const
1.const 用于指针的两种情况分析:
int const *A; //A可变,*A不可变
int *const A; //A不可变,*A可变
分析:const 是一个左结合的类型修饰符,它与其左侧的类型修饰符和为一个类型修饰符,所以,int const 限定 *A,不限定A。int const 限定A,不限定A。
2.const 限定函数的传递值参数:
void Fun(const int Var);
分析:上述写法限定参数在函数体中不可被改变。
3.const 限定函数的值型返回值:
const int Fun1();
const MyClass Fun2();
分析:上述写法限定函数的返回值不可被更新,当函数返回内部的类型时(如Fun1),已经是一个数值,当然不可被赋值更新,所以,此时const无意义,最好去掉,以免困惑。当函数返回自定义的类型时(如Fun2),这个类型仍然包含可以被赋值的变量成员,所以,此时有意义。
4. 传递与返回地址: 此种情况最为常见,由地址变量的特点可知,适当使用const,意义昭然。
5. const 限定类的成员函数:
class ClassName {
public:
int Fun() const;
…
}
注意:采用此种const 后置的形式是一种规定,亦为了不引起混淆。在此函数的声明中和定义中均要使用const,因为const已经成为类型信息的一部分。
获得能力:可以操作常量对象。
失去能力:不能修改类的数据成员,不能在函数中调用其他不是const的函数。
引用 &,引用与指针的操作的区别在于,指针传入函数之后,指针还会创建一个本地的拷贝,而引用直接是变量的别名,不会被拷贝
基本数据类型引用:int a = 10;int &b = a;(相当于给a取了一个别名b)
指针类型引用:int a=10;intp =&a;int&q=p;(相当于给指针p取了一个别名q)
结构体类型:typedef struct{int x, int y}coor; coor c1; coor &c2=c1; (相当于给结构体类型c1取了别名c2)
函数传参:void fun(int & a, int & b){//函数体} 调用函数 fun(x, y) 在执行函数时,修改的会是x, y的值。