『C++大学教材』学習ノート第三章:類と対象紹介

4497 ワード

学習ノート:
1、C++のクラス定義の例:
//Example of defining class GradeBook
#include <iostream>
using namespace std;  //using   

//GradeBook class definition
class GradeBook
{
public :
   //fucunction displayMessage
   void displayMessage()
   {
      cout << "Welcome to the Grade Book!" << endl;
   }  //end function displaysMessage 
};    //end class 『  ①』
//function main begins begins program execution
int main()
{
   GradeBook myGradeBook; //create a GradeBook object named myGradeBook .   『  ②』
   myGradeBook.displayMessage();
}  //end main
注記①: C++のクラス定義が終了すると、終了をセミコロン(;)で表す必要があります.
注記②: C++でクラスのオブジェクトを宣言する場合はnewではなく、直接宣言すればよい.このクラスの構造方法にパラメータを渡す場合は、GradeBook myGradeBook(「My Grade」)と書きます.
2、cinとストリーム抽出演算子(<<または>>)を組み合わせて使用すると、最初の空白間隔記号まで文字が読み出されます.行全体のデータを読み込むには、パケットのgetLine(cin,str)メソッドを使用します.
3、ソフトウェアエンジニアリングの知識:クラスのデータメンバーはプライベート(private)として宣言され、メンバー関数は共通(public)である.クラスのデータメンバーを操作するには、メンバー関数で呼び出さなければならない.すべてのメンバー関数がデータメンバーを変更する場合はset***()メソッドで変更することが望ましい.他のメンバー関数で直接データ・メンバーに値を割り当てることができるとはいえ、他のデータ・メンバーはデータの整合性などをチェックすることはできません.
4、ソフトウェアエンジニアリングの知识:クラスのデータメンバーに値を割り当てる时set***方法を通じて伝达したデータに対して『完全性検査』、『不法検査』などの検査を行うことができて、大いにプログラムデータの安全性を高めました.
5、プリコンパイル中の#include<>コマンドと#include""コマンドの違い:#includeコマンドは、プリプロセッサheadFileヘッダファイルがC++標準ライブラリに属していることを示し、プリプロセッサheadFileヘッダファイルがプリプロセッサheadFileヘッダファイルであるディレクトリではなく、その標準ライブラリに直接headFileファイルを探します.一方、#include"headFile"は、まず、#include命令が表示されたファイルが存在するディレクトリの下でヘッダファイルを探してみます.見つからない場合は、C++標準ライブラリヘッダファイルが存在するディレクトリの下で検索を続けます.
6、一つのクラスが一つの独立ファイルに対応する多重性
クラスを書くときは、main関数ではなくクラス定義のみを書くことができます.これにより、他のクラスでクラスを参照してプログラムの多重化を実現することができます.通常、mainを持たないクラスの接尾辞名は「class」と書く.「GradeBook.h」のような形で、他のクラスのヘッダに「#include GradeBook.h」を付けるだけでクラスのメンバー関数を呼び出すことができ、非常に便利です.
7、インタフェースと実現の分離
C++のクラスはクラスの定義とクラスの実現とクラスの異動の3つの分離の効果を実現することができる.
クライアント・プログラマは、メンバー関数がどのように実装されるかを知る必要がなく、そのメンバー関数にどのパラメータが必要なのか、どの値を返すのかを知るだけで、クラス内のメンバー関数の具体的な実装の詳細を隠すことを目的としています.(これらの情報はクラスの定義、すなわちインタフェースで得られる)
例は次のとおりです.
  ①GradeBook.h:インタフェースの定義:
//GradeBook      
#include <string>
using namespace std;

//GradeBook Class definition
class GradeBook
{
	public:
		GradeBook(String); //       ①
		void setCourseName(string); 
		string getCourseName();
		void displayMessage();
	private:
		string courseName //GradeBook    courseName
}; 	//GradeBook     
	//  ①:C++             ,      
  ②GradeBook.cpp:独立したソースファイルでメンバー関数を定義する
//GradeBook.cpp
//                
#include <iostream>
#include "GradeBook.h"

using namespace std;

//      
GradeBook::GradeBook(string name)
{
	setCourseName(name);
}

//      
void GradeBook::setCourseName(string name)
{
	//       name         
	courseName=name;
}

string GradeBook::getCourseName()
{
	return courseName;
|

void GradeBook::displayMessage()
{
	cout << "Welcome to the grade book for 
" << getCourseName() << "!" <<endl; } //
  ③text.cpp:GradeBookクラスのテスト
//test.cpp
//  GradeBook 
#include <iostream>
#include "GradeBook.h" //  ①      "GradeBook.h" ,    “GradeBook.cpp” 

using namespace std;

int main()
{
	GradeBook gradeBook1("CS101 Introduction to C++ Programming");
	GradeBook gradeBook2("CS102 Data Structures in C++");
	
	cout << "gradeBook1 created for course:" << gradeBook1.getCourseName()
		<< "
gradeBook2 created for course:" << gradeBook2.getCourseName() << endl ; } //main

C++のインタフェース定義、インタフェース実装、インタフェース呼び出し間のコンパイルおよび接続プロセス:まず、クラスのインタフェース(GradeBook.h)をプログラマによって作成およびコンパイルし、次にクラス実装プログラマによってインタフェース(GradeBook.cpp)を実装し、最後にクライアントコード(test.cpp)をクライアントプログラマによって記述する.
GradeBookメンバー関数の実装の詳細を隠すために、クラス実装プログラマはクライアントコードプログラマにヘッダファイルGradeBookのみを提供する.h(クラスのインタフェースとデータメンバーがリストされています)とGradeBookクラスのターゲットコード(コンパイルされたファイル)です.クライアントコードプログラマがmain関数を書くと、コンパイラは
①main関数の宛先コード
②GradeBookクラスメンバー関数実装の対象コード
③クラス実現プログラマとクライアントコードプログラマが使用するC++クラスのC++標準ライブラリターゲットコード
(ここのコンパイルと接続の過程は、本の中でははっきり言っていないので、まだ少しぼやけています)
接続して実行可能プログラムを生成します.
6、クラスのUML図
(補足対象)
プログラミングの習慣:
1、関数名は通常小文字で始まり、後ろの各単語は大文字で始まる.
2、クラス名は頭が大文字で、後ろの単語は頭が大文字です.
質問:
1、C++のパッケージとネーミングスペースとクラスはどんな関係ですか?
2、クラスのインタフェースの定義、インタフェースの実装、インタフェースの呼び出しの間のコンパイルと接続の中でコンパイルと接続の過程は少しぼやけていますか?