我在项目中使用Const

Posted J-A

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我在项目中使用Const相关的知识,希望对你有一定的参考价值。

记得读Effective c++时,有一个tips,尽可能多的使用const(Use const whenever possible)

我在项目中用的比较多的情况有:

  1. 定义常量对象
  2. 基于范围的 for 循环我一般使用常量引用的方式(不修改元素情况)
  3. 配合const+& 做参数传递 const parameter
  4. const函数 const function
  5. const返回值 const return value
  6. const 修饰指针

1.常量对象定义

#define PI=3.1415926;

const double PI_ = 3.1415926;

2.基于范围的for循环我一般使用常量引用的方式(不修改元素)

std::vector<int> nums{ 1,2,3,4 };

int sum = 0;

for(const auto& num:nums){

	sum += num;

}

3.函数传递时我喜欢用引用(有的人喜欢用指针)

我通过加不加const来标示,

  • 对于不修改的情况下通过const+&的方式

    int calVecSum(const std::vector<int>& nums){
    
    	int sum = 0;
    
    	for (const auto& num : nums) {
    
    		sum += num;
    
    	}
    
    	return sum;
    }
    
  • 通过参数作为返回值时,通过引用

    void calVecSum(const std::vector<int>& nums,int& sumOut){
    
    	for (const auto& num : nums) {
    	
    		 sumOut += num;
    	}
    }
    
    //当然也可以用指针,我比较喜欢用引用
    void calVecSum1(const std::vector<int>& nums, int* sumOut) {
    
    	 for (const auto& num : nums) {
    
    		  *sumOut += num;
    
    	 }
    	 
    }
    
  • const 再传递参数时不和&配合的话,跟不加没区别

    //加不加const的意思是一样的
    
    	void SetAge(int a) {age = a;}    
    
    	void SetAge(const int a) {age = a;}
    

4.const 函数

const funtion means this function will note change any of the member variabes of this class

有点类似c# 的get属性器,增加const后,不修改成员变量数据,也不能调用非const函数,提高程序的健壮性

  • note:const成员函数可以调用静态成员变量及静态成员函数

    class CPoint2D{
    
    public:
    
    	 CPoint2D():x(0),y(0){}
    
    	 static int index;
    
    	 double x;
    
    	 double y;
    
    	 void SetX(double value) { x = value; }
    
    	 double GetX() const {
    
    		 y = 3 ; //错误,修改成员变量
    
    	     SetX(3) ; //错误,调用非const函数
    
    	     index = 1; //ok
    
    	     return x;
    
    	 }
    
    	 double GetY() const { return y; }
    
    };
    

5.const return value

  • 注意下文函数中去掉&后,const就完全没有作用了, because the name is returned by value. what the function returned is copy of name which is a temporary

    class Dog {
    
    public:
    
    	 std::string name;
    
    	 //const return value
    
    	 const std::string& getName() {return name;}
    
    	//注意去掉&
    
    	const std::string getNanme{return name;}
    
    };
    

6.const with pointer

  • if const is on the left of*, data is const

  • if const is on the right of *,pointer is const

    int i = 9;
    
    const int *p1 = &i; //data is const, pointer is not
    
    int* const p2=new int; //pointer is const, data is not
    
    const int* const p3=new int; //data and pointer are both const
    

const 好处

// const has several benefits

// a.) Guards against inadvertent write to the variable, so it can stop the wrong behavior at

// b.) Const is a way of self documenting, tell the reader this value will not be changed

// c.) Enables compiler to do more optimization, make the code tighter & faster

// d.) const means the variable can be put in rom (read-only memory)

待续…

以上是关于我在项目中使用Const的主要内容,如果未能解决你的问题,请参考以下文章

jacript var let const 区别

片段中 ListView 的 setOnItemClickListener

BottomNavigationView 滞后于片段事务

如何在recyclerview不同的项目点击上打开几个不同的片段?

在 Android 中使用片段时处理后按

如何在 Recyclerview Item Click 上打开新片段?