Evo. G Tech Team Forum
Welcome to Evo. G Tech Team Forum. We have moved to a new website : www.evogtechteam.com

Thanks you.

by Evo. G Tech Team Management.

神奇的const关键字

View previous topic View next topic Go down

神奇的const关键字

Post by too wei on June 9th 2015, 21:02

在实时编程时,我们常常误改了数据造成了许多的麻烦,这些麻烦往往浪费了我们许多的时间,也造成了不必要的麻烦
如果我们有使用const的习惯,我们就能节省许多时间和精力

const 是一个很神奇的东西,它可以
-禁止为变量(variable)赋值(assignment)
-让指针(pointer)永远指向同一个对象(object)

在 * 的左边,就是const data
在 * 的右边,就是const pointer

const int * a;             //const data
int const * b;            //const data
int * const c;            //const pointer
const int * const d;   //const data and const pointer



const也可以用在iterator

vector vec;
const vector::iterator it =vec.begin(); //const pointer  //put const infront
vector::const_iterator iter = vec.begin(); //const data  //use const_iterator


const还有一个很强大的功能,就是const成员函数
下面有2个成员函数,一个使用const,另外一个不使用const
当对象是const时,就会调用const版本的成员函数
当对象是non-const时,就会调用non-const版本的成员函数

先看看下面的代码

class demo
{
public:
 void print()const      {printf("const version\n");}
 void print()              {printf("non-const version\n");}
};
void main()
{
 demo obj1;
 const demo obj2;
 obj1.print(); //use non-const type
 obj2.print(); //use const type
}



如果你只准备了const版本的成员函数时
不管你使用non-const还是const的对象,都是调用const版本的成员函数

还有另外一种情况就是,当你只准备non-const版本的成员函数
这种时候使用non-const的对象就会调用non-const版本的成员函数
使用const的对象就不能通过编译,也就是出问题了!

这是因为const版本的成员函数保证了不会对数据进行修改,所以无论是const还是non-const的对象,都不会发生问题,因为不会修改数据
如果是non-const版本的成员函数并不保证数据会不会被修改,这对non-const对象没什么问题,但是const对象无法被使用,因为编译器怕数据被修改

所以当成员函数没有修改数据时,毫不犹豫的加上const,这会让你免于许多烦恼


当const和non-const版本的都使用相同的代码,我们可以使用一种方法来避免这种问题
就是让non-const成员函数来调用const成员函数
class test
{
//const版本
 const char& operator [] (const int & p)const  
 {
  return text[p];
 }

 //non-const版本
 char& operator [] (const int  & p)                     //让non-const调用const版本
 {                                                                   //这里用换行把他分成3个部分,比较容易明白
  return const_cast(                     //const_cast解除const
  static_const(*this)              //static_const加上const
  [position]);                                           //调用const版本
 }
};

注意return const_cast(static_const(*this)[position]);里面的括号,这代表了优先次序
这里先把non-const对象加上const,也就是强制性变成const对象
然后调用const版本的
再变回non-const

注意:this指针是返回本身对象的指针,而*this就是返回本身对象


如果在一个const成员函数内想修改成员数据,可以使用mutable
这个是用于结构或类的成员变量,使用这个类型的变量将不被const所影响
struct student
{
 char name[15];
 mutable int age;  // here use the mutable
};
 
int main()
{
 const student s1 =   // here const the struct
 {
  "handsome",
  17
 };
 s1.name = "not handsome"; // ERROR! , because it is const!
 s1.data = 55;   // allow,because it is mutable
 return 0;
}


在声明一个operator 时,把返回类型加上const
const rational operator *(const rational & a , const rational & b);
在弄函数的时候,如果没有修改参数的必要,就加上一个const

我们常常使用pass-by-reference-to-const,就是同时使用引用和const,这种方法效率比较快,也省了很多麻烦
void print(const int & name);


相信const,使用const,享受编程的快感!
const,您唯一的选择!

too wei
Sponsor
Sponsor

Posts : 31
Points : 17731
Reputation : 0
Join date : 2015-04-21
Age : 19
Location : Johor

View user profile

Back to top Go down

View previous topic View next topic Back to top


 
Permissions in this forum:
You cannot reply to topics in this forum