const小结

原创 2007年10月08日 17:22:00
    C++中的const意味着只读,合理的使用const将大大改善程序的健壮性:

1)声明一个参数为常量是可以向用户传达有用的信息,告知这个参数的应用目的。在规模稍大一点的软件开发中,可以减少阅读程序的人的困惑,避免其他接手工作的程序员花时间清理无用的垃圾。懂得用const的程序员很少会留下的垃圾让别人来清理。
2const关键字通过给优化器一些附加的信息,产生更紧凑的代码。
3)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,减少bug的出现。

1
const的基本概念

    请看下面代码段:

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

    如果关键字不涉及指针,很好理解。前两个其实一个意思,a是一个常整型数。

    后面三句出现了指针,就有点意思了。参考《Effective C++》中所述,若const”*”的左边,则const修饰指针所指向的变量;若const”*”的右边,const就是修饰指针本身,即这个指针是个常指针。因此,第三句意味着a是一个指向常整型数的指针(整型数是不可修改的,但指针可以指向其他地址)。第四个意思a是一个指向整型数的常指针(即指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(即指针指向的整型数是不可修改的,同时指针也是不可修改的)。

    const还可修饰函数的参数和返回值;对于类,const可以修饰成员变量和成员函数(const成员变量通常由const成员函数访问)。偶就不一一举例了。


2
,定义const变量

    不涉及指针的const变量的定义很简单,没什么陷阱。因此我重点总结一下涉及指针和引用的const变量定义中需要注意的问题。

1

int a = 10;
const int * p = &a;
int * q = p;
    上面的例子中,整型变量a的值为10p被定义为一个指向const的变量的指针,p认为它所指向的变量不能改变。从某种角度讲,这个指针都失去了其意义(因为通常我们使用指针都是希望通过指针对变量进行修改,但是这里指针指向的是const变量)。

    但是,请注意,a本身并不是const,并且上例中的q也不是指向const。因此,通过a本身或指针q,都可以修改a的值。这下p这个指向const变量的指针就彻底变成了个废物。

2

int * const p = new int;
int * q = p;

    2是一种正确的使用方法,虽然p是一个const指针,但是该指针所指向的变量是可以改变的,因此非const指针q指向p,通过q来修改p所指向的值并无不妥。

3

A a;
const A &aa = a;

    3中,aa被定义成对常量的引用,因此,aa只能访问声明为const的成员函数,不能访问其他成员函数。

3const参数和返回值

    参数const通常用于参数为指针或引用的情况。一般,如果函数的形参是指针或引用,我们可以在函数体内对指针指向的对象或引用的对象进行修改。因此,如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const修饰,否则该参数将失去输出功能。

    如果参数不作输出用,则可以用const修饰参数。对于const参数,在函数体中按照const所修饰的部分进行常量化,如形参为const A* a,则不能对传递进来的指针的内容进行改变;如形参为const A& a,则不能对传递进来的引用对象进行改变。

    林博士在《高质量C++/C编程指南》中给我们的建议:对于非内部数据类型(例如用户自定义的类)的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率;对于内部数据类型(int,short,long,char等等)的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。

    对于const的函数返回值,通常用于二目操作符重载函数并产生新对象时,起相应的保护作用。例如:

const Rational operator*(const Rational& lhs, const Rational& rhs)
{
    
return Rational(lhs.numerator() * rhs.numerator(),
                            lhs.denominator() 
* rhs.denominator());
}
    const返回值可以防止下面的操作发生:


Rational a,b;
Radional c;
(a
*b) = c;
    但是通常不建议将返回值设定为const。因为如果返回值为某个const对象或const引用,则返回的实例只能访问类的public数据成员和const的成员函数,这样生成的新的对象似乎没有什么作用。

    再看看例4

const A& operator=(const A& a);

    如果连续赋值,就会出现问题:

A a,b,c;
(a
=b)=c;
    因为a.operator=(b)的返回值是对aconst引用,不能再将c赋值给const常量。


4
const成员函数

    任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。

C语言中的const、extern及结构体、联合体的定义

Const Const关键词并不能把一个变量变成一个常量, 在符号前加上const表示这个符号不能被赋值, 即他的值对这个符号来说是只读的, 但并不代表这个值不能用其他方法去改变. 通过下面的例子就...
  • u011392772
  • u011392772
  • 2015年08月21日 09:38
  • 2515

Golang的变量常量及基本类型

1,变量变量的声明: Go语言的变量声明方式与C和C++语言有明显的不同。对于纯粹的变量声明, Go语言引入了 关键字var,而类型信息放在变量名之后,示例如下:1.1变量的声明var v1 in...
  • a1134760013
  • a1134760013
  • 2016年02月01日 19:04
  • 3918

C语言:const关键字、结构体

前几节内容的讲解,主要是内存地址及指针的分析。这一节讲解一下容易混淆的关键字constant及结构体的知识。 一、constant关键字 1. 字符常量的指针 char const *p1 = "he...
  • sinat_27706697
  • sinat_27706697
  • 2015年08月24日 10:31
  • 2884

从零开始学C++之对象的使用(三):static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符

一、static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝  C++ Code  1 2 3 4 5 6 7 8...
  • Simba888888
  • Simba888888
  • 2013年07月09日 16:24
  • 4474

const的用法小结(转)

const的用法小结1.const用于修饰函数参数如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const修饰,否则该参数将失去输出功能。const只能修饰...
  • junbincc02
  • junbincc02
  • 2017年02月09日 20:33
  • 75

小结c++中const成员函数

今天看Lippman的《c++ primer》,解答了一直以来的疑惑。类的常量对象是无法访问非const成员函数的,即使你在函数中不对对象的数据成员进行更改。 请看下面一段代码~ #include ...
  • dongzefeng199233
  • dongzefeng199233
  • 2015年03月31日 11:12
  • 430

static 函数 、const 函数小结(实战篇)

static 函数小结#include #include using namespace std;class point { public: void show(void) ...
  • qq_32744005
  • qq_32744005
  • 2016年07月24日 21:19
  • 409

const and static(小结)

1.const常量数据成员与常量成员函数(1) const数据成员只能够在构造函数的初始化列表中进行初始化,并且初始化后不能够再次作为左值进行赋值操作example:class data { pri...
  • lichen_yun
  • lichen_yun
  • 2016年05月21日 21:38
  • 151

C++问题小结--2.通过几个例子谈谈const与*

const在C++里能够封锁参数,修饰函数,修饰返回值首先,清楚一个概念,比如说我们定义了一个char类型的指针char *p,那么,在这里,p是一个char *类型的指针。p指的是p指针的指向的地址...
  • derkampf
  • derkampf
  • 2016年04月14日 09:51
  • 332

C++中 static、const 应用小结 .

C++  static、const和static const 以及它们的初始化 const定义的常量在函数执行之后其空间会被释放,而static定义的静态常量在函数执行后不会被释放其空间。 st...
  • m372897500
  • m372897500
  • 2012年01月29日 11:23
  • 287
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:const小结
举报原因:
原因补充:

(最多只允许输入30个字)