C++クラスとオブジェクト(構築とプロファイル)

5945 ワード

クラスクラスクラス:カスタムデータ型カスタムデータ型
オブジェクト:クラスで定義された変数
1.クラスの定義とパッケージ
class    //    ( Declaration)  
{
public :
    
protected :
    
private :
    
} ;
void function()
{
}//           //    ( Implementation)  

構文の説明:
1. classはクラスを定義する際のキーワードです.
2. クラス名は識別子の命名規則に合致する必要がある.
3. クラスメンバーには、データメンバーと関数メンバーの2種類があります.特定のクラスには、データ・メンバーのみを含むか、データ・メンバーのみを含むか、
関数メンバーを含める
4. アクセス権限はpublic(パブリック権限)、protected(保護権限)、private(プライベート権限)の3種類あり、
publicタイプは外部で呼び出すことができ、メンバーとクラスのデフォルトのアクセス修飾子はprivateです.
5. クラス定義コードは2つの部分に分かれています.クラス宣言セクションでは、カッコでデータ・メンバー、関数メンバーを宣言し、各メンバーのアクセス権を指定します.宣言
データ・メンバーの構文形式は、変数文の定義と似ていますが、宣言時に初期化できません.関数メンバーの宣言は、そのプロトタイプ、完全な関数のみを宣言します.
数定義コードは括弧の外に置かれたクラス実装部分であり、定義時に関数名に「クラス名::」を付けて定義し、その関数がどのクラスに属するかを示す必要がある.
 6.関数メンバーは、クラス内の任意の場所のデータメンバーにアクセスしたり、クラス内の任意の場所の関数メンバーを呼び出したりできます.クラスメンバー間で相互にアクセスしない
権限の制約を受けずに、「定義してからアクセスする」、または「宣言してからアクセスする」が必要です.クラス定義コード(宣言と実装の2つのセクションを含む)
範囲内では、クラスメンバーはクラス役割ドメイン(Class scope)を有するクラスメンバーによってアクセスできます.
 7.異なるクラスの役割ドメイン間の識別子は、名前を変更できます.すなわち、異なるクラスのメンバー間で名前を変更できます.
     8.クラス定義で定義されたメンバー関数は、inline識別子が使用されていなくても関数をインラインとして宣言します.
たとえば長方形を定義します
class Rectangle             //class   ,Rectangle  ,  (  )
{
public:                     
    double a,b;
    double RArea();
    double Rlen();
};
//            
double Rectangle::RArea()	//              ,              ::    。
{
    return(a*b);
}
double Rectangle::Rlen()
{
    return(2*a+2*b);
}

//                 (.),                .

Rectangle rec1;		//      rec1,         
rec1.RArea();


2.コンストラクション関数と解析関数
オブジェクトを作成するプロセスをオブジェクトの構造と呼び、オブジェクトを破棄するプロセスをオブジェクトの構造と呼ぶ
コンストラクタ
-コンストラクション関数名はクラス名と同じでなければなりません.
-コンストラクション関数はコンピュータによって自動的に呼び出され、プログラマは直接呼び出すことができません.
-コンストラクション関数は、初期値(デフォルトのパラメータ値を指定可能)をパラメータによって渡し、新しい値を実装します.
オブジェクト・データ・メンバーの初期化.
-コンストラクション関数は再ロードできます.つまり、同じ名前のコンストラクション関数を複数定義します.これにより、複数のコンストラクション関数が提供されます.
種類の形式のオブジェクトの構造方法.
-コンストラクション関数は、インライン関数として定義できます.
-コンストラクション関数には戻り値がなく、定義時に関数タイプを書くことができず、voidを書くこともできません.
-コンストラクション関数は通常クラス外呼び出しであり、そのアクセス権はpublicまたはprotectedに設定する必要があります.
privateに設定できません.
-クラスがコンストラクション関数を定義していない場合、コンパイラはコンパイル時に自動的に追加します.
デフォルトのコンストラクション関数と呼ばれる空のコンストラクション関数.
クラス名(){}
class Rectangle             //class   ,Rectangle  ,  (  )
{
private:             
    double a,b;
public:
    Rectangle()			//    
    {
           a = 0;
           b = 0;
    }
    double RArea();
    double Rlen();
};

