源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

c++中const的使用详解

  • 时间:2022-08-14 18:00 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:c++中const的使用详解
Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 [b]1、定义常量 [/b](1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。  TYPE const ValueName = value;      const TYPE ValueName = value; (2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.      extend const int ValueName = value; [b]2、指针使用CONST [/b](1)指针本身是常量不可变      (char*) const pContent;      const (char*) pContent; (2)指针所指向的内容是常量不可变      const (char) *pContent;      (char) const *pContent; (3)两者都不可变       const char* const pContent; (4)还有其中区别方法,沿着*号划一条线: 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。 [b]3、函数中使用CONST[/b] [b](1)const修饰函数参数 [/b]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 Class& Var); //引用参数在函数内不可以改变 void function(const TYPE& Var); //引用参数在函数内为常量不可变 [b]2)const 修饰函数返回值 [/b]    const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。     a.const int fun1() //这个其实无意义,因为参数返回本身就是赋值。     b. const int * fun2() //调用时 const int *pValue = fun2();                           //我们可以把fun2()看作成一个变量,即指针内容不可变。     c.int* const fun3()   //调用时 int * const pValue = fun2();                           //我们可以把fun2()看作成一个变量,即指针本身不可变。 [b]4、类相关CONST[/b] [b](1)const修饰成员变量 [/b]const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。     class A     {         …         const int nValue;         //成员常量不能被修改         …         A(int x): nValue(x) { } ; //只能在初始化列表中赋值      } [b](2)const修饰成员函数 [/b]const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。     class A     {         …        void function()const; //常成员函数, 它不改变对象的成员变量.                        //也不能调用类中任何非const成员函数。 } [b](3)const修饰类对象/对象指针/对象引用[/b] •const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。 •const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。 [b]例如: [/b]
[u]复制代码[/u] 代码如下:
class AAA {      void func1();    void func2() const;  }  const AAA aObj;  aObj.func1(); //× aObj.func2(); //正确 const AAA* aObj = new AAA();  aObj-> func1(); //× aObj-> func2(); //正确
5、将Const类型转化为非Const类型的方法 [b]C++提供了四个转换运算符:[/b] •const case <new type> (expression) •static_cast <new_type> (expression) •reinterpret_cast <new_type> (expression) •dynamic_cast <new_type> (expression)   [b]采用const_cast 进行非Const类型转换。  [/b]用法:const_cast <type_id>  (expression) 该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。 •常量指针被转化成非常量指针,并且仍然指向原来的对象; •常量引用被转换成非常量引用,并且仍然指向原来的对象; •常量对象被转换成非常量对象。
[u]复制代码[/u] 代码如下:
const int constant = 21; const int* const_p = &constant; int* modifier = const_cast<int*>(const_p); *modifier = 7;
当然我们可以用下面的传统方式代替:
[u]复制代码[/u] 代码如下:
const int constant = 21; int* modifier = (int*)(&constant);
从前面代码中已经看到,我们不能对constant进行修改,但是我们可以对modifier进行重新赋值。 但是但是,程序世界真的混乱了吗?我们真的通过modifier修改了constatn的值了吗?修改const变量的数据真的是C++去const的目的吗? 如果我们把结果打印出来:
[u]复制代码[/u] 代码如下:
cout << "constant: "<< constant <<endl; cout << "const_p: "<< *const_p <<endl; cout << "modifier: "<< *modifier <<endl; /** constant: 21 const_p: 7 modifier: 7 **/
constant还是保留了它原来的值。 可是它们的确指向了同一个地址呀:
[u]复制代码[/u] 代码如下:
cout << "constant: "<< &constant <<endl; cout << "const_p: "<< const_p <<endl; cout << "modifier: "<< modifier <<endl; /** constant: 0x7fff5fbff72c const_p: 0x7fff5fbff72c modifier: 0x7fff5fbff72c **/
虽然这样可以重新赋值const的值,但是绝对不要对const数据进行重新赋值。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部