以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- 浅谈const(转) (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=53143) |
-- 作者:DMman -- 发布时间:9/27/2007 12:50:00 PM -- 浅谈const(转) 变量用const修饰,其值不得被改变。任何改变此变量的代码都会产生编译错误。Const加在数据类型前后均可。 例如: void main(void) { const int i = 10; //i,j都用作常变量 int const j = 20; i = 15; //错误,常变量不能改变 j = 25; //错误,常变量不能改变 } Const跟指针一起使用的时候有两种方法。 int main(void) { int i = 10; int *const j = &i; //常指针, 指向int型变量 (*j)++; //可以改变变量的内容 j++; //错误,不能改变常指针指向的内存地址 } int main(void) { int i = 20; const int *j = &i; //指针,指向int型常量 //也可以写成int const *j = &i; j++; //指针指向的内存地址可变 (*j)++; //错误,不能改变内存内容 } 看完上面的两个例子,是不是糊涂了?告诉你一个诀窍,在第一个例子中,const用来修饰指针j,j不可变(也就是指向int变量的常指针);第二个例子中,const用来修饰*j,*j不可变(也就是指向int常量的指针)。 int main(void) { int i = 10; const int *const j = &i; //指向int常量的常指针 j++; //错误,不能改变指针指向的地址 (*j)++; //错误,不能改变常量的值 } 引用实际上就是变量的别名,这里有几条规则: 声明变量时必须初始化 一经初始化,引用不能在指向其它变量。 任何对引用的改变都将改变原变量。 引用和变量本身指向同一内存地址。 void main(void) { int i = 10; //i和j是int型变量 int j = 20; int &r = i; //r 是变量i的引用 int &s; //错误,声明引用时必须初始化 i = 15; //i 和 r 都等于15 i++; //i 和 r都等于16 r = 18; //i 和r 都等于18 printf("Address of i=%u, Address of r=%u",&i,&r); //内存地址相同 r = j; //i 和 r都等于20,但r不是j的引用 r++; //i 和 r 都等于21, j 仍等于20 } 例如: void main(void) { int i = 10; int j = 100; const int &r = i; int const &s = j; r = 20; //错,不能改变内容 s = 50; //错,不能改变内容 i = 15; // i和r 都等于15 j = 25; // j和s 都等于25 } 声明成员函数时,末尾加const修饰,表示在成员函数内不得改变该对象的任何数据。这种模式常被用来表示对象数据只读的访问模式。例如: class MyClass { char *str ="Hello, World"; MyClass() { //void constructor } { //destructor } { if(pos >= 12) return 0; *str = 'M'; //错误,不得修改该对象 return str[pos]; //return the value at position pos } } 重载函数的时候也可以使用const,考虑下面的代码: class MyClass { char *str ="Hello, World"; MyClass() { //void constructor } { //destructor } { if(pos >= 12) return 0; return str[pos]; //return the value at position pos } { if(pos >= 12) return NULL; return str[pos]; } } { char *str ="Hello, World"; MyClass() { //void constructor } { //destructor } { if(pos >= 12) return NULL; return str[pos]; } } { MyClass m; char ch = m[0]; //ch 等于 'H' m[0] = 'M'; //m的成员str变成:Mello, World } C/C++中,数据传递给函数的方式默认的是值传递,也就是说当参数传递给函数时会产生一个该参数的拷贝,这样该函数内任何对该参数的改变都不会扩展到此函数以外。每次调用该函数都会产生一个拷贝,效率不高,尤其是函数调用的次数很高的时候。 例如: { public: int x; char ValueAt(int pos) const //const method is an accessor method { if(pos >= 12) return 0; return str[pos]; //return the value at position pos } MyClass() { //void constructor } ~MyClass() { //destructor } MyFunc(int y) //值传递 { y = 20; x = y; //x 和 y 都等于 20. } } { MyClass m; int z = 10; m.MyFunc(z); printf("z=%d, MyClass.x=%d",z,m.x); //z 不变, x 等于20. } class MyClass { public: int x; MyClass() { //void constructor } ~MyClass() { //destructor } int MyFunc(const int& y) //引用传递, 没有任何拷贝 { y =20; //错误,不能修改常变量 x = y } } { MyClass m; int z = 10; m.MyFunc(z); printf("z=%d, MyClass.x=%d",z,m.x); //z不变, x等于10. }
|
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
46.875ms |