C PlusPlus

提供: yonewiki
移動: 案内, 検索

言語と開発環境へ戻る。


本来の表記は「C++」です。この記事に付けられた題名は記事名には半角の+、>、<、を利用できない制約から不正確なものとなっています。

目次

概要

C++はCの仕様を基にC++独自のエッセンスを交えた言語です。Cを覚えてから、C++でCから変更されたところを知るというのがオーソドックスな勉強方法です。C++から直接勉強するのが、早いとは思うんですけど、Cの知識を抜きにして教えてくれるってことは少なかったりする。
 「まぁ、覚えておいた方がいいんじゃない。」ってツンデレ系の美男、美少女に説得されたら、合点も行くのかもしれません。C言語と他の言語の比較についてですが、C言語はWindows/Mac/UNIX GUIアプリやDLLなどのライブラリ開発やマイコンやPIC操作では、よく使われるし、AndroidではJavaという感じです。WebではJavaScript、PHP、Perlがよく使われ、簡単なアプリケーションであればVisual Basic、MS OfficeマクロでもVBを基本としたVBA、電子回路工作では、アセンブラという低水準言語がよく使われます。奥深さ、難しさで言えばC言語/C++/Visual C++/Visual C++/CLI C++/CX がトップレベルだと思います。Javaはそこそこ。
 自分の印象としてはC++が理解できれば、他の言語を習得するのはたやすいという印象です。C#はマイクロソフト仕様のC++って感じだと思ってもらえればと思います。なんつうかC++/CLIをC++に逆輸入したような言語がC#ですね。ややこしさはC++と同等だと思いますが、ややすっきりしているという印象もあるそうです。でも何もできあがらないまま終わるくらいなら、PerlやPHP、あるいはVBAで遊んだ方が楽しいかもしれない。電子回路工作が好きな人はPIC or マイコン or プログラム制御機器+アセンブラ+工作に適した言語で楽しむのもよいかと。今すぐお金儲けを!と思う人はJavaでAndroidアプリやObjective-CでiPhoneアプリを開発するのが近道。デザインの勉強もお忘れなく。(Objective-CはMacのためのC++って感じ。最近はMac向けにSwiftっていう言語もあるそうな。あとはVisualStudioでiOSアプリを開発するXamarin(ザマリン)、多様化しています。)Windows向けアプリで商売は競合も多く、大手のアプリも凄まじいので、技術的にも効率的にも複雑で一番難しいでしょうね。かなり複雑なシステムを提供しないとお金にはならないような気がするし。アイデア次第ですが。AndoroidやiPhoneなら常時携帯していて、ちょっとした便利さがあれば、アプリ購入に繋がるので規模が小さくても可能性はあると思います。課金系は集客力+デザイン力+アイテム数とアイテムとシステムの優位性のバランスが決めてですかね。単なる電子媒体データを欲しいと思わせる状況作りが大事です。やりすぎて、コンプガチャみたいな問題も生まれましたけど。IT系の野心家は電子媒体を効率よくお金に変えようとするから恐ろしい。クリエイターにもそういう人いますかね。苦労して莫大なお金を手にするのは、まぁ許されるんかもしれませんね。ちまちま稼いで生計立てるという生き方もあるわけです。いずれにせよ、どの言語を習得したとしても結局はそれぞれのOS独自のAPIやプログラムインタフェースやプログラム実装のノウハウを理解せねばならないので、よくある分厚い言語参考書をすべて理解したとしてもOS独自のノウハウはとんでもなく膨大なもので、言語の基礎に加えて広辞苑1冊くらいのOS独自の知識を習得しないと全てを自由に操ることなんてできません。修行あるのみです。画像/動画処理や通信技術やMap(GSI)合成あらゆることを網羅しようとすれば、図書館の本棚2~7列くらいの知識と数学の知識が必要になると考えてよいと思います。更には、作りたいプログラムの専門的な知識も必要です。現場百回、実際の使われ方を理解しないと使いやすいものにはなりません。人から聞いたことや仕様書だけを見ていると、使う人にとってラクだと感じないこともあります。あらゆる人の気持ちを理解したユニバーサルなデザイン。でもやっぱり作ろうとしているプログラムの分野まで拡げると、図書館丸々は理解しないと駄目かな。嫌っす。無理、無理。またプログラムを覚えたところで、インタフェースがへっぽこいと誰も使ってくれないので絵を描く才能や、デザインレイアウトの能力まで必要になります。あるいは3D技術も…。ひとりでやれること。ひとりでやれないこと。よく見極めて学習を進めて欲しいと思います。現代の情報技術リテラシーをもった上で、あーこんなことができたらいいのになぁって思った事を実現させるためには、爆発的な処理能力と体力が必要です。


