const 成员函数, 内联, 友元 , 静态成员 ,编译器的优化

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的赋值运算符函数的重载。 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值