神奇的const关键字
Page 1 of 1
神奇的const关键字
在实时编程时,我们常常误改了数据造成了许多的麻烦,这些麻烦往往浪费了我们许多的时间,也造成了不必要的麻烦
如果我们有使用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,您唯一的选择!
如果我们有使用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
const vector
vector
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
static_const
[position]); //调用const版本
}
};
注意return const_cast
这里先把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
- Posts : 31
Points : 66331
Reputation : 0
Join date : 2015-04-21
Age : 25
Location : Johor
Page 1 of 1
Permissions in this forum:
You cannot reply to topics in this forum
|
|