CPP中的CONST总结.doc_第1页
CPP中的CONST总结.doc_第2页
CPP中的CONST总结.doc_第3页
CPP中的CONST总结.doc_第4页
CPP中的CONST总结.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+中const总结对于基本声明1. const int r=100; /标准const变量声明加初始化,因为默认内部连接所以必须被初始化,其作用域为此文件,编译器经过类型检查后直接用100在编译时替换2. extend const int r=100; /将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义3. const int r =1,2,3,4;struct S int a,b;const S s =(1,2),(3.4); /以上两种都是常量集合,编译器会为其分配内存,所以不能在编译期间使用其中的值,例如:int tempr2;这样的编译器会报告不能找到常量表达式对于指针1. const int *r=&x; /声明r为一个指向常量的x的指针,r指向的对象不能被修改,但他可以指向任何地址的常量2. int const *r=&x; /与用法1完全等价,没有任何区别3. int * const r=&x; /声明r为一个常量指针,他指向x,r这个指针的指向不能被修改,但他指向的地址的内容可以修改4. const int * const r=&x; /综合1、3用法,r是一个指向常量的常量型指针对于类型检查可以把一个非const对象赋给一个指向const的指针,因为有时候我们不想从这个指针来修改其对象的值;但是不可以把一个const对象赋值给一个非const指针,因为这样可能会通过这个指针改变指向对象的值,但也存在使这种操作通过的合法化写法,使用类型强制转换可以通过指针改变const对象:const int r=100;int * ptr = const_cast(&r); /C+标准,C语言使用:int * ptr =(int*)&r;对于字符数组如char * name = “china”; 这样的语句,在编译时是能够通过的,但是”china”是常量字符数组,任何想修改他的操作也能通过编译但会引起运行时错误,如果我们想修改字符数组的话就要使用char name = “china”; 这种形式。对于函数1. void Fuction1 ( const int r ); /此处为参数传递const值,意义是变量初值不能被函数改变2. const int Fuction1 (int); /此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字。但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用),对于用户自定义类型,返回值是常量是非常重要的,见下面条款3。3. Class CX; /内部有构造函数,声明如CX(int r =0)CX Fuction1 () return CX(); const CX Fuction2 () return CX(); 如有上面的自定义类CX,和函数Fuction1()和Fuction2(),我们进行如下操作时:Fuction1() = CX(1); /没有问题,可以作为左值调用Fuction2() = CX(1); /编译错误,const返回值禁止作为左值调用。因为左值把返回值作为变量会修改其返回值,const声明禁止这种修改。4. 函数中指针的const传递和返回:int F1 (const char * pstr); /作为传递的时候使用const修饰可以保证不会通过这个指针来修改传递参数的初值,这里在函数内部任何修改*pstr的企图都会引起编译错误。const char * F2 (); /意义是函数返回的指针指向的对象是一个const对象,它必须赋给一个同样是指向const对象的指针。const char * const F3(); /比上面多了一个const,这个const的意义只是在他被用作左值时有效,它表明了这个指针除了指向const对象外,它本身也不能被修改,所以就不能当作左值来处理。5. 函数中引用的const传递:void F1 ( const X& px); /这样的一个const引用传递和最普通的函数按值传递的效果是一模一样的,他禁止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本,然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效。*另外只有引用的const传递可以传递一个临时对象 ,因为临时对象都是const属性,且是不可见的,他短时间存在一个局部域中,所以不能使用指针,只有引用的const传递能够捕捉到这个家伙。对于类1. 首先,对于const的成员变量,只能在构造函数里使用初始化成员列表来初始化,试图在构造函数体内进行初始化const成员变量会引起编译错误。初始化成员列表形如:X: X ( int ir ): r(ir) /假设r是类X的const成员变量2. const成员函数。提到这个概念首先要谈到const对象,正象内置类型能够定义const对象一样(const int r=10;),用户自定义类型也可以定义const对象(const X px(10);),编译器要保证这个对象在其生命周期内不能够被改变。如果你定义了这样的一个const对象,那么对于这个对象的一切非const成员函数的调用,编译器为了保证对象的const特性,都会禁止并在编译期间报错。所以如果你想让你的成员函数能够在const对象上进行操作的话,就要把这个函数声明为const成员函数。假如f( )是类中的成员函数的话,它的声明形如:int f( ) const; /const放在函数的最后,编译器会对这个函数进行检查,在这个函数中的任何试图改变成员变量和调用非const成员函数的操作都被视为非法*类的构造和析构函数都不能是const函数。3. 建立了一个const成员函数,但仍然想用这个函数改变对象内部的数据。这样的一个要求也会经常遇到,尤其是在一个苛刻的面试考官那里。首先我们要弄清楚考官的要求,因为有两种方法可以实现,如果这位考官要求不改变原来类的任何东西,只让你从当前这个const成员函数入手,那么你只有使用前面提到的类型强制转换方法。实例如下:/假如有一个叫做X的类,它有一个int成员变量r,我们需要通过一个const成员函数f( )来对这个r进行+r操作,代码如下void X:f( ) const (const_cast(this) - +r; /通过this指针进行类型强制转换实现另外一种方法就是使用关键字:mutable 。 如果你的成员变量在定义时是这个样子的:mutable int r ;那么它就告诉编译器这个成员变量可以通过const成员函数改变。编译器就不会再理会对他的检查了C+中const用法总结 C+中const用法总结作者JuKevin 1. const修饰普通变量和指针const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。 对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变。 例如: const int nValue; /nValue是const int const nValue; / nValue是const 但是对于指针类型的TYPE,不同的写法会有不同情况,例如: A. const char *pContent; B. char * const pContent; C. char const *pContent; D. const char* const pContent; 对于前三种写法,我们可以换个方式,给其加上括号 A. const (char) *pContent; B. (char*) const pContent; C. (char) const *pContent; 这样就一目了然。根据对于const修饰非指针变量的规则,很明显,A=C. - 对于A,C, const修饰的类型为char的变量*pContent为常量,因此,pContent的内容为常量不可变. - 对于B, 其实还有一种写法: const (char*) pContent; 含义为:const修饰的类型为char*的变量pContent为常量,因此,pContent指针本身为常量不可变. - 对于D, 其实是A和B的混合体,表示指针本身和指针内容两者皆为常量不可变 总结: (1) 指针本身是常量不可变 (char*) const pContent; const (char*) pContent; (2) 指针所指向的内容是常量不可变 const (char) *pContent; (char) const *pContent; (3) 两者都不可变 const char* const pContent; 还有其中区别方法: 沿着*号划一条线, 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量; 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。 2. const修饰函数参数const修饰函数参数是它最广泛的一种用途,它表示函数体中不能修改参数的值(包括参数本身的值或者参数其中包含的值)。它可以很好 void function(const int Var); /传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参) void function(const char* Var); /参数指针所指内容为常量不可变 void function(char* const Var); /参数指针本身为常量不可变(也无意义, 因为char* Var也是形参) 参数为引用,为了增加效率同时防止修改。 修饰引用参数时: void function(const Class& Var);/引用参数在函数内不可以改变 void function(const TYPE& Var); /引用参数在函数内为常量不可变 3. const 修饰函数返回值const修饰函数返回值其实用的并不是很多,它的含义和const修饰普通变量以及指针的含义基本相同。 (1) const int fun1() 这个其实无意义,因为参数返回本身就是赋值。 (2) const int * fun2() 调用时 const int *pValue = fun2(); 我们可以把fun2()看作成一个变量,那么就是我们上面所说的1.(1)的写法,即指针内容不可变。 (3) int* const fun3() 调用时 int * const pValue = fun2(); 我们可以把fun2()看作成一个变量,那么就是我们上面所说的1.(2)的写法,即指针本身不可变。 4. const修饰类对象/对象指针/对象引用const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。 const修饰的对象,该对象的任何非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(); 正确 5. const修饰成员变量const修饰类的成员函数,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。 class A const int nValue; /成员常量不能被修改 A(int x): nValue(x) ; /只能在初始化列表中赋值 6. const修饰成员函数const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。 class A void function()const; /常成员函数, 它不改变对象的成员变量. 也不能调用类中任何非const成员函数。 对于const类对象/指针/引用,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论