C++学习心得(2)

一、#define宏定义的一些心得

  1. 宏定义在使用时需要把参数用括号括起来,因为宏只是简单的文本替换,很容易出现二义性;宏定义后不需要加分号。
  2. 使用#把宏参数变成一个字符串,使用##把两个宏参数贴合在一起。用例分别如下:
#define STR(str) #str
#define FIT(a,b) a##b
  1. const和#define的特点和区别
    #define在预编译期展开,生命周期止于编译期,它只是一个命令的参数,没有数据类型,无法进行类型安全检查。
    const常量存在于程序数据段,并在堆栈里分配了内存,可以被调用,传递,有数据类型,编译器可以对const常量进行类型安全检查。

二、 const的一些用法

  1. 定义常量:编译器可以对const常量进行数据静态类型安全检查。

  2. 修饰函数形参:当输入参数为用户自定义类型或者抽象数据类型的时候,将“值传递”改为“const&传递”,可以提高效率。

void fun(A a);
void fun(A const &a);

第一个函数在调用时,函数体产生A类型的临时变量用于复制参数a,临时变量的构造,复制,析构过程都会消耗时间,所以效率较低。
第二个函授在调用时,直接用“引用传递”不需要产生临时变量,节省了临时变量的构造,复制,析构过程的时间,但光用引用可能会改变a,所以加const。

  1. 修饰返回值:const来修饰返回的指针或引用,则返回值不能直接被修改,且改返回值被只能被复制给加const修饰的同类指针。
  2. 修饰类的成员函数:任何不会修改数据的成员函数应该被const修饰,当不小心修改了数据成员或调用了非const成员函数时,编译器会报错,const加在成员函数最后。

三、 static的作用

  1. 函数体里,一个静态变量仅初始化一次且在这个函数被调用的过程中维持其值不变。
  2. 在一个模块里(函数体外),一个静态变量可以被模块内所有函数访问,但是不能被模块外其他函数访问,他是一个本地的全局变量。
  3. 在一个模块里(函数体外),一个静态函数可以被模块内所有函数调用,但是不能被模块外其他函数调用,他被限制在声明他的这个模块里使用。static函数在内存中只有一份,而普通函数在每个被调用中维持一份复制品。

四、static全局变量和普通全局变量的区别
全局变量在之前加上static后就成了静态全局变量,全局变量本身就是静态存储方式,静态全局变量也是静态存储方式,另外说一句,局部变量放在动态存储区。
非静态全局变量的作用域在整个源程序,当一个源程序由多个源文件组成时,非静态全局变量在各个源文件都有效,而静态全局变量限制了作用域,只在定义该变量的源文件内有效,因此可以避免在其他源文件引起错误。
由此可以看出局部变量到静态变量改变的是它的存储方式,即改变了生存期;全局变量改变成静态变量后改变的是它的作用域,限制了他的使用范围。

五、C+类静态成员
类的成员成员和方法不属于类的实例,而属于类本身并在所有类的实例中共享。调用他们时应该在类名前加上操作符“::”来引用且初始化需要在类外初始化。

六、内联函数
内联是以代码膨胀(复制)为代价的,省去了函数调用的开销,从而提高函数的执行效率。
如果函数体内的代码比较长,使用内联将导致内存消耗代价较高;
如果函数体内出现循环,那么执行函数体的代码时间要比函数调用的开销大。

七、内联函数与宏

  1. 内联函数在编译时展开,宏在预编译时展开;
  2. 编译的时候内联函数可以直接镶嵌到目标代码中,宏只是一个文本替换;
  3. 内联函数可以完成如类型检查,语句是否正确等编译功能,宏不具备这些功能;
  4. 宏在定义时很容易出现二义性,内联函数不会。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值