zoukankan      html  css  js  c++  java
  • 11、C++之const类成员变量,const成员函数

    //转载

    类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。

    在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:

    (1)有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的。
    (2)除此之外,在类的成员函数后面加 const 还有什么好处呢?那就是常量(即 const)对象可以调用 const 成员函数,而不能调用非const修饰的函数。

    • const成员函数可以访问非const对象的非const数据成员,const数据成员,也可以访问const对象内的所有数据成员;
    • 非const成员函数只可以访问非const对象的任意的数据成员(不能访问const对象的任意数据成员);(上述原因可详见C++Primer(5th)231页。 在默认情况下,this的类型是指向类类型非常量版本的常量指针,例如 Screen类中,this类型为 Screen *cosnt。当在成员函数的后面加上const关键字时,隐式的将this指针修改为 const Screen *const 即指向类类型常量版本的常量指针。根据初始化原则,我们不能将一个常量指针赋值给一个非常量指针)
    • 作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改, 应尽可能将该成员函数声明为const成员函数。

    2. const修饰的是谁?

     const成员函数的写法有两种

      1、void fun(int a,int b) const{}

      2、void const fun(int a,int b){}

    这两种写法的本质是:void fun (const 类 *this, int a,int b);

    const修饰的不是形参a和b;const修饰的是属性this->a和this->b。与const所写的位置无关。

    为什么?

    因为c++对类的this指针做了隐藏,本质上,const指针修饰的是被隐藏的this指针所指向的内存空间,修饰的是this指针。

    总结:

    1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;

    2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;

    3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const 成员函数。

    4)如果只有const成员函数,非const对象是可以调用const成员函数的。当const版本和非const版本的成员函数同时出现时,非const对象调用非const成员函数。

  • 相关阅读:
    ssh中的 Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
    Http中的Get/Post方法
    Node.js(day2)
    使用clipBoard.js进行页面内容复制
    SVG之图形的引用use、剪切clipPath和蒙板mask
    SVG之文本
    SVG之Path
    SVG之颜色、渐变和笔刷的使用
    SVG坐标系统
    SVG入门
  • 原文地址:https://www.cnblogs.com/tito/p/12371255.html
Copyright © 2011-2022 走看看