﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-HelloWorld 没有才能则难以胜任；没有兴趣则难以愉快；没有方法则事倍功半；没有努力则一事无成。-随笔分类-C++关键字</title><link>http://www.blogjava.net/zhaochengming/category/37472.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 06 Feb 2009 04:29:31 GMT</lastBuildDate><pubDate>Fri, 06 Feb 2009 04:29:31 GMT</pubDate><ttl>60</ttl><item><title>c++中const关键字使用详解 转自http://hi.baidu.com/nanting520/blog/item/28df02821bb9e793f703a6e1.html</title><link>http://www.blogjava.net/zhaochengming/archive/2009/02/06/253499.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Fri, 06 Feb 2009 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2009/02/06/253499.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/253499.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2009/02/06/253499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/253499.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/253499.html</trackback:ping><description><![CDATA[<div class="tit">c++中const关键字使用详解</div>
<div class="date">2007-11-17 00:36</div>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div id="blog_text" class="cnt">关于C++中的const关键字的用法非常灵活，而使用const将大大改善程序的健壮性。在网上搜寻相关主题，发现大多数文章雷同，而关键地方并不是很清楚。在网络资料，参考书的基础上，结合本人的一些体会总结如下，期望对大家有所帮助：<br />
            <br />
            <br />
            一 const基础<br />
            下面四个定义语句是大多数书籍讲解const关键字都会用到的，<br />
            [1]const int* a = &amp;b;<br />
            [2]int const *a = &amp;b;<br />
            [3]int* const a = &amp;b;<br />
            [4]const int* const a = &amp;b;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你能区分出上述四种情况，证明你基础不错，不过也不要高兴太早，这个只是最基础的部分了。不知道也很容易：如果const位于星号的左侧（不管const在类型修饰符的左还是右），则const就是用来修饰指针所指向的变量，即指针指向为常量；如果const位于星号的右侧，const就是修饰指针本身，即指针本身是常量。[1]和[2]的情况相同，都是指针所指向的内容为常量，这种情况下不允许对内容进行更改操作，如不能*a = 3 ；这样的一种声明方式的作用是可以修改pi这个指针所指向的内存地址却不能修改指向对象的值；[3]为指针本身是常量，而指针所指向的内容不是常量，这种情况下不能对指针本身进行更改操作，如a++是错误的;[4]为指针本身和指向的内容均为常量。<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外const 的一些强大的功能在于它在函数声明中的应用。在一个函数声明中，const 可以修饰函数的返回值，或某个参数；对于成员函数，还可以修饰是整个函数。有如下几种情况，以下会逐渐的说明用法：<br />
            A_class&amp; operator=(const A_class&amp; a);&nbsp;&nbsp;&nbsp; //A_class 为一个已经定义的类，下文同<br />
            void fun0(const A_class* a );<br />
            void fun1( ) const;&nbsp;&nbsp;&nbsp; // fun1( ) 为类成员函数<br />
            const A_class fun2( );<br />
            <br />
            二 const的初始化<br />
            先看一下const变量初始化的情况<br />
            1) 非指针const常量初始化的情况：<br />
            A_class b;<br />
            const A_class a = b;<br />
            2) 指针(引用)const常量初始化的情况：<br />
            A_class* d = new A_class(); <br />
            const A_class* c = d;<br />
            或者,<br />
            const A_class* c = new A_class();<br />
            引用： <br />
            A_class f; <br />
            const A_class&amp; e = f;&nbsp;&nbsp; // 这样作e只能访问声明为const的函数，而不能访问一般的成员函数；<br />
            [思考1]： 以下的这种赋值方法正确吗？<br />
            const A_class* c=new A_class();<br />
            A_class* e = c;<br />
            这种方法不正确，因为声明指针的目的是为了对其指向的内容进行改变，而声明的指针e指向的是一个常量，所以不正确；<br />
            [思考2]： 以下的这种赋值方法正确吗？<br />
            A_class* const c = new A_class();<br />
            A_class* b = c;<br />
            这种方法正确，因为声明指针所指向的内容可变；<br />
            <br />
            三 作为参数和返回值的const修饰符<br />
            <br />
            其实，不论是参数还是返回值，道理都是一样的，参数传入时候和函数返回的时候，初始化const变量<br />
            1 修饰参数的const,如,<br />
            void fun0(const A_class* a );<br />
            void fun1(const A_class&amp; a);<br />
            调用函数的时候，用相应的变量初始化const常量，则在函数体中，按照const所修饰的部分进行常量化，如形参为const A_class* a，则不能对传递进来的指针的内容进行改变，保护了原指针所指向的内容；如形参为const A_class&amp; a，则不能对传递进来的引用对象进行改变，保护了原对象的属性。<br />
            [注意]：参数const通常用于参数为指针或引用的情况;<br />
            2 修饰返回值的const，如,<br />
            const A_class fun2( ); const A_class* fun3( );<br />
            这样声明了返回值后，const按照"修饰原则"进行修饰，起到相应的保护作用。<br />
            const Rational operator*(const Rational&amp; lhs, const Rational&amp; rhs)<br />
            {<br />
            return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator());<br />
            }<br />
            返回值用const修饰可以防止这样的操作发生:<br />
            Rational a,b;<br />
            Radional c;<br />
            (a*b) = c;<br />
            一般用const修饰返回值为对象本身（非引用和指针）的情况多用于二目操作符重载函数并产生新对象的时候。<br />
            [总结]一般情况下，函数的返回值为某个对象时，如果将其声明为const时，多用于操作符的重载。<br />
            通常，不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。<br />
            原因如下：如果返回值为某个对象为const（const A_class test = A_class 实例）或某个对象的引用为const（const A_class&amp; test = A_class实例），则返回值具有const属性，则返回实例只能访问类A_class中的公有（保护）数据成员和const成员函数，并且不允许对其进行赋值操作，这在一般情况下很少用到。<br />
            [思考3]： 这样定义赋值操作符重载函数可以吗？<br />
            const A_class&amp; operator=(const A_class&amp; a);<br />
            不正确；在const A_class::operator=(const A_class&amp; a)中，参数列表中的const的用法正确，而当这样连续赋值的时侯，问题就出现了：A_class a,b,c:(a=b)=c;因为a.operator=(b)的返回值是对a的const引用，不能再将c赋值给const常量。<br />
            <br />
            四 类成员函数中const的使用<br />
            一般放在函数体后，形如：<br />
            void fun() const;<br />
            如果一个成员函数的不会修改数据成员，那么最好将其声明为const，因为const成员函数中不允许对数据成员进行修改，如果修改，编译器将报错，这大大提高了程序的健壮性。<br />
            <br />
            五 使用const的一些建议<br />
            1 要大胆的使用const，这将给你带来无尽的益处，但前提是你必须搞清楚原委；<br />
            2 要避免最一般的赋值操作错误，如将const变量赋值，具体可见思考题；<br />
            3 在参数中使用const应该使用引用或指针，而不是一般的对象实例，原因同上；<br />
            4 const在成员函数中的三种用法（参数、返回值、函数）要很好的使用；<br />
            5 不要轻易的将函数的返回值类型定为const;6除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;<br />
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/253499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2009-02-06 10:27 <a href="http://www.blogjava.net/zhaochengming/archive/2009/02/06/253499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>