More Related Content
Similar to 【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„ (20)
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第6回 ‟文字列とオブジェクト„
- 1. © 2016 Embarcadero Technologies, Inc.
All rights reserved. Proprietary and confidential.
第6回
‟文字列 と オブジェクト„
シーズン2:プログラミング言語をやさしく覚えよう
C++Builderの部
- 2. 2© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
Delphi / C++Builder Starter チュートリアルシリーズ
シーズン2 :2017年1月23日 ~ 3月27日 全 9 回
時間 :毎週 月曜 17 時 00分~17時 50分
Delphi 17時00分~17時20分 / C++Builder 17時30分~17時50分
ねらい :プログラミング言語をやさしく覚えよう
セミナー情報 : 下記のWebサイト
http://forms.embarcadero.com/starter-tutorial-webinar
シーズン2
第1回 2017年1月23日 シューティングゲームのプログラム
第2回 1月30日 変数と 型
第3回 2月6日 条件 とループ
第4回 2月13日 関数
第5回 2月20日 配列 と レコード
第6回 2月27日 文字列 と オブジェクト
第7回 3月6日 オブジェクト指向
第8回 3月13日 作ってみよう(1)
第9回 3月27日 作ってみよう(2)
- 3. 3© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
第6回 「文字列 と オブジェクト」
今日のねらい
• 文字列を知る
• 文字列の操作
• クラスとオブジェクトの概略を知る
実施内容
• 文字列の型
• 文字列の代入とヘルパーについて
• クラスとオブジェクトの意味を知る
• クラスの定義とオブジェクトの宣言
- 4. 4© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
無料版 C++Builder 10.1 Berlin Starter Edition 入手方法
• シリアルキーを知らせるメール内にも再ダウンロードリンク有
• ダウンロード、インストール参考ブログ:https://goo.gl/CCBNdx
エンバ
Web
製品
C++
Builder
Starter
バナー
登録 Get
無料で使える開発環境をダウンロード
EDN*に登録済の方はEDNアカウントでダウンロード可
登録完了後、自動でインストーラーのダウンロード開始
インストール時にシリアルキーを入力
登録時のメールアドレスにシリアルキーが配信される
- 5. 5© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
文字列の前に、文字の話
コンピュータで扱う「文字」には、識別用の番号(=文字コード)が割り振られている
同じ文字でも、割り振り方のルール(=符号化)によって割り当てられる番号が違う
文字の集まりを文字集合という
コンピュータの日本語環境では、日本語の文字集合としてJIS漢字やUnicodeが用いられる
文字コードには Shift_JIS, UTF-8, UTF-16 が用いられる
文字集合
文字コード
JIS
Shift_JIS
Unicode
UTF-8
Unicode
UTF-16
A 0x41 0x41 0x0041
あ 0x82A0 0xE38182 0x3042
⌘ (未対応) 0xE28C98 0x2318
- 6. 6© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
Unicode, Shift_JIS, ANSI, ASCII ??
Unicode
• 世界中のすべての文字を統一的に扱う目的で策定された文字集合
• 英語、日本語だけではなく、韓国語、中国語などの多言語の文字集合を含む
Shift_JIS
• Windows以前のパソコン/マイコンでJISの漢字を扱うための文字コードの一種
• Windows95までの日本語OSではShift_JISが標準的に用いられている
ANSI
• Unicode以前の Windows で多言語を扱うための方法
• 「ASCII + 言語ごとの符号化」をコードページとして規定している(CP932 = Shift_JIS, CP949 = 韓国語、など)
• 各国語版WindowsでANSIという場合は、それぞれの初期言語のことを指す
ASCII
• ASCIIは数値、アルファベット、記号を表現できる文字集合
• Shift_JISはASCIIをベースに拡張されている
- 7. 7© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
Unicodeのコードの種類
UTF-8
• ASCIIとの互換性を重視した可変長コードであり、アルファベットを1バイトで表す
• HTMLなどの文書はUTF-8を用いる(基本の制御構造がASCIIをベースとするため)
• ラテン文字は2バイト 、日本語、中国語、韓国語などは3バイト 、使用頻度の低い文字は4バイト
UTF-16
• 世界中のすべての文字は2バイト = 65536個に収まると考えて設計された
• しかし実際には2バイトで収まらなかったので、使用頻度の低い文字は4バイトで表すことにした
• Windows API ではUTF-16が用いられるため、一部のアプリは UTF-16を Unicode と表記している
• UTF-16を用いると日本語を多用する文書では平均的にデータ量が少なくなる
UTF-32
• すべての文字を4バイトで表す
• 固定長なので高速処理が可能だが、使用するデータ量が最も多くなる
- 8. 8© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
参考: Windows のメモ帳アプリでの文字コード選択
この Unicode は UTF-16 のこと
- 9. 9© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
文字列(型)
String型 ( = UnicodeString型)
• UTF-16 で文字列を格納する型
• 新規に作るアプリケーションの文字列では String または UnicodeString型を用いる
AnsiString型
• Shift_JISを取り扱う処理向け
UTF8String 型
• AnsiString をベースとして UTF-8 を取り扱う型
• UTF-8 での入出力が必要な場合に用いる(ファイル入出力やインターネット経由の通信など)
- 10. 10© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
文字集合と収録文字
それぞれの文字集合で収録文字が違う
収録文字数の多いコードから少ないコードへの変換は文字が失われることも
Unicode (UTF-8, UTF-16, UTF-32)
韓国語
中国語
日本語
AnsiString
codepage = 932(Shift_JIS)
ASCII
その他の言語…
- 11. 11© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
文字列相互代入によるデータの欠落の例
{
AnsiString strSJIS;
UTF8String strUTF8;
String strUTF16;
strSJIS = L"日本語"; // OK: "日本語"は Shift_JISで表せる文字である
strUTF8 = strSJIS; // OK: UnicodeにはすべてのShift_JISが含まれる
strUTF16 = strSJIS; // OK: UnicodeにはすべてのShift_JISが含まれる
strUTF16 = L"⌘"; // OK: Unicodeを扱う型にUnicode文字を代入している
strUTF8 = strUTF16; // OK: Unicode同士なので常に成功するが、データ形式の変換が生じる
strSJIS = L"𠮷野屋"; // NG: 「𠮷 = つちよし」はShift_JISに存在しない文字なので失われる
strSJIS = strUTF8; // NG: strUTF8 ="⌘" のため、Shift_JIS に代入すると失われる
}
文字列型の代入(コード例)
- 12. 12© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
文字列型の文字を参照する
文字列型[添字]で参照すると、文字列型の1つ1つの文字を参照できる
C++Builderで使用できる文字列型のうち、Delphiと共通の文字列型の添字は 1 から始める
{
String strUTF16 = L“Hello C++Builder”;
// 文字列の各文字を配列として参照する
for ( int i = 1 ; i <= strUTF16.Length() ; i++ ) {
Memo1->Lines->Add(
Format( "i=%d: %s", ARRAYOFCONST(( i, strUTF16[i] )) ) );
}
}
- 13. 13© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
文字列型の代入と連結
文字列の代入には代入演算子 = 使用可能
文字列の結合には + が使用可能
{
String str1 = L"Hello";
String str2 = L"C++Builder";
str1 = str1 + L" " + str2;
// "Hello C++Builder" と表示される
Memo1->Lines->Add(str1);
}
- 14. 14© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
文字列型に対する操作
文字列型には様々な操作方法が提供されている
• 一例を紹介
参考docwiki: http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.UnicodeString_Methods
操作 説明
= 文字列をコピーして代入する
+ 文字列を連結する
== 文字列を比較して等しいかどうかを返す
IsEmpty 文字列が空(文字を含んでいない)かどうかを返します。
Length 文字列の長さを返す
Format, printf 書式文字列および引数の組み合わせから文字列を生成する
UpperCase, LowerCase すべて大文字、または小文字に変換した文字列を返す
Trim, TrimLeft, TrimRight 前や後ろのスペースを除いた文字列を返す
{
String str = L" [Delphi/C+Builder] ";
str.UpperCase(); // 大文字に変換
str.LowerCase(); // 小文字に変換
str.Trim(); // 両端の空白を削除
str.TrimLeft(); // 文字列の前の空白を削除
str.TrimRight(); // 文字列の後ろの空白を削除
}
- 15. 15© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
Format関数
設定した書式に基づいて、一連の引数を文字列化する関数
参考Docwiki: http://docwiki.embarcadero.com/Libraries/Berlin/ja/System.SysUtils.Format
// Formatの書式
Format(“文字列および書式”, ARRAYOFCONST((文字列に組みこむデータをカンマで区切って連ね
る)) );
{
String strWeather, strOutput;
int iTemparture;
strWeather = L”雨";
iTemparture = 20;
//Formatはこんな感じで使えます
strOutput = Format(
L”明日の天気は %s 、気温は %d 度になるでしょう", ARRAYOFCONST(( strWeather, iTemparture ))
);
Memo1->Lines->Add( strOutput );
}
- 16. 16© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
クラス
クラスとは「ユーザが定義した型」と「型に対する操作」を組み合わせたもの
// クラスの例
class TZipCode {
public: // メンバ変数。public宣言でクラス外から操作可能
int ZipCode;
String Pref;
String City;
String Area;
// クラスに紐づく関数(メンバ関数)の宣言
String getFullAddress();
};
// 都道府県名 + 市区町村名 + 町域名を連結して返す処理
String TZipCode::getFullAddress() {
return Pref + " " + City + " " + Area;
}
// クラスの実体(オブジェクト)を作り、メンバを初期化する
TZipCode zipdata = { 1120004, L"東京都", L"文京区", L"後楽" };
// メンバ関数の実行はオブジェクトに対する操作である
zipdata.getFullAddress();
// クラスを使わない例
struct SZipCode {
int ZipCode;
String Pref;
String City;
String Area;
};
// 関数宣言部
String getFullAddress( SZipCode zipCode );
// 都道府県名 + 市区町村名 + 町域名を連結して返す処理
String getFullAddress( SZipCode zipCode ) {
return zipCode.Pref + " " + zipCode.City + " " + zipCode.Area;
}
// 構造体の変数を作り、初期化する
SZipCode zipdata = { 1120004, L"東京都", L"文京区", L"後楽" };
// 関数名だけでは SZipCode との関連付けが分かりづらい
getFullAddress( zipdata );
- 17. 17© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
クラスの特徴
データと操作が紐付いている
• struct(構造体)の場合はデータ型と操作が紐付いておらず、型が一致する限りは無制限に操作できる
• クラスの場合は操作(メンバ関数)を適切に実装することで安全な操作を提供できる
データの隠蔽
• クラスのメンバ変数はクラスの外から参照できない
• クラスの中からは隠蔽されたデータを自由に参照できる
• クラス外から参照させたい場合は public 宣言する
クラスの継承(詳細は次回で説明)
• あるクラスを基本の共通の型(親クラス)とし、追加のデータ型や操作をつけた「派生クラス」を定義できる
• 派生クラスは元の型の特徴を引き継ぐ(継承)
• 例: 親クラス = 自動車 = 動力源を内蔵し、レールや架線によらず運転する車(ただし原付を除く)
• この親クラスから、用途の違い(自家用、トラック、バス、タクシー、消防車、救急車など)で派生クラスを定義できる
• ただしいずれの派生クラスも、親クラスの定義を含んでいる(継承している)
- 18. 18© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
クラスの実装の基本形
class クラス名 {
private:
// クラス内だけで使う変数や関数の宣言
public:
// クラス外から利用できる変数や関数の宣言
戻り値の型 何かのメンバ関数( … );
// 特別な意味を持つメンバ関数の宣言
クラス名( … ); // クラスと同名の関数は、オブジェクトを生成する時に実行(コンストラクタ)
~クラス名(); // クラス名に ~ が付く関数はオブジェクトの破棄時に実行(デストラクタ)
};
クラス名::クラス名( int Z, String P, C, A ) {
// オブジェクト生成時の初期化処理を書く
}
クラス名:: ~クラス名() {
// 破棄時の終了処理を書く。クラスの操作に伴って動的生成したオブジェクトは、ここで確実に捨てる
}
戻り値の型 クラス名::何かのメンバ関数() {
…
}
- 19. 19© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
クラスの実装例
class TZipCode {
private: // クラス内だけで使う変数や関数の宣言。変数は特に理由がある場合を除いて private 宣言する。
int ZipCode;
String Pref;
String City;
String Area;
public: // クラス外から利用できる変数や関数の宣言。外部との相互の受け渡しが必要な変数のみ public 宣言する。
String getFullAddress();
// 特別な意味を持つメンバ関数の宣言
// クラスと同名の関数は、オブジェクトの生成時に実行(コンストラクタ)
TZipCode( int ZipcCode, String Prev, String City, String Area );
// クラス名に ~ が付く関数はオブジェクト破棄で実行(デストラクタ)
TZipCode();
};
TZipCode::TZipCode( int Z, String P, String C, String A ) {
// オブジェクト生成時の初期化処理を書く
ZipCode = Z; Pref = P; City = C; Area = A;
}
TZipCode::~TZipCode() {
// 破棄時の終了処理を書く。クラスの操作に伴って動的生成したオブジェクトは、ここで確実に捨てる
}
String TZipCode::getFullAddress() {
return Pref + " " + City + " " + Area;
}
- 20. 20© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
クラスの利用例
{
// クラスのインスタンスを new で確保する例
// データはアプリケーション共通の領域に作られる
TZipCode *zipdata = new TZipCode( 1120004, L“東京都”, L“文京区”, L“後楽” );
// new で確保した場合は、メンバ関数やメンバ変数への参照は -> で行う
Memo1->Lines->Add( zipdata->getFullAddress() );
// new した場合は不要になった時点で必ず delete する。
delete zipdata;
}
{
// 実行中の関数やブロック用の領域に確保する例
TZipCode zipdata2( 1120004, L“東京都”, L“文京区”, L“後楽” );
// メンバ関数やメンバ変数への参照は . で行う
Memo1,Lines.Add(zipdata2.getFullAddress() );
// 確保したインスタンスは関数やブロックを抜けるときに破棄される
}
- 21. 21© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
本日のセミナー内容は
弊社ブログに掲載予定
[コミュニティ]
↓
[日本人ブログ]
実施内容の再視聴
皆さんが見ているWebページの下に、順次アップロード
エンバカデロWebサイト : http://forms.embarcadero.com/starter-tutorial-webinar
[リソース] – [イベント]の「Delphi / C++Builder Starter チュートリアルシリーズ」ページ
実施内容サマリー
• Community embarcadero (コミュニティ エンバカデロ)にWebリンク、サンプルコード情報等
http://community.embarcadero.com/
「エンバカデロ」で検索
- 22. 22© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
第6回 「文字列 と オブジェクト」
今日のねらい
• 文字列を知る
• 文字列の操作
• クラスとオブジェクトの概略を知る
実施内容
• 文字列の型
• 文字列の代入とヘルパーについて
• クラスとオブジェクトの意味を知る
• クラスの定義とオブジェクトの宣言
- 23. 23© 2016 Embarcadero Technologies, Inc. All rights reserved. Proprietary and confidential. #embtwebi_jp
次回のC++Builderパートは
3月6日(月)17:30より
“オブジェクト指向 „