zoukankan      html  css  js  c++  java
  • 为什么经常用const来代替宏

    常量:是一种标识符,值在运行期间不变。

    C语言用#define,C++也可以用,它还可以用const来表示常量。
    常量可以使程序的可读性变强,想一下如程序中全是变量字符串,会不会很麻烦呢?我们写程序会相当复杂。
    宏和const具体就不介绍怎么使用了。注意的是,宏后面没有分号,const有的。

    const和宏的比较:

    1.const是有类型的,而宏是没有的。它等于是给某个数字或者字符串用特定的名字来表示,就是起一个别名,这样会很方便。
    2.在编译器进行编译的时候,宏是直接替换的,并不会检查错误,这个时候如果出现错误就不好排查了。并且宏没有类型安全检查。
    3.有些集成化的而工具可以对常量进行调试,宏不可以调试。
    4.在C++中尽量不使用宏,而是用const代替。
    注意:再类中不能初始化const数据成员,只能在构造函数的初始化列表中初始化
    要建立一个在整个类中都恒定的常量?用枚举实现。枚举不会占用对象的存储空间,在编译时被全部求值,缺点就是它不可以表示浮点,而且只能表示整数,最大值有限

    使用const提高函数的健壮性

    const最大的用途就是作为函数的参数,返回值,或者是函数的定义体。

    1. 用const修饰的函数的参数,如果参数作为输出用,不管是什么类型的参数都不能不能加const修饰,否则该参数将会失去输出功能。
    2. Const只能修饰输入参数:传递指针,可以防止意外的改动该指针,起到保护作用。
    3. 如果是值传递的话,就不要加const了,因为,值传递本来就需要进行参数的复制,加了const就出现错误了。
    4. 如果是非类型的参数的话,比如说是一个string类,传值就会很浪费空间,因为还要拷贝,所以传引用会更加的有效率,引用只是变量的别名,不会有拷贝,提高效率,所以一般情况下,非类型的的参数都是传引用。如果是内置类型的话,就没有必要了。

    Const修饰函数的返回值

    1. 返回值修饰指针:const char *GetString(); 表示该函数返回值的内容(指针指向的内容不可以改变,不能被修改)该返回值只能赋值给加const修饰的同类型的指针
    2. 返回值就是内置类型:一般不用const修饰,我们都知道,函数的返回值,在最后返回的时候都会进行临时对象的拷贝,是用一个临时对象保存着的。所以就不要加const了
    3. 返回值是类类型:此时需要搞清楚,这个函数是想返回什么,它是想返回一个对象的拷贝,还是仅仅返回“别名”。如果这个返回值在函数退出后还存在,那么就返回引用,如果不存在,就不加引用。
    4. 函数返回值采用“引用传递”的场景并不是很多,例如类中的赋值运算符的重载,采用引用返回值,就是为了实现链式表达,就是实现连续赋值的功能。

    const成员函数:

    任何不会修改数据成员的函数都应该定义为const类型的,就是为了防止修改。定义为const的话,如果不小心修改了,编译器也会报错,这就提高了程序的健壮性,防止出错。

    注意:const成员函数的声明只能放在函数声明的尾部。

    函数内联(inline):

    提高函数的运行效率,C语言用宏来提高执行效率,但是宏也有很多的缺点,所以C++中又引入内联,吧函数定义为内联,可以减少压栈,内联函数没有调用栈桢的开销,
    注意:并不是所有的函数都支持内联,(即使定义了内联,也不一定就是没有调用栈桢)要求函数内部必须比较简单,没有复杂的结构,例如递归,复杂的 循环体。Inline必须与函数定义体放在一起。类中的成员函数默认为inline
    但是并不是所有的函数都用为内联就比较好了,因为内联会复制代码,如果所有的函数都用内联,那代码量就会非常的多,这就会很浪费资源了。
    很多情况下不宜是用内联,因为总代码量会变得很多,消耗空间。
    例如:
    代码较长,循环,递归,等。

  • 相关阅读:
    文献阅读 | On the subspecific origin of the laboratory mouse
    文献阅读 | GenomicsDB: storing genome data as sparse columnar arrays.
    文献阅读 | The human Y chromosome: an evolutionary marker comes of age
    文献阅读 | HaploGrouper: A generalized approach to haplogroup classification
    文献阅读 | Systematic evaluation of error rates and causes in short samples in next-generation sequencing
    文献阅读 | The Wheat 660K SNP array demonstrates great potential for marker‐assisted selection in polyploid wheat
    使用HMM进行分类识别(以语音识别为例)
    文献阅读 | Fine definition of the pedigree haplotypes of closely related rice cultivars by means of genome-wide discovery of single-nucleotide polymorphisms
    GWAS学习笔记(一) | 质量控制(QC)
    python实现简单决策树(信息增益)——基于周志华的西瓜书数据
  • 原文地址:https://www.cnblogs.com/chan0311/p/9427319.html
Copyright © 2011-2022 走看看