10.4 const用法总结(定义常量,指针,成员函数)

Posted: March 27, 2011 in C++

定义常量已经在之前的post里面介绍过了,

请参阅: http://wp.me/p14oGQ-6g

使用 const 指针 :

声明指针时,可以在类型前或后使用关键字const,也可在这两个位置都使用.

以下都是合法的声明:

const int *p1;

int * const p2;

const int  const *p3;

然而这些声明的含义不同:

~ p1是一个指向整形常量的指针.它的指向是不能修改的.

~p2是一个指向整形的常量指针.他只想得知可以修改,但p2不能指向其他变量.

~p3是一个指向整形常量的常量指针.它指向的值不能修改,且这个指针也不能指向其他变量.

理解这些的技巧在于:

查看关键字const右边来确定什么被声明为常量.

如果该关键字的右边是类型,则值是常量.

如果该关键字的右边是指针变量,这指针本身是常量.

eg:

const int *p1; //the int pointed to is constant

int *const p2; //p2 is constant, it can’t point to anything else

如果对象不应被修改,则按引用传递它是应用const进行保护.

务必将指针设置为空,而不要让它未被初始化(迷途,悬浮指针).

不要使用已被删除的指针, 不要将指针删除多次.

Q: 既然const对象限制了对其的修改,为什么要声明这样的对象呢?

A: 因为想让编译器帮您查找错误. 一种很难发现的严重错误是: 函数以对调用函数来说不明显的方式修改对象,

     将对象声明为const可以防止这种被修改.

 Const成员函数 :

 如果将类方法声明为const, 必须保证该方法不会修改任何成员的值.

将类方法声明为const:

void SomeFunction() const;

 这生命了一个名为SomeFunction()的const成员函数,他不接受热河参数,返回类型为void.

由于它被声明为const, 因此不会修改其所属类的任何数据成员.

通常使用修饰符const将只读取得存取器函数声明为const函数, 前面的Cat类有两个存取器函数:

void SetAge(int anAge);

int GetAge();

函数SetAge()不能是const的, 因为他修改成员变量itsAge的值; 而GetAge()应该是const的, 因为它不能修改类的任何成员.

GetAge()只返回成员变量itsAge的当前值. 因此这些函数的生命应该写成这样:

void SetAge(int anAge);

int GetAge() const;

如果将一个函数声明为const, 而该函数的实现通过修改某个成员变量而修改了对象, 编译器将视为错误.

例如, 如果将前面的GetAge()声明为const, 而记录询问Cat年龄的次数, 将产生编译错误,这是因为调用了该方法将修改Cat对象.

一种良好的习惯是,尽可能将方法声明为const的. 让编译器捕获错误, 而不至于等到程序运行时, 才出现bug.

Q: 既然在const函数对类进行了修改会导致编译错误, 为什么不能省略掉const以避免错误呢?

A: 如果成员函数在逻辑上不应该修改类, 则通过使用const, 可让编一起帮助发现一些错误.

     例如, GetAge()函数可能没有理由回去修改Cat类, 但是实现中可能有下面这行代码:

     if(itsAge = 100) cout<<” U R 100 YEARS OLD”;

    如果就爱那个GetAge()声明为const的, 将导致这段代码被视为错误的. 由于你的本意是判断 itsAge 是否等于100, 但不小心将100赋给了itsAge. 由于这种赋值修改了类, 而声明中又指出该方法不会修改类, 因此编译器能够发现这种错误.

    这种错误仅仅通过浏览代码, 很难发现. 人们常常只能看到预期的东西. 更重要的是, 程序可能显示一切正常, 但itsAge却被设置为一个错误的值, 这迟早会导致问题.

以上分别介绍了const用于定量,指针和成员函数的三种用法.

================================================

还有一种const用法: 传递const指针

请参阅: http://wp.me/p14oGQ-83

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s