常對象/常函數/常數據

#include "stdafx.h"
#include "iostream.h"

class circle
{
private:
  int x,y,r;
public:
  void print();
        void set()const;
  circle(int a,int b,int c);

};

void circle::print()
{
  cout<<"圓心:("<<x<<","<<y<<")"<<endl;
  cout<<"半徑:"<<r<<endl;
}
void circle::set()const
{
     x=20;y=30;r=40;//錯,因爲常函數裏面不能對數據成員做出修改
}
circle::circle(int a,int b,int c)
{
  x=a;
  y=b;
  r=c;
}


int main(int argc, char* argv[])
{
  circle p1(0,0,1);
  p1.print();
        
  const circle p2(0,0,2);
  p2.print();//常對象不能調用非常函數,即使這個函數並不對數據成員做出改變
  //記住,常對象只能調用常函數,但是非常對象是可以調用常函數的

  return 0;
}
以上這個函數清楚地說明了如下事實
1》常對象只能調用常函數,常函數裏面不能對數據成員做出更改,否則編譯出錯
2》非常對象可以調用常函數

可是,如果是常數據呢?
下面這個例子將給出很好的解釋
#include "stdafx.h"
#include "iostream.h"

class circle
{
private:
  int x,y,r;
  const int z;
public:
  void print();
  void circle::print()const;
  circle(int a,int b,int c);
  circle(int a,int b,int c,int d);//函數聲明中初始化列表不用帶
};

void circle::print()
{
  cout<<"圓心:("<<x<<","<<y<<")"<<endl;
  cout<<"半徑:"<<r<<endl;
}
void circle::print()const//重載了一個常量print函數
{
  cout<<"圓心:("<<x<<","<<y<<")"<<endl;
  cout<<"半徑:"<<r<<endl;
  cout<<"常量數據成員爲:"<<z<<endl;
}
// circle::circle(int a,int b,int c)//錯,會提示常量成員z沒有初始化
// {
//    x=a;
//    y=b;
//    r=c;
// }
circle::circle(int a,int b,int c,int d):z(d)
{
  x=a;
  y=b;
  r=c;
}

int main(int argc, char* argv[])
{
  circle p1(0,0,1,3);
  p1.print();
        
  const circle p2(0,0,2,3);
  p2.print();//因爲這裏重載了一個常函數print
  
  return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章