WEB开发网
开发学院软件开发VC const传奇 阅读

const传奇

 2007-03-16 21:56:40 来源:WEB开发网   
核心提示: class MyClass{char *str ="Hello, World";MyClass(){//void constructor}~MyClass(){//destructor}char& operator[](int pos)//通过返回引用可用来更改内存内容
class MyClass
{
  char *str ="Hello, World";
  MyClass()
  {
    //void constructor
  }
  
  ~MyClass()
  {
    //destructor
  }
  char& operator[](int pos)    //通过返回引用可用来更改内存内容
  {
    if(pos >= 12)
        return NULL;
    return str[pos];
  }
}
void main(void)
{
  MyClass m;
  char ch = m[0];    //ch 等于 ''H''
  m[0] = ''M'';    //m的成员str变成:Mello, World
}
Const的担心

C/C++中,数据传递给函数的方式默认的是值传递,也就是说当参数传递给函数时会产生一个该参数的拷贝,这样该函数内任何对该参数的改变都不会扩展到此函数以外。每次调用该函数都会产生一个拷贝,效率不高,尤其是函数调用的次数很高的时候。

例如:

class MyClass
{
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.
  }
}
void main(void)
{
  MyClass m;
  int z = 10;
  m.MyFunc(z);
  printf("z=%d, MyClass.x=%d",z,m.x);  //z 不变, x 等于20.
}

通过上面的例子可以看出,z没有发生变化,因为MyFunc()操作的是z的拷贝。为了提高效率,我们可以在传递参数的时候,不采用值传递的方式,而采用引用传递。这样传递给函数的是该参数的引用,而不再是该参数的拷贝。然而问题是如果在函数内部改变了参数,这种改变会扩展到函数的外部,有可能会导致错误。在参数前加const修饰保证该参数在函数内部不会被改变。class MyClass
{
public:
  int x;
  MyClass()
  {
    //void constructor
  }
  ~MyClass()
  {
    //destructor
  }
  int MyFunc(const int& y)  //引用传递, 没有任何拷贝
  {
    y =20;  //错误,不能修改常变量
    x = y  
  }
}
void main(void)
{
  MyClass m;
  int z = 10;
  m.MyFunc(z);
  printf("z=%d, MyClass.x=%d",z,m.x);  //z不变, x等于10.
}

如此,const通过这种简单安全机制使你写不出那种说不定是什么时候就会掉过头来咬你一口的代码。你应该尽可能的使用const引用,通过声明你的函数参数为常变量(任何可能的地方)或者定义那种const method,你就可以非常有效确立这样一种概念:本成员函数不会改变任何函数参数,或者不会改变任何该对象的数据。别的程序员在使用你提供的成员函数的时候,不会担心他们的数据被改得一塌糊涂。

上一页  1 2 3 4 

Tags:const 传奇

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接