ちなみに自分自身は職業プログラマでは無く、趣味プログラマで、主に勉強だけやって、実際には何も作らないというスタイルでプログラムと接してきました。何かを完璧に自分で作ろうとすると、勉強することが多すぎるって感じつつ、勉強ばっかりしてるうちにおじいちゃんみたくなっていった感じです。だから世にいうデスマーチだとか大きなプロジェクトを経験したことも分業プログラムも経験したことはありません。これからプログラマになる方は、そういったことを経験したことのある偉大な人の言葉にも耳を傾けるべきだと思います。決して楽な職業ではないということですから、志し半ばにならぬように、このいばらの道を歩んでいただければと思います。そして素晴らしい情報社会を築き上げていって下さい。会社では生産管理システムと連動する特定作業の進捗管理Webアプリを一人で作ったり、装置からデータを取得する通信部分やUIや、作業手数を極端に削減した自動集計するようなアプリや画像収集整列表示とか、SOAP-Javaアプレット連動の本社提供の認証機能とかの取入れとか作ったことあります。趣味の方ではラジオシャークというラジオをUSBデバイスコントロールして音を聞いたり録音したり、途中で投げ出したり、DAWのVST SDKでコードコントロールするVST作ったりしました。結局投げ出しましたけど。趣味の世界では世の中の役に立つようなアプリを提供したことはないと自負しております。管理人のプログラムセンスでは、世の中を相手にすると苦情しかこない予感。組織の中でぬくぬくと使ってもらった方が言い訳もできるし、バグだしとかもある程度いい加減でもいいし、プログラムが誰かの役に立つのは楽しいね。とくに短いプログラムが意外と有用だったりするときはラクチンでプログラム知っててよかった!ってことはある。はい、自己自慢ここまで!これ以上はどんなことをやったかは企業秘密!教えない。


サンプルコードをスマホブラウザからみると、とてつもなく見辛いようになっています。IE最新版のみで動作チェックしているだけで記事として、投稿しています。申し訳ないです。きがむいたらGeshiのCSSの改善とかやるかもしれないですが、スマホでプログラムを勉強するのは、効率悪いですし、期待出来ないです。

略語

  • CRT(C Run-Time)
ブラウン管のカソードレイチューブではなく、プログラミング技術としてCRTと表記がある場合は、Cランタイムのことです。実行時に動的に読み込むライブラリを配布しています。WindowsのVersionによっては最初からインストールされているライブラリだったり、そうでなかったりします。CRTリファレンスのような記載がある場合では、C言語関数あるいは++が省略されて、C++言語関数のことを意味し、そのリファレンスですから手引書、参考書、参照ということで、C言語、C++言語説明書と捉えて良いでしょう。動的に呼び出すのではなく、exeに取り込むこともできますが、特別な理由が無い限りは動的に呼び出しをする方式を使います。


※サンプルコードには行番号が付与されているため、コピペする場合は、正規表現置換をサポートしているエディタで
(^[1]\.|\r\n[0123456789]{1,3}?\.)を空に変換する置換を実施して下さい。
TerapadというテキストエディタとSpeeeeedとBREGEXP.DLLという正規表現検索アプリを組み合わせて使うのも良いでしょう。

名前 Speeeeedで置換(&R)
実行ファイル C:\…\Speeeeed.exe
コマンドラインパラメータ %t.txt
作業フォルダ 未入力
キー なし

ファイルの上書き保存しない。
□非選択時は使用不可 □起動時に実行
■終了まで待機する ■メインメニューに表示 ■ポップアップメニューに表示。
※ただし、Windows環境に限る。Macは持ってないのでやり方は知りません。コツコツ消したりしなきゃなんないのかなぁ
(;´・д・)ダトシタラタイヘン…ゴメポ

そんなことしなくても、タブのソースを表示でwikiのソース表示をしてテキストボックスからプログラム部分を見つけてコピペした方が早いし、確実でした。(汗。

プログラム基本技術

制御構造(if for switch while goto…)や記述形式(; () {} 演算子 演算子優先度…)および変数の宣言や定義(int float double short unsigned volatile const static register char…)および標準入出力命令(scanf printf フォーマット記述子)のような基本的な部分の説明は省略します。


このC++の記事では、プログラムを実際に動かしてみて習得しようとすべき内容が多く含まれていますが、管理人はVisual Studio2012 Proを利用しています。したがってVisual Studio2012の基本的な利用方法を習得しているものとして、説明している節がいくつかあります。ときどき基本的ではないかもしれないと思う部分については、説明を付け加えていますが、サンプルプログラムの組み方が分からない人は、おそらくVisual Studioや各種開発環境の基本的な操作方法を習得していないことが起因していると思われます。Visual Studioの基本的な操作方法の記事はこのサイトで作成の予定ですが、基本的な操作手順について習得が必要な場合は、他サイトで習得するなりする必要があります。ご了承下さい。

VisualStudio2019からstdafx.hは新規プロジェクト作成をしても生成されなくなりました。

 サンプルプログラムの多くは過去のVisualStudioで作成し、VisualStudioは無料だし、きっとここの記事を読む人も同じ環境になっていると思っている節がありましたが、割かし、意外な変更がなされて、サンプルプログラムが動かなくなることがあるんだなと思いました。stdafx.hはもともとプリコンパイル済みヘッダファイルを纏めて記述しておくためのものだったのですが、Microsoftさんは「自分で作りなさい」っていうスタンスに変わったのかなと思います。以前だと、プロジェクトを作成すると自動でstdafx.hが作られ、main関数のあるファイルの先頭でstdafx.hがインクルードされていました。そして、stdafx.hファイルの中で主要なヘッダファイル(#include <stdio.h>とか<windows.h>とか)がさらにインクルードされていました。インクルードについてはC ディレクティブの記事を参照していただくとして、stdafx.hがあるサンプルプログラムについては#include <cstdio>と書き換えておいてもらえれば、動作します。有名なインクルードである#include <stdio.h>を使った場合でも動作しますが、stdio.hは古いヘッダファイルとなっています。むかしからある書籍のほとんどはstdio.hを読み込むような記述になっていますが、これからは#include <cstdio>を使った方がよいと思います。Windowsデスクトップウィザードというテンプレートを使ってプロジェクトを作成した場合、プリコンパイル済ヘッダファイルを使うという設定にするとpch.hというヘッダファイルが生成され、#include "pch.h"がmain関数のあるファイルの中で呼び出されるような形式になります。pch.hには何も新たにヘッダファイルを読み込む設定がなく、まったくの空のヘッダファイルになっています。自分で記述して作成することになっています。詳しくは、Cpp プリコンパイル済ヘッダーファイルの記事にも記載したいと思います。

Cにもあった技術

C標準ライブラリ ヘッダーファイル一覧 Powered by port70.net

C標準ライブラリ ヘッダーファイル一覧 Powered by port70.net Google翻訳 n1570.htmlを閲覧すると良いです。難しめのC言語の全体の説明書になっています。 C標準ライブラリ ヘッダーファイル一覧 Powered by port70.net Bing翻訳

<assert.h> <math.h> <stdlib.h>
<complex.h> <setjmp.h> <stdnoreturn.h>
<ctype.h> <signal.h> <string.h>
<errno.h> <stdalign.h> <tgmath.h>
<fenv.h> <stdarg.h> <threads.h>
<float.h> <stdatomic.h> <time.h>
<inttypes.h> <stdbool.h> <uchar.h>
<iso646.h> <stddef.h> <wchar.h>
<limits.h> <stdint.h> <wctype.h>
<locale.h> <stdio.h>

C プリプロセッサ

C マクロ
C プリプロセッサ演算子
C ディレクティブ
C プラグマ

C sizeof演算子
C 列挙型
C 論理演算
C 構造体
C 共有体
C ビットフィールド
C ポインタ
C 関数ポインタ
C 文字列
C 文字列配列※2次元配列
C 日本語文字列
C 文字列操作 ※注(500KByteくらいある長い記事です。
C -> アロー演算子
C キャスト※型変換

C++からの技術

C++の規格には通称C++98/C++03/C++TR1/C++11/C++14と存在し改良が執筆時点でも進められています。VisualStudio2013および2015でもすべての規格を取り込んではいません。主にC++11とC++14のいくつかの追加された機能を取り込んでいる状態です。




アルゴリズム <algorithm> <cstdlib>1-1 <numeric>
アトミック操作 <atomic>2-1
Cライブラリラッパ <cassert>3-1 <ccomplex>4-1 <cctype>5-1 <cerrno> <cfenv>6-1
<cfloat>7-1 <cinttypes>8-1 <ciso646> <climits>9-1 <clocale>
<cmath>10-1 <csetjmp>11-1 <csignal>12-1 <cstdalign> <cstdarg>13-1
<cstdbool> <cstddef>14-1 <cstdint>15-1 <cstdio>16-1 <cstdlib>1-2
<cstring>17-1 <ctgmath> <ctime>18-1 <cuchar>19-1 <cwchar>20-1
<cwctype>21-1
概念 <concepts>
シーケンスコンテナ <array> <deque> <forward_list> <list> <vector>
順序付けされた連想コンテナ <map> <set>
順序無しの連想コンテナ <unordered_map> <unordered_set>
コンテナアダプタ <queue> <stack>
コンテナビュー <span>
エラーと例外処理 <cassert>3-2 <exception>22-1 <stdexpect> <system_error>
一般的なユーティリティ <any> <bitset> <charconv> <cstdlib>1-3 <execution>
<functional> <memory>23-1 <memory_resource>24-1 <optional> <ratio>25-1
<scoped_allocator> <tuple> <type_traits> <typeindex> <utility>
<variant>
I/Oと書式設定 <cinttypes>8-2 <cstdio>16-2 <filesystem> <fstream> <iomanip>
<ios> <iosfwd> <iostream> <istream> <ostream>
<sstream> <streambuf> <strstream> <syncstream>
Iterators <iterator>
言語のサポート <cfloat>7-2 <climits>9-2 <codecvt> <compare> <corroutine>
ローカリゼーション <csetjmp>11-2 <csignal>12-2 <cstdarg>13-2 <cstddef>14-2 <cstdint>15-2
<cstdlib>1-4 <exception>22-2 <initializer_list> <limits>9-2 <new>26-1
<typeinfo> <version>
数値演算と数値 <bit> <cfenv>6-2 <cmath>10-2 <complex>4-2 <cstdlib>1-5
<limits>9-3 <nemeric> <random> <ratio>25-2 <valarray>
メモリ管理 <allocators> <memory>23-1 <memory_resource>24-2 <new>26-2
マルチスレッド <atomic>2-2 <condition_variable> <future> <mutex>
<shared_mutex> <thread>
範囲 <ranges>
正規表現 <regex>27-1
文字列と文字データ <cctype>5-2 <cstdlib>1-6 <cstring>17-2 <cuchar>19-2 <cwchar>20-2
<cwctype>21-2 <regex>27-2 <string> <string_view>
時刻 <chrono> <ctime>18-2

※1-x~27-xの数字はカテゴリ別で重複しているヘッダファイルです。重複したヘッダファイル同士は同じ番号が付与されています。続く後ろの-の後ろの番号は同じヘッダファイルの通し番号です。


 C言語をかるく勉強した程度の知識で上記の規格対応表にある新機能の説明を読んでもほとんど理解できないかもしれませんが、最初はわからなくても生きていけます。キニシナイ。こうなってるよ程度の説明です。上記のようなことを理解していくための本記事です。

□のついている項目は記事の中身が無いです。

□の隣にあるような記事は書きかけの記事の可能性が高いです。

標準入出力関数(cin cout << >> )に関する説明は省略します。

Cpp プリコンパイル済ヘッダーファイル

Cpp bool型
Cpp NameSpace
Cpp Using
Cpp New演算子
Cpp Delete演算子
Cpp 参照………………………………………………※ 型名& のような指定で宣言される変数の型 例 int& n
Cpp 右辺値参照………………………………………※ 型名&& のような指定で宣言される変数の型 例 int&& n
Cpp 引数規定値
Cpp インライン関数………………………※定義部分に処理内容を記述
Cpp クラス
Cpp クラス アクセス指定子
Cpp クラス メンバ変数
Cpp クラス メンバ変数ポインタ
Cpp クラス メンバ関数
Cpp クラス メンバ関数ポインタ
Cpp クラス 静的メンバ変数………………………※グローバル変数のような扱い方をする変数
Cpp クラス 静的メンバ関数………………………※グローバル変数のような扱い方をする関数
Cpp クラス const
Cpp クラス thisポインタ…………………………※クラスの中で、そのクラス自体を指し示すときに使われるポインタ
Cpp クラス コンストラクタ………………………※クラスの実体化後に呼び出される関数
Cpp クラス コピーコンストラクタ………………※クラスの実体化後に作られる参照
Cpp クラス デストラクタ…………………………※クラスの実体が消滅した時に呼び出される関数
Cpp クラス インライン関数………………………※定義部分に処理内容を記述
Cpp クラス オーバーロード………………………※引数の違いによる呼び出し関数の決定。多重定義。
Cpp クラス 継承……………………………………※クラスの基となるクラスから引き継ぐ形式のクラス
Cpp クラス 継承 コンストラクタ…………………※継承されたクラスのコンストラクタ
Cpp クラス 継承 アップキャスト……………………※派生クラスのポインタを基底クラスのポインタに変更できる

※ポリモーフィズム(多態性・多相性・多様性:Polymorphism)と呼ばれる働きのために必要な仕組みです。

Cpp クラス 仮想関数………………………………※実行時に関数を再定義してもよい関数を基のクラスが指定し、再定義された関数の利用の決定をする

※仮想関数の関数をプログラマが記述する行為をオーバライドって言います。オーバロードは多重定義です。

Cpp クラス 継承 デストラクタ……………………※継承されたクラスのデストラクタ
Cpp クラス 抽象クラス……………………………※必ず再定義する必要がある関数を基のクラスが指定している関数。純粋仮想関数。
Cpp クラス 多重継承………………………………※複数のクラスが継承される形式のクラス:直列型および並列型
Cpp クラス 仮想基本クラス □………………………※クラスの継承によって2重に継承される問題を解決する
Cpp クラス フレンド □………………………………※フレンドで定義した関数やクラスは非公開の関数や変数にアクセスできる。
Cpp クラス 継承 アクセス指定子 □………………※継承におけるアクセス指定子の振る舞いについて
Cpp テンプレート □…………………………………※汎用データ型の関数の定義
Cpp クラス テンプレート □…………………………※汎用データ型のクラスの定義
Cpp クラス 構造体 共有体 □………………………※クラスを利用した構造体や共有体
Cpp ラムダ式 [キャプチャ](引数)->戻り値{プログラム} C++11からの技術です。引数部分ラムダ式を使うことで引数部にプログラムを記述することもできるようになります。
Cpp 演算子のオーバーロード □……………………※演算子の動作の追加定義
Cpp typeid演算子 □…………………………………※実行時の型情報取得
Cpp 例外処理 □………………………………………※try throw catchによるエラー管理
Cpp 名前マングリング □………………………………※名前空間で同名の関数を利用できるCpp独自の関数名生成、言語間利用時注意
Cpp STL □……………………………………………※STL=Standard Template library 標準テンプレートライブラリ

C++実装技術

Cpp クラス実装例

  言語と開発環境へ戻る。



個人用ツール
名前空間

変種
操作
案内
ツールボックス