こうぞうかんすう
-構造関数名は「~クラス名」でなければなりません.
-構造関数はコンピュータによって自動的に呼び出され、プログラマは直接呼び出すことができません.
-構造関数にはパラメータがありません.
-構造関数は戻り値がなく、定義時に関数タイプを書くことができず、voidを書くこともできません.
いいですよ.
-クラスには1つの構造関数しかありません.
-構造関数は通常、クラス外呼び出しであり、アクセス権はpublicまたは
protected、privateに設定できません.
-クラスが構造関数を定義していない場合、コンパイラはコンパイル時に自動的に追加します.
デフォルトの構造関数と呼ばれる空の構造関数です.形式は次のとおりです.
~クラス名(){}
3.ジョブ:マトリクス乗算
ユーザーはマトリクス1の行数、列数を入力し、ユーザーに各要素の入力を要求する.
ユーザーはマトリクス2の行数、列数を入力し、ユーザーに各要素の入力を要求する.
入力後に乗算結果行列を計算します.
要件:
1.マトリックスクラスの定義
2.構造と構造
3.2 Dポインタおよび動的割当てを使用して、ジョブを完了します.
matrix.h  :
#pragma once
#ifndef MATRIX_H
#define MATRIX_H
#include 
using namespace std;
class matrix
{
public:
	int row;
	int column;
	int **ptr;
	matrix()
	{
		cout << "please input row and column:" << endl;
		cin >> row >> column;
		cout << row << "x" << column << endl;
		ptr = new int*[5];			//int*      ,    ptr = new (int*)[5] 
		for (int i = 0;i < column;i++)
		{
			ptr[i] = new int[column];
		}
	}
	~matrix()
	{
		for (int i = 0;i < column;i++)
		{
			delete[]ptr[i];
		}
		delete[]ptr;
	}
	void input_matrix(void);
	void matrix_display(void);
};

void matrix::input_matrix(void)
{
	cout << "please input the matrix:" << endl;
	for (int i = 0;i < row;i++)
	{
		for (int j = 0;j < column;j++)
		{
			cin >> ptr[i][j];
		}
	}
}
void matrix::matrix_display(void)
{
	for (int i = 0;i < row;i++)
	{
		for (int j = 0;j < column;j++)
		{
			cout << ptr[i][j]<column != matrix2->row)
	{
		cout << "error!" << endl;
		exit(0);
	}
	for (int i = 0;i < matrix1->row;i++)
	{
		for (int j = 0;j < matrix2->column;j++)
		{
			matrix3->ptr[i][j] = 0;
			for (int k = 0;k < matrix1->column;k++)
			{
				matrix3->ptr[i][j] += matrix1->ptr[i][k] * matrix2->ptr[k][j];
			}
		}
	}
}

void matrix_and(matrix *matrix1, matrix *matrix2, matrix *matrix3)
{
	if (matrix1->row != matrix2->row || matrix1->column != matrix2->column)
	{
		cout << "error!" << endl;
		exit(0);
	}
	for (int i = 0;i < matrix1->row;i++)
	{
		for (int j = 0;j < matrix2->column;j++)
		{
			matrix3->ptr[i][j] = matrix1->ptr[i][j] + matrix2->ptr[i][j];
		}
	}
}

#endif // !MATRIX_H
matrix.cpp  :
#include 
#include "matrix.h"
#include 
int main()
{
	char ch;
	int **p;
	matrix *matrix1 = new matrix();			//        
	matrix *matrix2 = new matrix();
	matrix *matrix3 = new matrix();
	
	matrix1->input_matrix();
	matrix2->input_matrix();
	matrix1->matrix_display();
	matrix2->matrix_display();
	matrix3->row = matrix1->row;
	matrix3->column = matrix2->column;
	cout << "please output the operation:" << endl;
	cin >> ch;
	if (ch == '+')
	{
		matrix_and(matrix1, matrix2, matrix3);

		getchar();
	}
	else
	{ 
		if (ch == '*')
		{
			matrix_mul(matrix1, matrix2, matrix3);
		}
		else
		{
			cout << "error2!" << endl;
			exit(0);
		}
	}
	cout << "output is:" << endl;
	matrix3->matrix_display();
	getchar();
	getchar();
	return 0;
}