Leehm

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1.  修饰一般变量,const int a = 10;  表示此变量不能被修改,简单易懂,不多说

2.  修饰指针,主要是下面三种

     const int *cp1 = &a;       //修饰int,不能修改指针指向的内存的值,即a的值

     int const *cp2 = &a;      //同上

     int *const cp3 = &a;      //修饰*, 指针本身不能修改,即不能改变指针指向a还是b

    助记:看const左边第一位,是什么类型就是修饰什么,左边没有找右边第一个

  int a = 10;
  int b = 20;
  std::cout << "a = " << a << std::endl;
  std::cout << "b = " << b << std::endl;
   
  //1
  const int *cp1 = &a;
  std::cout << "*cp1 = " << *cp1 << std::endl;
  cp1 = &b;     //        可以修改指针本身,即指向a还是b可以改
  //*cp1 = 1111;  //error, 修饰int,不能修改指针指向的内存的值,即a的值
  std::cout << "after cp1=&b,*cp1 = " << *cp1 << std::endl;

  //2  the same as 1
  int const *cp2 = &a;
   std::cout << "*cp2 = " << *cp2 << std::endl;
  cp2 = &b;
  //*cp2 = 2222;  //error
  std::cout << "*after cp2=&b,*cp2 = " << *cp2 << std::endl;

  //3
  int *const cp3 = &a;
  std::cout << "*cp3 = " << *cp3 << std::endl;
  //cp3 = &b;    //error,   修饰*, 指针本身不能修改,即不能改变指向a还是b
  *cp3 = 3333;  //       可以修改指针指向的内存的值,即a的值
  std::cout << "after*cp3=3333,*cp3 = " << *cp3 << std::endl;

  std::cout << "a = " << a << std::endl;
  std::cout << "b = " << b << std::endl;

3.  修饰类成员函数

     const int setValue(const int value) const

     从左到右,1. 返回值不能改

                       2. 参数不能改

                       3. 常函数,函数成员变量不能被修改,如需要更改,请在成员变量前加上mutable

class A
{
public:
  A():m_a(0) ,m_b(0){}
  virtual ~A(){}
 
public:
  const int geta(){return m_a;}  //返回值不能被修改
  int setValue(const int value) const
  {
      //m_a = value; //error 函数后面有const,常函数,不能修改成员变量 
      m_b = value;   //      如果要修改,需要加上mutable修饰成员变量
      //value++;     //error const 修饰函数参数,不能被修改
      return value;
  }

private: int m_a; mutable int m_b; };

 

个人总结:

     实际应用中,一般用const来修饰自定义的复杂的数据结构或者类的指针或者引用,用以进行函数传参或者返回,避免传参时进行数据拷贝或者生成临时对象,影响程序性能,也常建议这么处理,尽量使用const 指针或者引用来处理传参, 尽量最大程度的获得编译器的优化。

      对于一般的基础类型变量本身就是进行值传递时,意义不大。

 

posted on 2019-06-04 13:22  Leehm  阅读(213)  评论(0编辑  收藏  举报