关于C++ const 的全面总结(这个链接的字简直不能看,但是内容是好的)
一、ORBSLAM2中const的例子
// 函数中的变量
const int nTimes = vTimestamps.size();
const uchar* center = &image.at<uchar>(cvRound(pt.y), cvRound(pt.x));
const float &fx = pKF->fx;
for(vector<size_t>::const_iterator vit=vIndices.begin(), vend=vIndices.end(); vit!=vend; vit++){...}
// 强制类型转换
const VertexSE3Expmap* v1 = static_cast<const VertexSE3Expmap*>(_vertices[0]);
// 类成员变量中的const
const ORBVocabulary* mpVoc; //初始化类表初始化
static const int TH_LOW; // 类外初始化
//类成员函数(参数和函数):
Vector3d cam_project(const Vector3d & trans_xyz) const;
virtual void oplusImpl(const double* update_);
void AddTextToImage(const string &s, cv::Mat &im, const int r, const int g, const int b);
二、const的使用的一些讲解
1、定义常量
(1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。
TYPE const ValueName = value;
const TYPE ValueName = value;
(2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.
extend const int ValueName = value;
2、指针使用const
(1)指针本身是常量不可变
char* const pContent;
(2)指针所指向的内容是常量不可变
const char *pContent;
(3)两者都不可变
const char* const pContent;
3、函数中使用const
(1)const修饰函数参数
a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)
void function(const int Var);
b.参数指针所指内容为常量不可变
void function(const char* Var);
c.参数指针本身为常量不可变(也无意义,因为char* Var也是形参)
void function(char* const Var);
d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:
void function(const TYPE& Var); //引用参数在函数内为常量不可变
这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本, 然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效.
(2)const 修饰函数返回值
const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。
const int fun1() //这个其实无意义,因为参数返回本身就是赋值。
const int * fun2() //调用时 const int *pValue = fun2();
//我们可以把fun2()看作成一个变量,即指针内容不可变。
int* const fun3() //调用时 int * const pValue = fun2();
//我们可以把fun2()看作成一个变量,即指针本身不可变。
(3)修饰函数函数
三、总结const
1.要大胆的使用const,这将给你带来无尽的益处。
2.要避免最一般的赋值操作错误,如将const变量赋值,const 只能初始化;
3.const在成员函数中的三种用法(参数、返回值、函数)要很好的使用:
(1)在参数中使用const应该使用引用或指针,而不是一般的对象实例;
(2)不要轻易的将函数的返回值类型定为const(除了重载操作符外一般不要将返回值类型定为对某个对象的const引用);
(3)任何不会修改数据成员的函数都应该声明为const 类型。只能调用const成员函数,其他函数不可以。
4.类内部的常量限制
使用这种类内部的初始化语法的时候,常量必须是被一个常量表达式
初始化的整型或枚举类型,而且必须是static和const形式。
如何初始化类内部的常量:一种方法就是static 和 const 并用,在外部初始化,例如:
class A { public: A() {} private: static const int i; file://注意必须是静态的! };
const int A::i=3;
另一个很常见的方法就是初始化列表:
class A { public: A(int
i=0):test(i) {} private: const int i; }
5.const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。只能调用const成员函数。
例如:
class AAA
{
void func1();
void func2() const;
}
const AAA aObj;
aObj.func1(); ×
aObj.func2(); 正确
const AAA* aObj = new AAA();
aObj-> func1(); ×
aObj-> func2(); 正确
网友评论