目次
カプセル化ケース 1: 名前と生徒番号に値を割り当て、生徒の名前と生徒番号を表示できる生徒クラスを設計します。
クラスとオブジェクト
オブジェクト指向プログラミング (OOP) は、現代のプログラミングの基礎の 1 つです。C++ は OOP をサポートし、クラスとオブジェクトを作成できる言語です。
クラスとオブジェクトの概念
-
クラスはオブジェクトを抽象化したものです。クラスは抽象データ型です。それらの関係は、オブジェクトがクラスのインスタンスであり、クラスがオブジェクトのテンプレートであるということです。オブジェクトは新しい className を通じて生成され、クラスのメソッド (クラスのコンストラクター) を呼び出すために使用されます。
-
クラスの意味:
2-1. クラスは属性とメソッドをカプセル化すると同時に、クラスの属性とメソッドへのアクセスを制御します。
2-2. クラスは、私たちが客観的な物事に基づいて抽象化して物事のクラスを形成し、次にクラスを使用してオブジェクトを定義し、そのような物事の具体的な個体を形成します。
2-3. クラスはデータ型、クラスは抽象、オブジェクトはメモリ空間を占有する具体的な変数です。
-
クラスアクセス制御
C++ では、クラスの属性とメソッドのアクセス レベルを定義できます。パブリックで変更された属性とメソッドには、クラスの内部またはクラスの外部からアクセスできます。プライベート プロパティとメソッドにはクラス内でのみアクセスできます。
-
行動
すべてのオブジェクトのパブリック操作はメンバー関数 (通常はパブリック属性として使用される) 属性です。すべてのオブジェクトのパブリック特性はデータ メンバー (通常は保護された属性として使用されます) です。
C++ オブジェクト指向の 3 つの主要な特徴
C++オブジェクト指向の 3 つの主要な機能は、カプセル化、継承、ポリモーフィズムです。
カプセル化の目的はコードのモジュール化を実現すること、継承の目的はコード拡張を実現すること、静的ポリモーフィズムの目的は関数のオーバーロードとジェネリック プログラミング、動的ポリモーフィズムの目的は仮想関数の書き換えです。
C++ では、すべてがオブジェクトであり、オブジェクトにはそれぞれのプロパティと動作があると考えられています。
例えば:
人をオブジェクトとして使用でき、その属性には名前、年齢、身長、体重...が含まれ、その行動には歩く、走る、跳ぶ、食べる、歌う...が含まれます。
車は、タイヤ、ハンドル、ライトなどの属性を持ち、人を乗せたり、音楽を流したり、エアコンを入れたりするなど、オブジェクトとして使用することもできます。
同じ性質を持つオブジェクトを抽象的にクラスと呼ぶことができ、人間は人間クラス、車は自動車クラスに属します。
1. カプセル化
カプセル化とは、C++ オブジェクト指向の 3 つの主要機能の 1 つであり、データと動作を有機的に組み合わせて全体を形成することです。データとデータ処理操作を組み合わせてクラスを形成し、データと関数の両方がクラスのメンバーになります。
1. 包装の意味:
- 属性と行動を全体として使用して、生活の中の物事を表現する
- 権限を使用して属性と動作を制御する
2. 文法:
class クラス名 {アクセス権限: 属性/動作}
例: 円クラスのアクションを通じて円の円周を取得する
#include<iostream>
#include<string>
using namespace std;
// 圆周率
const double PI = 3.14;
// 设计一个圆类 求圆的周长
// class(一个类) 类名
// class代表设计一个类,类后面紧跟着的就是类的名称
class circle {
// 访问权限
// 公共权限
public:
// 属性
// 半径
int r;
//行为:一般为函数
// 获取周长
double calculateZC()
{
return 2 * PI * r;
}
};
int main()
{
// 通过圆类创建具体的圆(对象)
// 实例化 ( 通过一个类 创建一个对象的过程 )
circle c1;
// 给圆对象 的属性进行赋值
c1.r = 10;
cout << "圆的周长:" << c1.calculateZC() << endl;
return 0;
}
操作結果:
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----
カプセル化ケース 1: 名前と生徒番号に値を割り当て、生徒の名前と生徒番号を表示できる生徒クラスを設計します。
#include<iostream>
#include<string>
using namespace std;
// 设计一个学生类,属性有姓名和学号
// 可以给姓名和学号赋值,可以显示学生的姓名和学号
// 设计学生类
class student {
public: // 公共权限
// 类中的属性和行为 我们统一称为 成员
// 属性 成员属性 成员变量
// 行为 成员函数 成员方法
// 属性
string name;
int id;
// 行为
// 显示姓名与学号
void showstu()
{
cout << "姓名: " << name << " 学号: " << id << endl;
}
// 可以通过对象的行为给属性赋值
void setname(string i_name)
{
name = i_name;
}
void setID(int i_id)
{
id=i_id;
}
};
int main()
{
// 创建一个具体的学生
// 实例化对象
class student s1;
// 给s1属性赋值
s1.setname("张三");
s1.id = 01;
s1.showstu();
class student s2;
// 给s2属性赋值
s2.name = "李四";
s2.id = 02;
s2.showstu();
class student s3;
// 通过对象的行为给属性赋值
s3.setname("王五");
s3.setID(03);
s3.showstu();
return 0;
}
操作結果:
2. アクセス権
クラスを設計するとき、属性と動作をさまざまな権限の下に配置して制御できます。
アクセス権には 3 種類あります
1. public パブリック権限には、メンバー クラスの内部と外部の両方からアクセスできます。
2. 保護された保護パーミッションは、メンバクラス内ではアクセスできますが、クラス外ではアクセスできません(継承関係、親子関係があります)
3. Private プライベート権限はメンバクラス内ではアクセス可能ですが、クラス外ではアクセスできません(親子関係にもアクセスできません)
例:
#include<iostream>
using namespace std;
class person{
public:
// 公共权限
string name;
protected:
// 保护权限
string car;
private:
// 私有权限
int password;
public:
void fun()
{
name = "张三";
car = "BMW";
password = 123456;
}
// 不管哪种形式在类内都是可以访问的
};
int main ()
{
// 实例化具体的对象
class person p1;
p1.name = "李四";
p1.car = "AMG"; // 保护权限的内容在类外是不能访问的
p1.password = 258258; // 私有权限的内容在类外是不能访问的
return 0;
}
报错显示:
構造体とクラスの違い
C++ における構造体とクラスの唯一の違いは、デフォルトのアクセス権が異なることです。
違い:
構造体のデフォルトはパブリック権限です
クラスのデフォルトはプライベート権限です
例:
#include<iostream>
using namespace std;
class C1
{
int m_A;// 默认权限 是私有
};
struct C2
{
int m_A;// 默认权限 是公共
};
int main ()
{
class C1 c1;
c1.m_A=1000;
struct C2 c2;
c2.m_A=100;
return 0;
}
エラー メッセージには次のものが表示されます。
3. 会員属性の私物化
メンバー属性をプライベート化する利点:
1. すべてのメンバー属性をプライベートに設定して、読み取りおよび書き込み権限を自分で制御できるようにします。
2. 書き込み権限の場合、データの正当性を検出できます。
例:
#include<iostream>
#include<string>
using namespace std;
// 设计一个人类
class person{
// 设计一个public 的公共接口
public:
// 设置姓名
void set_name(string in_name)
{
name = in_name;
}
// 获取姓名
string get_name()
{
return name;
}
// 设置年龄
void set_age(int in_age)
{
if(in_age<=0||in_age>150){
cout<<"你输入的年龄有误!"<<endl;
return;
}
age=in_age;
}
// 获取年龄
int get_age()
{
return age;
}
// 设置情人,只写
void set_lover(string in_lover)
{
lover = in_lover;
}
private:
// 姓名 可读可写
string name;
// 年龄 可读可写
int age = 0;
// 情人 只写
string lover;
};
int main()
{
class person p1;
p1.set_name("张三");
cout<<"姓名为: "<<p1.person::get_name()<<endl;
p1.set_age(200);
cout<<"年龄为: "<<p1.person::get_age()<<endl;
p1.set_lover("鞠婧祎");
return 0;
}
操作結果:
4. 包装ケース
ケース 1: キューブ クラスの設計
デザインキューブクラス(Cube)
立方体の面積と体積を求めます
グローバル関数とメンバー関数を使用して、2 つのキューブが等しいかどうかを判断します。
例:
#include<iostream>
#include<string>
using namespace std;
/*
1.创建立方体类
2.设计属性
3.设计行为 获取立方体面积和体积
4.分别利用全局函数和成员函数 判断两个立方体是否相等
*/
// 立方体类
class Cube{
public:
void setL(int L)
{
m_L=L;
}
int getL()
{
return m_L;
}
void setW(int W)
{
m_W=W;
}
int getW()
{
return m_W;
}
void setH(int H)
{
m_H=H;
}
int getH()
{
return m_H;
}
// 获取立方体的面积
int calculateS()
{
return 2*(m_L*m_W+m_W*m_H+m_L*m_H);
}
// 获取立方体的体积
int calculateV()
{
return m_L*m_H*m_W;
}
// 利用成员函数判断两个立方体是否相等
bool isSameByClass(Cube &C)
{
if(m_L==C.getL()&&m_W==C.getW()&&m_H==C.getH()){
return true;
}
return false;
}
private:
int m_L;// 长
int m_W;// 宽
int m_H;// 高
};
// 利用全局函数判断 两个立方体是否相等
bool isSame(Cube &C1,Cube &C2)
{
if(C1.getL()==C2.getL()&&C1.getW()==C2.getW()&&C1.getH()==C2.getH()){
return true;
}
return false;
}
int main()
{
// 创建一个立方体对象
class Cube C1;
C1.setL(10);
C1.setW(10);
C1.setH(10);
cout<<"C1的面积为:"<<C1.calculateS()<<endl;
cout<<"C1的体积为:"<<C1.calculateV()<<endl;
// 创建第二个立方体
class Cube C2;
C2.setL(10);
C2.setW(20);
C2.setH(10);
// 全局函数判断
bool ret=isSame(C1,C2);
if(ret){
cout<<"C1和C2是相等的"<<endl;
}
else{
cout<<"C1和C2是不相等的"<<endl;
}
// 成员函数判断
ret=C1.isSameByClass(C2);
if(ret){
cout<<"成员函数判断:C1和C2是相等的"<<endl;
}
else{
cout<<"成员函数判断:C1和C2是不相等的"<<endl;
}
return 0;
}
操作結果:
事例 2: 点と円の関係
点と円の関係を計算するために、円クラス (Circle) と点クラス (Point) を設計します。
例:
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
// 判断点和圆的关系
/*
点到圆心的距离== 半径 点在圆上
点到圆心的距离 > 半径 点在圆外
点到圆心的距离 < 半径 点在圆内
*/
class Point
{
public:
void setX(int X)
{
m_X=X;
}
int getX()
{
return m_X;
}
void setY(int Y)
{
m_Y=Y;
}
int getY()
{
return m_Y;
}
private:
int m_X;
int m_Y;
};
class Circle
{
public:
// 设置半径
void setR(int R)
{
m_R=R;
}
int getR()
{
return m_R;
}
// 设置圆心
void setCenter(Point center)
{
m_Center=center;
}
Point getCenter()
{
return m_Center;
}
private:
int m_R; // 半径
class Point m_Center;
};
// 判断点和圆的关系
void isInCircle(Circle &c,Point &p)
{
// 计算两点间距离
int distance=pow((pow(c.getCenter().getX()-p.getX(),2))+(pow(c.getCenter().getY()- p.getY(),2)),0.5);
if(distance==c.getR()){
cout<<"点在圆上"<<endl;
}else if(distance > c.getR()){
cout<<"点在圆外"<<endl;
}else{
cout<<"点在圆内"<<endl;
}
}
int main()
{
// 创建一个圆 和一个圆心 的对象
Circle c;
c.setR(10);
Point center;
center.setX(10);
center.setY(0);
c.setCenter(center);
// 创建一个点
Point P;
P.setX(10);
P.setY(9);
// 全局函数判断点和圆的位置关系
isInCircle(c,P);
return 0;
}
操作結果: