• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      面向?qū)ο蠹夹g(shù)中數(shù)據(jù)訪問方法研究

      2016-04-11 13:37韋慶清左軍崔如春
      電腦知識與技術(shù) 2016年4期
      關(guān)鍵詞:面向?qū)ο?/a>方法

      韋慶清+左軍+崔如春

      摘要:訪問數(shù)據(jù)是面向?qū)ο蟪绦蛟O(shè)計中的重要工作。通過分析面向?qū)ο蠹夹g(shù)中的數(shù)據(jù)訪問方法,提出了直接、間接及文件流三種訪問程序中相關(guān)數(shù)據(jù)的方法,并以實例說明VC++中的引用、指針及輸入/輸出文件流在這三種數(shù)據(jù)訪問方法中的具體應用。

      關(guān)鍵詞:面向?qū)ο?;?shù)據(jù)訪問;方法;VC++

      中圖分類號:TP312 文獻標識碼:A 文章編號:1009-3044(2016)04-0019-04

      Research on Data Access Method Based on Object-oriented Technology

      WEI Qing-qing, ZUO-Jun, CUI Ru-chun

      (School of Mechanics and Information Engineering, Foshan University, Foshan 528000, China)

      Abstract: Data access is an important work in object-oriented programming. Through the analysis of object-oriented technology in VC++ data access methods, puts forward the direct, indirect and document flow three methods of access to relevant data in the program, VC++ are demonstrated by examples of references, Pointers and input/output file stream in the application of these three data access method.

      Key words:Object-Oriented; data access; method; VC++

      面向?qū)ο蠹夹g(shù)是一種以對象為基礎(chǔ),以事件或消息來驅(qū)動對象執(zhí)行處理的程序設(shè)計技術(shù)。它以數(shù)據(jù)為中心而不是以功能為中心來描述系統(tǒng),數(shù)據(jù)相對于功能而言具有更強的穩(wěn)定性。對象是面向?qū)ο蟪绦蛟O(shè)計的核心,而數(shù)據(jù)用于表示對象的靜態(tài)屬性,是對象的狀態(tài)信息。因此,在對數(shù)據(jù)操作過程中,選擇恰當?shù)臄?shù)據(jù)訪問方法對正確、有效地訪問數(shù)據(jù)起到關(guān)鍵性作用,從而為程序設(shè)計的順利完成提供了有力保障。下面主要從直接訪問數(shù)據(jù)、間接訪問數(shù)據(jù)及文件流訪問數(shù)據(jù)這三個方面來分析說明在基于VC++的面向?qū)ο蟪绦蛟O(shè)計中實現(xiàn)數(shù)據(jù)訪問的具體方法。

      1 直接訪問數(shù)據(jù)

      1.1 訪問普通變量

      面向?qū)ο蟮某绦蛟O(shè)計與面向過程的程序設(shè)計一樣,都少不了要定義和使用變量,而變量通常有兩個數(shù)

      據(jù)值有待訪問,一個是其左值,另一個是其右值;要對該變量的左、右值進行訪問可以采用直接訪問的方法。例如,有一C++語句為:int x=5;則該語句的功能作用是定義一個整型變量x,并賦其初始化值為5;變量x定義后,在后面的程序代碼中,就可以直接訪問該x變量;如語句:

      int y=x; //訪問變量x的右值,把x 存儲單元中的數(shù)據(jù)5賦給變量y。

      int *p=&x; //訪問變量x的左值,p指向x存儲單元,把x 存儲單元的地圵賦給指針變量p。

      又如:int x=2,y=8;

      (x>y)?x:y=10; //訪問變量的左值

      int z=(x>y)?x:y; //訪問變量的右值

      1.2 訪問對象

      對于一個實例對象而言,同樣可以采用直接訪問的方法來訪問該對象的左、右值。和普通變量一樣,

      也要遵循“先聲明,后使用”的原則。具體程序代碼說明如下:

      class Base{

      int x;

      public: Base(int i){ x=I;}

      void show(){cout<

      int get(){ return x;}

      };

      int func( const base& obj){

      int y=obj.get(); //訪問對象obj的右值

      Base *p=&obj; //訪問對象obj的左值

      p->show();

      cout<

      }

      void main(){

      Base a(2);

      Func(a);

      }

      顯然,對普通變量和實例對象的直接訪問方法簡單、方便,只需在正確定義聲明變量(對象)之后直接使用該變量名就可以了。

      2 間接訪問數(shù)據(jù)

      一般情況下,對數(shù)據(jù)的訪問使用直接訪問的方法就可以了,但在有些情況下,直接訪問數(shù)據(jù)可能得不到想要的結(jié)果,但如果借助于VC++語言環(huán)境下的引用或指針來實現(xiàn)對數(shù)據(jù)的間接訪問就能起到特別的功效。

      2.1 使用引用訪問數(shù)據(jù)

      1)使用引用訪問變量

      引用(Reference)是C++獨有的特征。引用是某個變量的別名,是另一種訪問變量的方法。建立引用時,要用某個變量對其初始化,于是它就被綁定在那個變量上。對于引用的改動就是對其所綁定的變量的改動[1],在參數(shù)傳遞中,可以實現(xiàn)按址傳遞參數(shù)的作用,從而解決按值傳遞參數(shù)時存在的問題。

      例如,兩個數(shù)據(jù)交換程序代碼說明如下:

      #include

      void swap(int x, int y) {

      int temp ;

      temp = x ;

      x=y ;

      y=temp;

      }

      void main(){

      int i =3, j=8;

      swap( i, j);

      cout<<"i和j的值為: "<

      }

      程序運行結(jié)果是:i和j的值為: 3 8

      原想要執(zhí)行的交換兩變量i和j值的操作沒有實現(xiàn),分析其原因在于該swap()函數(shù)調(diào)用時,實際參數(shù)是按值方式傳遞給形參,在swap()函數(shù)內(nèi)部其實已經(jīng)完成了兩個形參變量數(shù)據(jù)的交換,只是其內(nèi)部數(shù)據(jù)的交換并不影響實參變量i和j的存儲單元中的數(shù)據(jù),它們?nèi)匀皇窃瓉淼闹?和8。而采用引用通過傳址方式來傳遞參數(shù)可以達到目的?,F(xiàn)僅將上面程序中的swap ()函數(shù)的形參修改,其他不改動。

      void swap(int& x, int& y) {

      int temp ;

      temp = x ;

      x=y ;

      y=temp;

      }

      程序運行結(jié)果是:i和j的值為: 8 3

      可見,通過修改swap ()函數(shù)中的形參,把原定義的數(shù)據(jù)傳遞方式改變?yōu)榘匆迷L問數(shù)據(jù)方式就可達到交換兩個實參數(shù)據(jù)的目的。

      2)引用作為函數(shù)返回值

      有些情況下,將引用作為函數(shù)返回值也能起到間接訪問變量左右值的作用。具體程序代碼說明如下:

      #include

      int& add(int x,int y) {

      int t=0;

      t=x+y;

      return t; //返回局部變量t的地址

      }

      void main(){

      int n=2,m=10;

      cout<<(add(n,m)=add(n,m)+10)<

      }

      顯然,當執(zhí)行main()函數(shù)時,語句(1)中對add()函數(shù)的調(diào)用就說明了使用其左右值的情況,即賦值表達式(等號)左邊的add函數(shù)返回值作為左值使用,而右邊的作為右值使用。

      3)引用訪問對象

      引用不僅能訪問普通變量,同樣可以訪問實例對象中的數(shù)據(jù)成員。具體程序代碼說明如下所示:

      #include

      class DATE{

      public: DATE(int yy=0,int mm=0,int dd=0); //構(gòu)造函數(shù)

      void get_date(int &yy,int &mm,int &dd); //取日期到三個實參中

      void print_date(); //以格式(yy.mm.dd)打印日期

      private: int year,month,day;

      };

      DATE::DATE(int yy,int mm,int dd){

      year=yy;

      month=mm;

      day=dd;

      }

      void DATE::get_date(int &yy,int &mm,int &dd){

      yy=year;

      mm=month;

      dd=day;

      }

      void DATE::print_date(){

      cout<

      }

      void main(){

      int x,y,z;

      DATE d1(2015,12,26);//,*p;

      d1.print_date();

      d1.get_date(x,y,z);

      cout<<"x="<

      }

      程序運行結(jié)果如圖1所示:

      可見,選擇引用方式傳遞三個實參x,y,x,對象d1通過調(diào)用get_date()成員函數(shù)成功訪問了對象d1 中的私有數(shù)據(jù)。

      2.2 使用指針訪問數(shù)據(jù)

      指針是地址變量,指針中存儲的并不是所使用的數(shù)據(jù)本身,而是所要使用的數(shù)據(jù)在內(nèi)存中的地址。通過指針變量可以間接地訪問內(nèi)存單元中的數(shù)據(jù)[2]。

      1)指針訪問變量

      利用指針傳遞參數(shù),和引用一樣同樣可以解決按值傳遞參數(shù)時存在的問題?,F(xiàn)再將上面程序中的swap ()函數(shù)中的形參修改為指針,其他不改動。

      void swap(int *p1, int *p2) {

      int temp ;

      temp =*p1 ;

      *p1=*p2 ;

      *p2=temp;

      }

      在主函數(shù)main()中調(diào)用函數(shù)swap(&i, &j); 程序運行結(jié)果是:i和j的值為: 8 3

      通過修改swap ()函數(shù)中的形參,借助于定義兩個指針變量來完成數(shù)據(jù)傳遞,實際上是通過指針變量間接訪問了兩個實參變量a、b,把這兩個實參變量的內(nèi)存單元中的值交換了。顯然,通過指針的間接訪問,達到了交換數(shù)據(jù)的目的。

      2)指針訪問函數(shù)

      在函數(shù)的定義及調(diào)用過程中,利用指針也可以間接地訪問函數(shù)及其數(shù)據(jù)。具體程序代碼說明如下:

      #include

      //統(tǒng)計字符串的長度

      int Len(const char* string) { //函數(shù)名就是函數(shù)指針

      const char* p=string;

      for(int i=0;*p!='\0';i++) p++;

      return i;

      }

      int Caller(const char* string,int (*f_p)(const char* )) { //函數(shù)指針f_p作為參數(shù)

      return((*f_p)(string)); //使用函數(shù)指針執(zhí)行函數(shù)調(diào)用

      }

      void main(){

      char *s="how are you!"; //定義指向字符串常量的指針

      cout<< "字符串的長度是"<

      }

      程序運行結(jié)果是:字符串的長度是12

      由此說明,通過函數(shù)指針可以便捷地訪問函數(shù)中的數(shù)據(jù)。

      3)指針訪問對象

      在C++對象模型中,只要創(chuàng)建每一個對象實例,系統(tǒng)都會為其分配一隱含指針this,通過該指針可以方便地訪問對象中的數(shù)據(jù)。此外,用戶還可以根據(jù)需要自定義一個類類型的指針變量,通過該指針來訪問其實例對象。對象的指針就是該對象空間的起始地址,從而達到間接訪問對象數(shù)據(jù)的目的[3]。

      使用對象指針比直接使用對象更加靈活、方便。所以應盡量使用對象指針代替對象,特別是作為函數(shù)參數(shù)或返回值時,使用對象指針比使用對象本身具有更清晰的語義[4]。具體程序代碼說明如下:

      #include

      class COMPLEX{ //定義復數(shù)類COMPLEX的類界面

      public: COMPLEX(double r = 0, double i = 0); //構(gòu)造函數(shù)

      void print(); //顯示復數(shù)

      COMPLEX add(const COMPLEX& other); //與另一個復數(shù)相加 protected: double real, image; //定義復數(shù)的實部與虛部

      };

      COMPLEX::COMPLEX(double r, double i) {

      real = r;

      image = i;

      }

      void COMPLEX::print(){

      cout << real;

      if (image > 0) cout << "+" << image << "i";

      else if (image < 0) cout << image << "i";

      cout << "\n";

      }

      COMPLEX COMPLEX::add(const COMPLEX& other){

      real = real + other.real;

      image = image + other.image;

      return *this; //返回對象本身(即復數(shù)的實部和虛部)

      }

      int main(){

      COMPLEX c1(1,2); //定義一個值為1 + 2i的復數(shù)c1

      COMPLEX c2(2); //定義一個實部為2、虛部為缺省值0的復數(shù)c2

      COMPLEX *p; //同類指針p

      p=&c1; //指針指向本類對象c1

      p->print(); //顯示對象c1

      c2.add(c1); //將c2加上c1

      c2.print(); //顯示運算后c2的值

      return 0;

      }

      程序運行結(jié)果是:1+2i

      3+2i

      可見,在程序中靈活利用對象指針可以方便地訪問實例對象及其數(shù)據(jù)。

      3 使用文件流訪問數(shù)據(jù)

      為處理文件的輸入/輸出,VC++分別從istream類、ostream類和iostream類公有派生出了ifstream類、ofstream類和fstream類3個面向文件的流類,它們都在fstream.h文件中定義[5]。因此,文件流類在流與文件之間建立了連接,提供了以輸入文件流(ifstream類)、輸出文件流(ofstream類)及輸入/輸出文件流(fstream類)這三種文件流方式來實現(xiàn)對文件數(shù)據(jù)的訪問。

      3.1 寫(輸出)數(shù)據(jù)

      利用輸出文件流(ofstream)可將程序中的數(shù)據(jù)寫入到磁盤文件中。具體實現(xiàn)用以下代碼說明:把一個整數(shù)、一個浮點數(shù)和一個字符串寫到文本文件li1.txt中。

      #include "fstream.h"

      int main(){

      ofstream out(“l(fā)i1.txt”, ios::trunc); //創(chuàng)建輸出文件流對象并打開文件li1.txt

      if(!out) {

      cout << "can not open the file .";

      return;

      } //向out文件流(li1.txt文件)寫入數(shù)據(jù)

      out << 256 << “” << 198.69 << “” << “ C++ Language\n”;

      out.close();

      return 0;

      }

      程序運行后,將在當前目錄下的li1.txt中寫入了256、198.69和C++ Language三個數(shù)據(jù)。

      3.2 讀(輸入)數(shù)據(jù)

      利用輸入文件流(ifstream)可將磁盤文件中的數(shù)據(jù)讀取到程序中。具體實現(xiàn)用以下程序代碼說明:把上述文本文件li1.txt中所存放有一個整數(shù)、一個浮點數(shù)和一個字符串讀取到程序中。

      #include

      int main(){

      int x;

      float y;

      char str[30];

      ifstream in("li1.txt"); //創(chuàng)建輸入文件流對象并打開文件li1.txt

      in>>x>>y>>str; //從in文件流(li1.txt文件)中讀取數(shù)據(jù)

      cout<

      in.close();

      return 0;

      }

      3.3 讀(輸入)/寫(輸出)數(shù)據(jù)

      利用輸入/輸出文件流(fstream)可對數(shù)據(jù)進行讀(輸入)、寫(輸出)操作。具體實現(xiàn)用以下程序代碼說明。

      #include

      #include

      #include

      using namespace std;

      class Student{

      int number;

      string name;

      int mark;

      public: void inputinfo();

      int get_number(){ return number;}

      string get_name(){ return name;}

      int get_mark(){ return mark;}

      };

      void Student:: inputinfo(){

      cout<<"請輸入學生信息:學號、姓名和成績: "<

      cin>>number>>name>>mark;

      }

      int main(){

      const int NUM=2;

      Student stu[NUM];

      fstream out("stu.txt",ios::out); //定義輸出文件流對象并打開文件,默認只寫

      for(int i=0;i

      stu[i].inputinfo();

      out<

      out<

      out<

      }

      out.close();

      fstream in("stu.txt",ios::in); //定義輸入文件流對象并打開文件,默認只讀

      int number;

      string name;

      int mark;

      for(int j=0;j

      in>>number>>name>>mark; //將文件數(shù)據(jù)讀出并顯示到屏幕

      cout<<"第"<

      cout<<"學號:"<

      }

      in.close();

      return 0;

      }

      程序運行結(jié)果如圖2所示:

      由此可見,靈活利用輸入/輸出文件流(fstream)可方便地對磁盤文件數(shù)據(jù)進行讀、寫操作。

      4 結(jié)束語

      綜上所述,面向?qū)ο蟪绦蛟O(shè)計中少不了對數(shù)據(jù)的訪問,如何靈活、便捷地實現(xiàn)對程序中相關(guān)數(shù)據(jù)的有效訪問將會直接影響到程序的運行效率和應用性能。因此,合理使用直接、間接

      及文件流這三種數(shù)據(jù)訪問方法,借助VC++中的引用、指針及輸入/輸出文件流這三種數(shù)據(jù)訪問技術(shù)可以很好解決面向?qū)ο蟪绦蛟O(shè)計中對相關(guān)數(shù)據(jù)訪問的問題,為數(shù)據(jù)的正確使用提供了保障,從而確保了程序的正常運行。

      參考文獻:

      [1] 甘玲, 邱勁. 面向?qū)ο蠹夹g(shù)與Visual C++[M]. 北京: 清華大學出版社, 2006.

      [2] 潘嘉杰. 易學C++[M]. 北京: 人民郵電出版社, 2008.

      [3] 譚浩強. C++程序設(shè)計[M]. 北京: 清華大學出版社, 2008.

      [4] 李師賢, 李文軍, 周曉聰, 等. 面向?qū)ο蟪绦蛟O(shè)計基礎(chǔ)[M]. 2版.北京: 高等教育出版社, 2011.

      [5] 張海藩, 牟永敏. 面向?qū)ο蟪绦蛟O(shè)計實用教程[M]. 2版.北京: 清華大學出版社, 2007.

      猜你喜歡
      面向?qū)ο?/a>方法
      學習方法
      面向?qū)ο蟮挠嬎銠C網(wǎng)絡設(shè)計軟件系統(tǒng)的開發(fā)
      面向?qū)ο蟮臄?shù)據(jù)交換協(xié)議研究與應用
      可能是方法不對
      用對方法才能瘦
      基于面向?qū)ο蟮腛ffice評測系統(tǒng)的分析
      峰叢洼地農(nóng)作物面向?qū)ο笮畔⑻崛∫?guī)則集
      四大方法 教你不再“坐以待病”!
      賺錢方法
      捕魚
      望城县| 夹江县| 东台市| 土默特右旗| 盐津县| 慈利县| 三门县| 公安县| 穆棱市| 林芝县| 鄢陵县| 永宁县| 南丰县| 南开区| 孝昌县| 西藏| 赣州市| 吴忠市| 自贡市| 高邑县| 宣城市| 班戈县| 清水河县| 瑞昌市| 年辖:市辖区| 永兴县| 思南县| 城市| 大宁县| 阿荣旗| 江都市| 宿松县| 汝州市| 平昌县| 美姑县| 泸水县| 广南县| 波密县| 永胜县| 宁远县| 卢氏县|