const
在C语言中,const修饰的变量被称为常变量,编译阶段,不能做左值,其他处理和变量一样。
在C++中,const修饰的变量被称为常量,在编译阶段,把用到常量的地方替换成常量初始化的值
注意:1.常量一定要初始化 2.不允许常量做左值 3.不允许间接修改, 杜绝间接访问来修改常量风险 。
全局变量:
在C语言中,const修饰的全局变量,存放在globe段
在C++中,const修饰的全局变量,存放在local段
常函数:
常对象不能调用普通方法。
class Test
{
public:
Test(int a) :ma(a){}
void Show()const//_thiscall Test* const this ==> const Test* const this
{
std::cout << "ma:" << ma << std::endl;
}
private:
int ma;
};
int main()
{
const Test test(20);//常对象
test.Show();
}
引用(&)
引用又称为“别名”,一定是要初始化的
int a = 10;
int &b = a; //b保存的是a的地址
注意:1.一定要初始化;
2.引用不能引用不能取地址的数据;
int &a = eax;//因为寄存器没有地址,所以错误
3.引用不能改变。
4.引用只能引用 引用常量所引用的数据
引用的底层是以指针的方式来支持引用的,在引用使用的地方,系统自带解引用。
引用和指针的区别:
●指针是一个实体,而引用仅是个别名;
●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有 的, 前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
●引用不能为空,指针可以为空;
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
内联函数(inline)
在编译阶段处理,在调用点直接展开。
inline函数和static修饰的函数的相同:都是本文件可见。
inline函数和static修饰的函数的区别:
1.内联函数不开栈,没有开辟和清理栈的开销。
static修饰的函数有栈的开辟和销毁。
2.inline函数在编译阶段调用点展开。
static是一个函数符号,在local段
inline函数和宏的区别:
inline:在编译阶段,有词法,语法,词义的分析,所以存在类型检查 安全检查
宏:在预编译阶段进行宏替换,不安全。
因此,inline是一种更安全的宏。
注意事项:
1.inline函数实现是在.h文件中。
2.inline只在Release版本中从在。
3.递归,循环,switch中不能用内敛。
4.内联只是给编译器的一个建议。
inline void Revese_Print(int arr[], int len)
{
if (len == 0)
return;
std::cout << arr[len - 1] << " ";
Revese_Print(arr, len - 1);
}//内联不会实现
5.内联是基于实现的关键字,不是基于声明中/。
inline int Sum(int, int);//无作用,不能再声明中添加
inline int Sum(int a, int b)//正确
{
return a + b;
}
内联函数的缺点:以代码膨胀为代价,空间换时间。
建议:
1. 开栈的开销 > 执行的开销 建议使用内联函数
2.开栈的开销 < 执行的开销 不建议使用内联函数