我們經(jīng)常會看到一個類中可能會出現(xiàn)另一個類的對象作為它的數(shù)據(jù)成員,既然是對象,,那么就會涉及到這個對象成員要初始化的問題。而程序中各種數(shù)據(jù)的共享,在一定程度上破環(huán)了數(shù)據(jù)的安全性,。C++中有什么方法可以保證數(shù)據(jù)共享又防止數(shù)據(jù)改動。另外除以上兩個問題,,我還將說說C++的多文件程序,。
1.我們在創(chuàng)建類的對象時,如果這個類具有內(nèi)嵌的對象,,那么該對象成員也將被自動創(chuàng)建,。所以創(chuàng)建對象時既要對本類的基本數(shù)據(jù)成員初始化,又要對內(nèi)嵌的對象初始化,。具體怎么做呢,,我還是用Employee(雇員)和Salary(薪水)兩個類來舉個實例:
1 #include "stdafx.h" 2 #include<string> 3 #include<iostream> 4 5 class Employee 6 { 7 private: 8 std::string id; 9 std::string name; 10 public: 11 Employee(std::string id,std::string name); 12 ~Employee(); 13 void showEmployee(); 14 }; 15 16 Employee::Employee(std::string id,std::string name):id(id),name(name) 17 { 18 std::cout<<"構造對象employee"<<std::endl; 19 } 20 21 Employee::~Employee() 22 { 23 std::cout<<"釋放對象employee內(nèi)存空間"<<std::endl; 24 } 25 26 void Employee::showEmployee() 27 { 28 std::cout<<"編號:"<<id<<std::endl; 29 std::cout<<"姓名:"<<name<<std::endl; 30 } 31 32 33 class Salary 34 { 35 private: 36 Employee employee; //雇員 37 double wage;//工資 38 double bonus;//獎金 39 double commission;//提成 40 double allowance;//津貼 41 double subsidy;//補貼 42 public: 43 Salary(double wage,double bonus,double commission,double allowance,double subsidy,std::string id,std::string name); 44 ~Salary(); 45 void showSalary(); 46 }; 47 48 Salary::Salary(double wage,double bonus,double commission,double allowance,double subsidy,std::string id,std::string name):wage(wage),bonus(bonus),commission(commission),allowance(allowance),subsidy(subsidy),employee(id,name)//初始化對象成員employee 49 { 50 std::cout<<"構造對象salary"<<std::endl; 51 } 52 53 Salary::~Salary() 54 { 55 std::cout<<"釋放對象salary內(nèi)存空間"<<std::endl; 56 } 57 58 void Salary::showSalary() 59 { 60 employee.showEmployee();//顯示雇員信息 61 std::cout<<"薪水:"<<std::endl; 62 std::cout<<" 工資:"<<wage<<std::endl; 63 std::cout<<" 獎金:"<<bonus<<std::endl; 64 std::cout<<" 提成:"<<commission<<std::endl; 65 std::cout<<" 補貼:"<<subsidy<<std::endl; 66 std::cout<<" 津貼:"<<allowance<<std::endl; 67 } 68 69 70 int main() 71 { 72 { 73 Salary salary(3000,3000,0,200,100,"001","aaa"); 74 salary.showSalary(); 75 } 76 77 return0; 78 }
結果:
從初始化成員對象的代碼中可以看到其實和之前所說的成員初始化表對數(shù)據(jù)成員初始化的形式是一樣的??吹絤ain函數(shù)體里的實現(xiàn)部分,,可能有人會問那個大括號是否畫蛇添足了。如果單單是從程序運行的流程考慮,,的確沒什么必要,。而我特意加上這個大括號是為了說明在系統(tǒng)編譯運行時它的順序是怎么樣的,從顯示的結果來看,,是先調(diào)用了Employee()的構造函數(shù),,在調(diào)用自己(Salary())的構造函數(shù),而在調(diào)用各自的析構函數(shù)時則剛好相反,。也許有人會問,,那如果Salary里的對象成員不只一個,那么這些對象成員的構造函數(shù)調(diào)用的順序是怎么樣的,?其實系統(tǒng)編譯運行時對對象成員的構造函數(shù)調(diào)用的順序是根據(jù)其在類聲明中的順序來依次調(diào)用,,而釋放對象空間(析構函數(shù))的過程則剛好相反;
2.C++的常類型的引入,就是為了既保證數(shù)據(jù)共享又防止數(shù)據(jù)被改動,。在面向?qū)ο罄锍n愋椭饕谐ο?、常?shù)據(jù)成員以及常成員函數(shù),。(1)常對象的形式有:類名 const 對象名[參數(shù)表]或const 類名 對象名[參數(shù)表],,常對象中的數(shù)據(jù)成員值在對象的整個對象的生存期內(nèi)不能被改變,而且常對象不能調(diào)用普通成員函數(shù),,只能調(diào)用常成員函數(shù),。(2)常數(shù)據(jù)成員的形式其實和C++對C語言的非面向?qū)ο筇匦詳U充(1)所講到過的常量是一樣,但要注意的是類里的常數(shù)據(jù)成員只能通過初始化列表對其進行初始化,,其他函數(shù)都不能對其賦值;(3)常成員函數(shù)的形式:類型 函數(shù)名(參數(shù)表) const,,const是函數(shù)類型的組成部分,,所以在聲明函數(shù)和定義函數(shù)時都要加關鍵字const;同樣我們以Employee(雇員)類為例:
1 #include "stdafx.h" 2 #include<string> 3 #include<iostream> 4 5 class Employee 6 { 7 private: 8 const std::string id;//常數(shù)據(jù)成員 9 const std::string name;//常數(shù)據(jù)成員 10 public: 11 Employee(std::string id,std::string name); 12 ~Employee(); 13 void showEmployee();//普通成員函數(shù) 14 void showEmployee() const;//常成員函數(shù) 15 }; 16 17 Employee::Employee(std::string id,std::string name):id(id),name(name) 18 { 19 //std::cout<<"構造對象employee"<<std::endl; 20 } 21 22 Employee::~Employee() 23 { 24 //std::cout<<"釋放對象employee內(nèi)存空間"<<std::endl; 25 } 26 27 void Employee::showEmployee() 28 { 29 std::cout<<"普通成員函數(shù):"<<std::endl; 30 std::cout<<"編號:"<<id<<std::endl; 31 std::cout<<"姓名:"<<name<<std::endl; 32 } 33 34 void Employee::showEmployee() const 35 { 36 std::cout<<"常成員函數(shù):"<<std::endl; 37 std::cout<<"編號:"<<id<<std::endl; 38 std::cout<<"姓名:"<<name<<std::endl; 39 } 40 41 int main() 42 { 43 Employee employee("001","aa"); 44 employee.showEmployee(); 45 46 std::cout<<"********************************"<<std::endl; 47 48 Employee const const_employee("002","bb");//常對象 49 const_employee.showEmployee(); 50 51 return0; 52 }
結果:
從上述示例代碼中,我可以看到兩個同名函數(shù)void showEmployee(),,一個是普通成員函數(shù),,一個是常成員函數(shù),它們是重載的,,由此說明const可以被用于對重載函數(shù)的區(qū)分;
3.C++的源程序基本上由3個部分組成:類的聲明部分,、類的實現(xiàn)部分和類的使用部分,針對3個部分,,C++中對應分為3個文件:類聲明文件 (*.h文件),、類的實現(xiàn)文件(*.cpp)和類的使用文件(*.cpp,主函數(shù)main文件)。那么為什么C++中的要使用多文件,,一個*.cpp類的使用文件就可解決的問題,,為何那么麻煩要分三步走呢?主要有以下幾個方面:(1)類的實現(xiàn)文件通常會比較大,,將類的聲明和實現(xiàn)放在一起,,不利于程序的閱讀、管理和維護,。我們通常說接口應該和實現(xiàn)的部分分離,,這樣可以更易于修改程序。(2)把類成員函數(shù)的實現(xiàn)放在聲明文件中和單獨放實現(xiàn)文件里,,在編譯時是不一樣的,。前者是作為類的內(nèi)聯(lián)函數(shù)來處理的。(3)對于軟件的廠商來說,,它只需向用戶提供程序公開的接口,,而不用公開程序源代碼。從這一點來看,,我覺得C++在面向?qū)ο蠓矫姹菴#更加明確,,清晰。
4.最后還是一樣,,我將用一個示例來總結一下今天所講的內(nèi)容,,同時將把程序按照C++多文件的原則分成3個文件來實現(xiàn)(開發(fā)工具:vs2010):
1.聲明文件*.h:
employee.h(雇員類的聲明文件)
View Code
1 #include<string> 2 #include<iostream> 3 4 class Employee 5 { 6 private: 7 const std::string id;//常數(shù)據(jù)成員 8 const std::string name;//常數(shù)據(jù)成員 9 public: 10 Employee(std::string id,std::string name); 11 ~Employee(); 12 void showEmployee();//普通成員函數(shù) 13 void showEmployee() const;//常成員函數(shù) 14 };
salary.h(薪水類的聲明文件)
View Code
1 #include "employee.h" 2 3 class Salary 4 { 5 private: 6 const Employee employee; //雇員 7 constdouble wage;//工資(常數(shù)據(jù)成員) 8 double bonus;//獎金 9 double commission;//提成 10 double allowance;//津貼 11 double subsidy;//補貼 12 public: 13 Salary(double wage,double bonus,double commission,double allowance,double subsidy,std::string id,std::string name); 14 ~Salary(); 15 void showSalary(); 16 };
2.實現(xiàn)文件*.cpp:
employee.cpp(雇員類的實現(xiàn)文件)
View Code
1 #include "stdafx.h" 2 #include<iostream> 3 4 #include "employee.h" 5 6 Employee::Employee(std::string id,std::string name):id(id),name(name) 7 { 8 std::cout<<"構造對象employee"<<std::endl; 9 } 10 11 Employee::~Employee() 12 { 13 std::cout<<"釋放對象employee內(nèi)存空間"<<std::endl; 14 } 15 16 void Employee::showEmployee() 17 { 18 std::cout<<"普通成員函數(shù):"<<std::endl; 19 std::cout<<"編號:"<<id<<std::endl; 20 std::cout<<"姓名:"<<name<<std::endl; 21 } 22 23 void Employee::showEmployee() const 24 { 25 std::cout<<"常成員函數(shù):"<<std::endl; 26 std::cout<<"編號:"<<id<<std::endl; 27 std::cout<<"姓名:"<<name<<std::endl; 28 }
salary.cpp(薪水類的實現(xiàn)文件)
View Code
1 #include "stdafx.h" 2 #include<iostream> 3 4 #include "salary.h" 5 6 Salary::Salary(double wage,double bonus,double commission,double allowance,double subsidy,std::string id,std::string name):wage(wage),bonus(bonus),commission(commission),allowance(allowance),subsidy(subsidy),employee(id,name) 7 { 8 std::cout<<"構造對象salary"<<std::endl; 9 } 10 11 Salary::~Salary() 12 { 13 std::cout<<"釋放對象salary內(nèi)存空間"<<std::endl; 14 } 15 16 void Salary::showSalary() 17 { 18 employee.showEmployee();//顯示雇員信息 19 std::cout<<"薪水:"<<std::endl; 20 std::cout<<" 工資:"<<wage<<std::endl; 21 std::cout<<" 獎金:"<<bonus<<std::endl; 22 std::cout<<" 提成:"<<commission<<std::endl; 23 std::cout<<" 補貼:"<<subsidy<<std::endl; 24 std::cout<<" 津貼:"<<allowance<<std::endl; 25 }
3.使用文件*.cpp
main主函數(shù)文件
1 #include "stdafx.h" 2 #include<iostream> 3 4 #include "salary.h" 5 int main() 6 { 7 { 8 Salary salary(3000,3000,0,200,100,"001","aaa"); 9 salary.showSalary(); 10 } 11 12 return0; 13 }
結果:
|