1.const
a.
const修饰变量:
修饰变量的属性为常属性,const修饰的变量具有只读属性.保证const修饰的对象在程序执行过程中不会被改变. 例如:
const int* p1=&a; //*p1不能改
int* const p2=&a; //p2不能改
int const*p3=&a; //*p3不能改
b.
const修饰成员函数:
在成员函数后面加const,const修饰this指针所指向的对象,保证调用这个const成员函数的对象在函数内不会被改变.
c.
成员函数在传参数时,this指针是默认传的参数, 所以const不能加在传参的括号里面,C++提供了一种语法规范,将const加在成 员 函数的后面,修饰成员函数传递的this指针.保证调用这个const成员函数的对象在函数内不会被改变.
d.
const的权限可以被缩小,但不可以被放大.例如:
const对象不可以调用非const成员函数. //const权限不可以被放大
非const对象可以调用const成员函数.//const权限可以被缩小
(可以这样理解:我自己的属性是const,我自己都不可以改变我自己,如果被你调用一下,就想改变我的值,怎么可以呢!)
2. inline 内联函数
a.
以inline修饰的函数叫做内联函数,编译时C++编译器会调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率.
b.
inline 是一种以空间换时间的做法,省去调用函数的额外开销. 代码很长或者有循环/递归的函数不适合用内联.
inline 对于编译器而言只是一个建议,编译器会自动优化. 比如说:如果定义为inline的函数体内有递归的话,编译器优化的时候会忽略内联.
inline 必须与函数定义放在一起,才能成为内联函数,仅将inline放在声明前是不起任何作用的.
定义在类内的成员函数默认为inline.
c.
在c语言中,宏也有类似的功能,不过宏也有一些弊端
宏的优缺点
1.宏常量--增强可维护性
2.宏函数--增强效率(没有压栈开销)
1.不方便调试
2.没有类型安全检查
3.宏可读性比较差,可维护性比较差(宏函数),易出错
3.friend 友元
a.
在C++中友元函数允许在类外访问该类的任何成员,就像成员函数一样,友元函数用关键字friend说明.
b.
友元函数不是类的成员函数
友元函数可以通过对象访问所有成员,私有和保护成员也一样.
c.
friend可以修饰友元类和友元函数
友元是单向的.
d.
在类中将函数/类声明为该类的友元函数/友元类. friend fun();
可以让一个非成员函数去访问类中的任何成员.
缺点:
破坏了类的封装性.
4.static 成员
a.
类里面static修饰的成员,为静态类成员.
类的静态成员是该类型的所有对象所共享.
b.
static 修饰的成员,改变了成员变量的链接属性
c.
static修饰的成员函数没有隐含的this指针.
所以可以直接通过类名加 :: 来调用
Date :: Fun()
又因为它没有隐含地this指针,所以在static修饰的成员函数内部也不可以访问调用普通的成员函数.
5.N种构造拷贝构造的优化.
补充知识:
匿名对象: Date() // 临时对象,生命周期只在当前一行.
a.
编译器发现在一个表达式的一个步骤里面(一行里面),在构造了一个临时对象之后,再拿该临时对象马上又拷贝构造了一个对象.编译器会把两个步骤合二为一.
注 编译器优化只限于构造和拷贝构造.
b.
只有涉及临时对象的才会进行优化
class AA
{};
AA f (AA a)
{
return a ;
}
void Test1 ()
{
AA a1 ;
a1 = f(a1);
}
void Test2 ()
{
AA a1 ;
AA a2 = f(a1);
}
void Test3 ()
{
AA a1 ;
AA a2 = f(f(a1));
}
Test1中调用了_2__次AA的拷贝构造函数,_1__次AA的赋值运算符函数的重载。
Test2中调用了_2__次AA的拷贝构造函数,__0_次AA的赋值运算符函数的重载。
Test3中调用了_3__次AA的拷贝构造函数,_0__次AA的赋值运算符函数的重载。