1、const的用途
const修饰变量、参数、返回值: 在C++中const修饰变量,变量会变成常量,所以声明的同时必须初始化。
C++会对常量优化,将其放到寄存器中,如果想去内存中取值的话,使用volatile关键字修饰,保证内存可见性。
而在C中const会将变量修饰为常变量,存储在静态文本段, 只有读权限,不能被修改。
const修饰指针:
常量指针: const在*的右边、不能修改指针的指向, 所以必须初始化。
指针常量: const在*的左边、不能修改指针所指向的对象。
举一个例子:
这里是常量指针,const在*的右边,我们可以修改指针p所指向的对象的内容,但是不能修改指针p的指向,即把另一个变量再赋给指针p是不可以的。
这里是指针常量,const在*的左边,我们可以修改p的指向,即可以把另一个变量再赋给指针p,但是我们不能修改p所指向的对象的内容。
const修饰引用: 可以把引用绑定到const对象上,常量的引用不能修改它所绑定的对象。
这里const 修饰在&的左边,我们不能通过b来修改a,因为常量的引用不能修改它所绑定的对象,但是我们可以通过a来修改b的值。
然而对于int& const b=a这样的定义是没有意义的,即const在&右边没意义。
const修饰成员变量: const修饰的成员变量只能在初始化列表中进行初始 化。
const修饰成员函数: 在成员函数后面加上const、const修饰this指针所指 向的对象,也就是保证调用这个const成员函数的对象在成员函数内部不会被改变。 const对象可以调用const成员函数,但是不可以调用非const成员函数。 非const对象既可以调用const成员函数,也可以调用 非const成员函数。const成员函数内部可以调用const成员函数,但是不可以调用非const成员函数。非const成员函数内部可以调用const成员函数,也可以调用非const成员函数。 总结起来就是,权限可以缩小,但是不可以扩大。
2、static的用途
static修饰变量:
static修饰局部变量,会改变局部变量的生命周期, 但是不改变作用域。
static修饰的全局变量,会对全局变量进行内部链接 指定,即全局变量只能在本文件中使用。
static修饰的变量存放在数据段,但是初始值若为0则放在BSS节中,而初始值非零则放在数据节中。数据节和BSS节都属于数据段。(BSS段通常是指用来存放程序中未初始化的全局变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0)。
static修饰函数:
static会对函数进行内部链接指定,即函数只在本文件中可见。
static修饰成员变量: static修饰的成员变量属于类,不属于对象,只有一 份,必须在类外单独进行初始化。使用的时候可以通过对象名或 类名引用,它只在类域内有效。如果一个成员变量同时被const和 static修饰,则直接可以在声明的时候进行赋值。
static修饰成员函数: static修饰的成员函数属于类,不属于对象,只有一 份。静态成员函数的主要目的是为了处理静态数据成员。可以通过对象或者类名来调用静态成员函数。 静态成员函数没有this指针,所以不能直接访问非静态成员函数,但是可以直接访问静态成员函数。非静态成员函数可以直接访问静态成员函数,因为静态成员函数属于类。如果想在静态成员函数内访问非静态成员函数,可以将this指针显示传 递给静态成员函数。
3、inline的用途
内联函数: 以inline修饰的函数,在编译时会在调用内联函数的地方展开,没有函数压栈的开销,提高程序运行效率。inline只是对编译器的一个建议,编译器会自动去优化。inline必须和函数定义放在一起才有作用,放在声明前不起 作用。定义在类内的成员函数默认是内联函数。 尽量以const、enum、inline替换#define
————————————————
版权声明:转载请附上原文出处链接及本声明。