Wikibooks jawikibooks https://ja.wikibooks.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8 MediaWiki 1.44.0-wmf.4 first-letter メディア 特別 トーク 利用者 利用者・トーク Wikibooks Wikibooks・トーク ファイル ファイル・トーク MediaWiki MediaWiki・トーク テンプレート テンプレート・トーク ヘルプ ヘルプ・トーク カテゴリ カテゴリ・トーク Transwiki Transwiki‐ノート TimedText TimedText talk モジュール モジュール・トーク 小学校の学習 0 1740 264173 263841 2024-11-25T09:25:58Z ~2024-17223 85016 264173 wikitext text/x-wiki {{pathnav|メインページ|frame=1|小学校・中学校・高等学校の学習}} 「{{ruby|小学校|しょうがっこう}}の{{ruby|学習|がくしゅう}}」へようこそ! ここでは、ウィキブックスの{{ruby|人達|ひとたち}}が{{ruby|作|つく}}った、{{ruby|小学校|しょうがっこう}}の{{ruby|教科書|きょうかしょ}}を{{ruby|保管|ほかん}}しています。ただし、{{ruby|学校|がっこう}}で{{ruby|使|つか}}う{{ruby|教科書|きょうかしょ}}とは{{ruby|内容|ないよう}}が{{ruby|異|こと}}なることがあります。さあ、皆さんと学習しましょう! 「{{ruby|国語|こくご}}」や「{{ruby|理科|りか}}」など{{ruby|読|よ}}みたい{{ruby|教科|きょうか}}の{{ruby|科目名|かもくめい}}を{{Ruby|選|えら}}べば、その{{ruby|教科|きょうか}}のページヘ{{ruby|移動|いどう}}します。{{ruby|教科|きょうか}}を{{Ruby|選|えら}}んでください。 {{進捗状況}} == 小学校の教科書目録 == * [[小学校の検定教科書]]{{進捗|100%|2023-05-06}} == {{ruby|国語|こくご}} == * [[小学校国語]] {{進捗|25%|2014-04-13}} * [[小学校書写]] {{進捗|00%|2019-09-11}} == {{ruby|社会|しゃかい}} == * [[小学校社会]] {{進捗|75%|2014-04-07}} == {{ruby|算数|さんすう}} == * [[小学校算数]] {{進捗|75%|2024-11-19 }}  == {{ruby|理科|りか}} == * [[小学校理科]] {{進捗|75%|2024-11-25}} == {{ruby|生活|せいかつ}} == * [[小学校生活]] {{進捗|75%|2014-04-13}} =={{ruby|音楽|おんがく}} == * [[小学校音楽]] {{進捗|00%|2019-10-14}} == {{ruby|図画工作|ずがこうさく}}== * [[小学校図画工作]] {{進捗|00%|2013-09-30}} == {{ruby|家庭|かてい}} == * [[小学校家庭]] {{進捗|00%|2019-09-06}} =={{ruby|保健体育|ほけんたいいく}} == * [[小学校保健]] {{進捗|00%|2015-02-16}} * [[小学校体育]] {{進捗|25%|2015-02-16}} == {{ruby|外国語|がいこくご}} == * [[小学校英語]] {{進捗|00%|2019-10-09}} == {{ruby|道徳|どうとく}} == * [[小学校道徳]] {{進捗|00%|2023-01-11}} == {{ruby|総合学習|そうごうがくしゅう}} == * [[小学校総合学習]] {{進捗|50%|2013-09-30}} == 中学受験|ガイド・参考書 == もし中学受験をするならば、小学4年生ごろから受験勉強を始めるべきだといわれています。 * [[中学受験ガイド]] {{進捗|75%|2015-02-16}} * [[中学受験参考書]] {{進捗|25%|2015-02-16}} [[Category:小学校教育|しようがつこうのかくしゆう]] fnyx55cqdxlogzj12hjcsum616h5e7z PHP 0 3037 264141 263764 2024-11-24T23:11:52Z Ef3 694 /* 目次 */ # [[/名前空間|名前空間]] 264141 wikitext text/x-wiki __NOTOC__ {{pathnav|メインページ|工学|情報技術|プログラミング}} PHPはWeb開発において非常に人気のあるサーバーサイドプログラミング言語です。その理由として、PHPはシンプルで学びやすい構文を持ち、特にWebアプリケーションの開発に最適化されている点が挙げられます。また、豊富なオープンソースのフレームワークやライブラリが利用可能であり、個人開発者から大規模なプロジェクトに至るまで、広範なユーザー層に支持されています。 本書では、プログラミング初心者を対象に、PHPの基本的な概念、構文、関数の作成方法、オブジェクト指向プログラミングにおけるクラスの活用方法などを丁寧に解説しています。読者が実際に手を動かしながらコードを記述し、動作確認を行うことで、実践的なスキルを身に付けられるよう構成されています。 2024年11月現在、PHPの唯一の公式サポートバージョンはPHP 8であり、最新の機能とセキュリティ対策が導入されています<ref>{{Cite web|url=https://www.php.net/supported-versions.php|title=PHP: Supported Versions|accessdate=2024-11-08}}</ref>。本書では、PHP 8をベースに、基礎的な知識からWebアプリケーション開発に必要なスキルを順を追って学べるように設計されています。特にPHP初心者が無理なく理解できるよう、豊富なサンプルコードとわかりやすい説明を通じて、ステップバイステップで学習を進めていきます。 なお、PHP 7.4は2022年11月28日に公式サポートが終了しており、セキュリティアップデートなどの提供は行われていません<ref>{{Cite web|url=https://www.php.net/eol.php|title=PHP: Unsupported Branches|accessdate=2024-11-08}}</ref>。そのため、最新バージョンであるPHP 8の使用が推奨されます。 == 目次 == # [[/開発環境|開発環境]] # [[/コマンドラインでの活用|コマンドライン]] # [[/入門/テキスト表示とコメント|テキスト表示とコメント]] # [[/入門/変数と値|変数と値]] # [[/入門/変数の種類|データ型]] # [[/配列|配列]] # [[/制御構造|制御構造]] # [[/関数|関数]] # [[/クラス|PHPのオブジェクト指向]] # [[/名前空間|名前空間]] # [[/Webアプリケーション向けの機能|Webアプリケーション向けの機能]] # [[/ファイル入出力|ファイル入出力]] # [[/データベースとの連動|データベースとの連携]] # [[/Null安全性|Null安全性]] # [[/ジェネリックプログラミング|ジェネリックプログラミング]] # [[/新機能|バージョンごとの新機能]] # [[/改廃された技術|改廃された技術]] == 脚註 == {{Wikipedia|PHP (プログラミング言語)}} <references /> [[Category:PHP|*]] [[Category:プログラミング言語]] {{NDC|007.64}} qogjwpijl0siaty0sh27h7ozxzbjett 264142 264141 2024-11-24T23:22:16Z Ef3 694 /* 目次 */ # [[/エラーハンドリング|エラーハンドリング]] # [[/セキュリティ|セキュリティ]] # [[/HTTPリクエストとAPI|HTTPリクエストとAPI]] # [[/テスト|テスト]] # [[/パフォーマンス|パフォーマンス]] 264142 wikitext text/x-wiki __NOTOC__ {{pathnav|メインページ|工学|情報技術|プログラミング}} PHPはWeb開発において非常に人気のあるサーバーサイドプログラミング言語です。その理由として、PHPはシンプルで学びやすい構文を持ち、特にWebアプリケーションの開発に最適化されている点が挙げられます。また、豊富なオープンソースのフレームワークやライブラリが利用可能であり、個人開発者から大規模なプロジェクトに至るまで、広範なユーザー層に支持されています。 本書では、プログラミング初心者を対象に、PHPの基本的な概念、構文、関数の作成方法、オブジェクト指向プログラミングにおけるクラスの活用方法などを丁寧に解説しています。読者が実際に手を動かしながらコードを記述し、動作確認を行うことで、実践的なスキルを身に付けられるよう構成されています。 2024年11月現在、PHPの唯一の公式サポートバージョンはPHP 8であり、最新の機能とセキュリティ対策が導入されています<ref>{{Cite web|url=https://www.php.net/supported-versions.php|title=PHP: Supported Versions|accessdate=2024-11-08}}</ref>。本書では、PHP 8をベースに、基礎的な知識からWebアプリケーション開発に必要なスキルを順を追って学べるように設計されています。特にPHP初心者が無理なく理解できるよう、豊富なサンプルコードとわかりやすい説明を通じて、ステップバイステップで学習を進めていきます。 なお、PHP 7.4は2022年11月28日に公式サポートが終了しており、セキュリティアップデートなどの提供は行われていません<ref>{{Cite web|url=https://www.php.net/eol.php|title=PHP: Unsupported Branches|accessdate=2024-11-08}}</ref>。そのため、最新バージョンであるPHP 8の使用が推奨されます。 == 目次 == # [[/開発環境|開発環境]] # [[/入門/テキスト表示とコメント|テキスト表示とコメント]] # [[/入門/変数と値|変数と値]] # [[/入門/変数の種類|データ型]] # [[/配列|配列]] # [[/制御構造|制御構造]] # [[/関数|関数]] # [[/クラス|オブジェクト指向]] # [[/名前空間|名前空間]] # [[/ファイル入出力|ファイル入出力]] # [[/データベースとの連動|データベースとの連携]] # [[/Webアプリケーション向けの機能|Webアプリケーション向けの機能]] # [[/エラーハンドリング|エラーハンドリング]] # [[/セキュリティ|セキュリティ]] # [[/HTTPリクエストとAPI|HTTPリクエストとAPI]] # [[/テスト|テスト]] # [[/パフォーマンス|パフォーマンス]] # [[/Null安全性|Null安全性]] # [[/ジェネリックプログラミング|ジェネリックプログラミング]] # [[/新機能|バージョンごとの新機能]] # [[/改廃された技術|改廃された技術]] == 脚註 == {{Wikipedia|PHP (プログラミング言語)}} <references /> [[Category:PHP|*]] [[Category:プログラミング言語]] {{NDC|007.64}} 786wvx8p3lyuhuwu7ted5edto6q1ave 264149 264142 2024-11-24T23:53:49Z Ef3 694 /* 目次 */ # [[/コマンドラインでの活用|コマンドラインでの活用]]# [[/型ジャグリング|型ジャグリング]] 264149 wikitext text/x-wiki __NOTOC__ {{pathnav|メインページ|工学|情報技術|プログラミング}} PHPはWeb開発において非常に人気のあるサーバーサイドプログラミング言語です。その理由として、PHPはシンプルで学びやすい構文を持ち、特にWebアプリケーションの開発に最適化されている点が挙げられます。また、豊富なオープンソースのフレームワークやライブラリが利用可能であり、個人開発者から大規模なプロジェクトに至るまで、広範なユーザー層に支持されています。 本書では、プログラミング初心者を対象に、PHPの基本的な概念、構文、関数の作成方法、オブジェクト指向プログラミングにおけるクラスの活用方法などを丁寧に解説しています。読者が実際に手を動かしながらコードを記述し、動作確認を行うことで、実践的なスキルを身に付けられるよう構成されています。 2024年11月現在、PHPの唯一の公式サポートバージョンはPHP 8であり、最新の機能とセキュリティ対策が導入されています<ref>{{Cite web|url=https://www.php.net/supported-versions.php|title=PHP: Supported Versions|accessdate=2024-11-08}}</ref>。本書では、PHP 8をベースに、基礎的な知識からWebアプリケーション開発に必要なスキルを順を追って学べるように設計されています。特にPHP初心者が無理なく理解できるよう、豊富なサンプルコードとわかりやすい説明を通じて、ステップバイステップで学習を進めていきます。 なお、PHP 7.4は2022年11月28日に公式サポートが終了しており、セキュリティアップデートなどの提供は行われていません<ref>{{Cite web|url=https://www.php.net/eol.php|title=PHP: Unsupported Branches|accessdate=2024-11-08}}</ref>。そのため、最新バージョンであるPHP 8の使用が推奨されます。 == 目次 == # [[/開発環境|開発環境]] # [[/入門/テキスト表示とコメント|テキスト表示とコメント]] # [[/入門/変数と値|変数と値]] # [[/入門/変数の種類|データ型]] # [[/配列|配列]] # [[/制御構造|制御構造]] # [[/関数|関数]] # [[/クラス|オブジェクト指向]] # [[/名前空間|名前空間]] # [[/ファイル入出力|ファイル入出力]] # [[/データベースとの連動|データベースとの連携]] # [[/Webアプリケーション向けの機能|Webアプリケーション向けの機能]] # [[/型ジャグリング|型ジャグリング]] # [[/エラーハンドリング|エラーハンドリング]] # [[/セキュリティ|セキュリティ]] # [[/HTTPリクエストとAPI|HTTPリクエストとAPI]] # [[/テスト|テスト]] # [[/パフォーマンス|パフォーマンス]] # [[/Null安全性|Null安全性]] # [[/ジェネリックプログラミング|ジェネリックプログラミング]] # [[/コマンドラインでの活用|コマンドラインでの活用]] # [[/新機能|バージョンごとの新機能]] # [[/改廃された技術|改廃された技術]] == 脚註 == {{Wikipedia|PHP (プログラミング言語)}} <references /> [[Category:PHP|*]] [[Category:プログラミング言語]] {{NDC|007.64}} gtptk8c0eq50lc8r5z7xb3upnbn93ff 小学校理科/4学年 0 3845 264131 236300 2024-11-24T16:45:30Z はいかぐら 45848 264131 wikitext text/x-wiki {{Pathnav|小学校・中学校・高等学校の学習|小学校の学習|小学校理科|frame=1}} == 季節と動物・植物のようす == {{Ruby|季節|きせつ}}がちがうとさまざまなちがいがありますね。植物を育てたり、身近なところにいたりあったりする動物や植物を{{Ruby|観察|かんさつ}}したりして、季節の変化と生き物の様子を調べてみましょう。 春では、いろいろ種類の、こん虫が、多くなる。チョウや、テントウムシや、ミツバチなども多いです。 夏では、セミの成虫やカブトムシの成虫が、多くなります。 秋では、スズムシの成虫やコオロギの成虫が鳴くようになります。秋には、トンボも多いです。 スズムシは「リーンリーン」となきますが、これは、はねがこすれている音です。 秋になると、ススキに、ほが、なります。 エノコログサにも、ほがなります。エノコログサとは、ネコジャラシのことです。 秋になると、春には多かったテントウムシやミツバチなどは、秋には少なくなります。うごきも、おそいです。 テントウムシなどは、見当たらなくなりますが、死んだわけではなく、落ち葉のかげなどに、ひそんでいることがおおいです。 テントウムシやハチの冬ごしは、成虫のまま、冬をこします。 コオロギや、バッタやカマキリは、秋の間にたまごを、うみます。 コオロギやバッタは、めすが、土の中に、たまごをうみつけます。 カマキリは、めすが、木のえだなどに、たまごをうみつけます。たまごをうみつけたあとに、あわのような物で、たまごをおおいつくします。 野生のコオロギの成虫やバッタの成虫やカマキリの成虫は、冬をこせずに、死にます。 冬をこせない理由は、虫は、人間やイヌやネコなどとはちがって、体温を調節できずに、体がつめたくなってしまうからです。 また、冬は、多くの草がかれるので、虫にとってはエサになる草が、へってしまうのも、冬をこすのがむずかしい理由のひとつです。 冬には、こん虫が、ほとんど見られません。 アゲハやモンシロチョウは、さなぎで、冬をこします。 テントウムシやハチの冬ごしは、成虫のままで、冬をこします。 コオロギやバッタ、カマキリは、たまごで、冬をこします。 カエルは、土の中などで、じっと、カエルの親が、しずかにしています。このように、冬のあいだ、巣(す)などで、じっとしずかにしていることを <span style="font-size: large">冬みん</span>(とうみん、冬眠) といいます。カエルは、冬には、冬みん(とうみん)をしています。 アメリカザリガニは、土の中で、冬みんします。 土の中にいるのは、外よりも、土のなかのほうが、あたたかいからです。 クマも、冬みんします。 季節に関していうと、ほとんどの植物は、春や夏に、育つ植物が多い。冬のあいだは、植物は、せいちょうが止まることが多いです。 昆虫や虫には、植物の葉や、花のみつなど、植物をエサにしているものが多く、これらの葉や花は、春や夏に多いので、昆虫や虫も、春や夏に、多く、ふえます。 * ヘチマ まきひげという、ぼうなどがちかくにあると、それにまきつくようなものがでてくる。 ヘチマは、明るい場所で育ちます。 * 秋の植物 秋になって、すずしくなると、木は、葉の色がかわる。葉の色は、植物の種類によるが、カエデでは葉が赤くなる。イチョウでは、葉がきいろくなる。 秋になって、まず、葉の色がかわりますが、さらにすずしくなると、多くの種類(しゅるい)の木は、葉をおとします。 秋ごろに植物が葉をおとすことを <span style="font-size: large">落葉</span>(らくよう) という。 だが、じつは、種類によっては、葉をおとさない植物もあります。 マツやスギは、秋になって、すずしくなっても、葉をおとさない。このような葉をおとさない木を <span style="font-size: large">じょう緑じゅ</span>(じょうりょくじゅ、常緑樹) という。ヒノキやサザンカも常緑樹である。 いっぽう、カエデやイチョウやサクラは、あきになると、落葉して、葉をおとす。このような葉をおとす木を、<span style="font-size: large">落葉じゅ</span>(らくようじゅ、落葉樹)という。 落葉では、その木の、すべての葉をおとします。 <gallery widths="250px" heights="250px"> File:Red maple leaf.jpg|カエデの紅葉した葉。 ファイル:Ginkgo Tree 08-11-04a.jpg|イチョウ。イチョウは、秋(あき)には、葉(は)が、きいろくなる。黄葉。 ファイル:Ginkgo Tree Ginkgo biloba Leaves Rock 3008px.jpg|イチョウの葉。 </gallery> == 電池のはたらき == === かん電池と豆電球 === === 回路記号(かいろ きごう) === 電気回路(でんきかいろ)の配線(はいせん)を、図(ず)で説明(せつめい)するときに、毎回、写真のようなそっくりな絵で説明すると、せつめいする作業が、たいへんな手間になるので、記号(きごう)が回路図をかくときに、もちいられます。 :[[画像:直流電源.png|thumb|かんでんち。<br>ながいがわが、プラスきょくです。<br>みじかいがわが、マイナスきょくです。]] 電池にはプラス極(プラスきょく)とマイナス極(マイナスきょく)があるが、回路記号では線が長い方がプラス極です。じっさいの電池では、でっぱりのある側(がわ)がプラス極です。回路図で、短いがわは、マイナス極です。 この記号は、おぼえてください。どちらがプラス極(きょく)の側なのかも、おぼえてください。 まちがえて、ぎゃくにおぼえやすいので、注意(ちゅうい)してください。 :※ 回路図(かいろず)の、電池(でんち)の記号(きごう)の、みじかい部分が、電池のプラス極のでっぱりに見えて、まちがえてみじかいほうをプラスとおぼえてしまうことがある。これは、まちがいです。 正しい記号の意味を、もういちど、書きます。電池の回路記号で、ながいほうが、プラス極です。回路記号で、短いがわは、マイナス極です。 かん電池に豆電球とスイッチをつなぐと、あかりをつけたり消したりできます。また、モーターをつなぐと回転させることもできます。豆電球やモーターを使って、かん電池のはたらきを調べよう。 さて、豆電球はかん電池とつなぐとあかりがつきます。モーターはかん電池とつなぐと回転します。 このあかりや回転をもっと明るくしたり、速くしたりできないのでしょうか。 「かん電池をふやせばいい」、多くの人がそう答えると思います。でも、かん電池を増やしたからといって、かならず豆電球が明るくなったり速くモーターが回ったりするわけではありません。まず、+(プラス)極から-(マイナス)極へともどってくるように、輪になるようにつながなければ電気は流れません。電池をいくつかつなぐ方法のしゅるいを2つしょうかいします。 === 電池のつなぎかた === * 直列(ちょくれつ)つなぎ :かん電池を +- +- ・・・・・・とじゅん番にならべてつなぎます。かん電池をふやすとたくさんの電気が流れますので、豆電球は明るくなります。<br>-+ +-や、+- -+ と、かん電池をつないでも、電気は流れません。かん電池やどう線が熱くなったりもえたりするので!やらないようにしましょう。 :[[画像:直列接続.png|thumb|left|直列つなぎ。<br>右側がプラス極に、つながっている。]] {{clear}} * 並列(へいれつ)つなぎ :かん電池を横にならべて+極どうし、-極どうしをつなぎます。そして、+極をつないだどう線と-極をつないだどう線をモーターや豆電球につなぎます。豆電球の明るさやモーターの速さは変わりませんが、かん電池は長持ちします。 :[[画像:並列接続.png|thumb|left|並列つなぎ<br>右側がプラス極に、つながっている。]] {{clear}} ::※ 本書で、つぎにおしえる「ていこう」は、小学校では習わないかもしれませんが、ウィキペディアでの、画像の用意のつごうで、豆電球の回路図が見当たらないので、かわりに「ていこう」をもちいた回路図を、しょうかいします。豆電球をもちいた回路図については、市販(しはん)の参考書(さんこうしょ)などを参照(さんしょう)してください。なお、中学校では、「ていこう」を習うはずです。 電気を流れにくくする物体のことを、ていこう(抵抗)といいます。 <gallery> File:3 Resistors.jpg|ていこう 画像:jun_high_sci_electrical_resistance.svg|ていこうの記号。 </gallery> 電池と抵抗だけをつないだ簡単な回路図を、れいに、しめします。 :[[画像:jun_high_sci_simple_circuit.svg|thumb|left|かいろず]] {{clear}} ていこうの記号は、昔(むかし)と今(いま)とでは、じつは、記号がちがいます。小学生は、あたらしいほうの、記号をおぼえてください。あたらしいほうは、はこ型の四角い記号が、あたらしい「ていこう」の記号です。ギザギザしたほうは、昔の「ていこう」の記号です。 <gallery> ファイル:Resistor_symbol_IEC.svg|・ いま(せいれき2013年)での、ていこうの図記号 ファイル:Resistor_symbol_America.svg|・ むかしの、ていこうの図記号 </gallery> {{clear}} ていこうの、直列つなぎと並列つなぎを、図にすると、つぎのようになります。 :(※ 画像では、「ていこう」の記号は古いギザギザのほうになっていますが、これから中学生になる小学生は、新しいハコ形の記号で「ていこう」を書いてください。ウィキペディアの画像の用意の都合で、古いほうのギザギザ記号での紹介になっています。) <gallery widths="300px" heights="100px"> ファイル:Resistors in series.svg|「ていこう」の直列つなぎ ファイル:Resistors in parallel.svg|「ていこう」の並列つなぎ </gallery> {{clear}} * まめでんきゅう 豆電球(まめでんきゅう)の回路図は、以下のようになります。 [[画像:Symbol Visual indicator1.svg|100px|thumb|left|まめ電球の、記号(きごう)。]] ○の中に、×を書いた記号ですね。×の、はしは、そとがわの丸に、くっついています。 ばってんの線は、丸から、はみださずに、書いてください。 {{clear}} * 回路図の図記号 小学校の3年や4年あたりで、つかうことになるかもしれない部品の、回路図の図記号を書きます。 <gallery> ファイル:電池.svg|電池、長いがわがプラス極) ファイル:SPST-Switch.svg|スイッチ File:3wayswitch.svg|3極スイッチ File:Symbole moteur.png|モータ File:Wire Junction.svg|接続(せつぞく)している交点(こうてん)。 File:Wire Cross.svg|配線が接続せず、十字に、かさなっているだけの場合。 File:Symbol Visual indicator1.svg|電球 File:Symbole amperemetre.png|電流計(でんりゅうけい) File:Symbole voltmetre.png|電圧計(でんあつけい) </gallery> 電流計(でんりゅうけい)や、電圧計(でんあつけい)は、回路にながれている電気のせいしつをはかる道具です。電流計や電圧計は、使い方をまちがえると、こわれます。 学校(がっこう)の授業(じゅぎょう)の計画(けいかく)にもよりますが、学校の理科のじっけんで、もしかしたら、電流計や電圧計を、つかうかもしれません。 電流計や電圧計をつかうときは、学校の先生の指示(しじ)にしたがって、正しいつかいかたで、つかってください。 もし、理科の実験で、電流計(でんりゅうけい)などをつかわないとしても、その理由は、きっと、小学校の児童(じどう)が、電流計をこわさないように心配したからなので、きちんとした理由があってのことです。小学生のかたは、学校では、先生の授業(じゅぎょう)の計画(けいかく)に、したがってください。 <span style="font-size: large">電流</span>(でんりゅう) とは、回路がつながっているときの、かん電池とどう線の中での、電気のながれのことです。電気は、プラスきょくから出てきて、どう線を通って、マイナスきょくにもどるのでしたね。電流の単位は <span style="font-size: large">アンペア</span> です。アンペアは記号で、「A」とかきます。 <span style="font-size: large">電圧</span>(でんあつ )とは、電流をながそうとする、つよさ(強さ)のことです。電圧の単位は <span style="font-size: large">ボルト</span> です。ボルトは記号で <span style="font-size: large">V</span> と書きます。ふつうの乾電池(かんでんち)の電圧は、だいたい1.5Vくらいです。 {{clear}} == 月と、太陽と、わく星 == [[File:Mountain Moonset.jpg|thumb|月。]] [[File:月の見え方.png|thumb|400px|月の見え方]] 月があかるいのは、月が太陽の光に、てらされているからです。月の表面(ひょうめん)のうち、太陽の光をあびている面が、明るく見えるので、地球から、見ることができます。月のうち、太陽にてらされていない、かげになっているほうの面は、地球からは、くらくて、見えません。 つまり、月は太陽の光を <span style="font-size: large">反射</span>(はんしゃ) しています。(※ 反射 ・・・ はねかえすこと。) 太陽のように、その星から光をはっしている星を、 <span style="font-size: large">こう星</span>(こうせい、恒星) といいます。いっぽう、月そのものは光を発していないので、月は こう星では、ありません。 地球から見た、月のうごきかたは、太陽と同じように、'''東の空から南の空を通り、西の空にしずんでいきます'''。また、月の形には、まるい円のかたちの <span style="font-size: large">'''満月'''</span>(まんげつ) と、はんぶんの <span style="font-size: large">'''半月'''</span>(はんげつ) と、もっとほそい <span style="font-size: large">'''三日月'''</span>(みかづき) や <span style="font-size: large">'''26日の月'''</span> があります。 月は、三日月や満月などいろいろな形に見えますが、動き方は同じで、どの月も東の空から南の高い空を通り、西の空へ動きます。 [[File:月の一日の動き 上弦の月svg.svg|thumb|400px|left|月の1日の動き 上げんの月。午後6時に南中している。月は、東からのぼって、西にしずむ。]] 南の空で、月がもっとも高くなるので、月がもっとも高くなることを<span style="font-size: large">'''南中'''</span>(なんちゅう)といいます。 南中している月は、文字どおり、南に月があります。 満月を見るには、夕方に東からのぼるのが見え、夜中に南の空を通って、朝に西にしずみます。 三日月は、夜中でないと見えません。三日月は、朝や昼間に東からのぼっているのですが、太陽の光で地球が明るいので、朝や昼間の東からあがったばかりの月は見えません。夜中になると、西の空にしずもうとしている三日月が見えます。 半月には、午前中に見える '''下げんの月'''(かげんのつき) と、午後に見える '''上げんの月'''(じょうげんのつき) があります。 上げんの月は、右がわが明るく見える半月です。下げんの月は、左がわが明るく見える半月です。 *上げんの月 上げんの月は昼に、東からのぼり、夕方に南の空を通って、夜中、西にしずみます。 上げんの月は、昼間でも、東の空で しろっぽい上げんの月が見えます。 [[File:月の一日の動き 上弦の月svg.svg|thumb|400px|left|月の1日の動き 上弦の月]] {{-}} *下げんの月 下げんの月はま夜中に、東からのぼり、朝の6時ごろに南の空を通って、午前の11時ごろに西にしずみます。 下げんの月は、昼の午前11時ごろでも、西の空に、しろっぽい 下げんの月 が見えます。正午には、下げんの月は、しずんでいます。 [[File:月の一日の動き 下弦の月.svg|thumb|400px|left|下げんの月 の 1日のうごき ]] {{clear}} <gallery widths="200px" heights="200px"> Image:ComputerHotline - Lune (by) (9).jpg|三日月。(天体ぼうえんきょうで見たばあい。) ファイル:HalfMoon.jpg|半月。(天体ぼうえんきょうで見たばあい。) ファイル:Full moon.png|満月。(天体ぼうえんきょうで見たばあい。) </gallery> 月が、すべてかけてしまって、みえないときの月を '''新月'''(しんげつ) といいます。 {{clear}} 太陽と月の、それぞれの場所によって、地球から見える月の形が、かわって見えます。 [[Image:Moon phases en.jpg|thumb|center|nofloat|500px|月の見え方。]] 月の見える形は、毎日、すこしずつ、かわっていきます。かわる順番(じゅんばん)は、満月から始めたとすると、 :満月 → 下弦の月 → 26日の月 → 新月 → 上弦の月 → 次の満月 と、かわっていきます。 だいたい約30日で、はじめの満月から次の満月までを、くりかえします。 [[ファイル:Lunar crater Daedalus.jpg|thumb|月のクレーター。]] 月の表面に見える、黒く見える丸い穴を'''クレーター'''と言います。でこぼこした、くぼみがあります。 クレーターが出きた理由は、いん石(いんせき、隕石)が、ぶつかったからだろう、と考えられています。 クレーターとはべつに、月の表面の、黒く見えるあたりを <span style="font-size: large">海</span>(うみ) といいます。「海」と言っても、月の海には、水はありません。 そもそも、月には、水がありません。月には、空気も、ありません。 月の表面には、海がいっぱいあるけど、裏には、ほとんどありません。 月の表面の、白く見える部分を<span style="font-size: large">陸</span>(りく)と、いいます。 {{clear}} == 星座 == [[ファイル:Pegasus constellation map.svg|thumb|ペガスス座]] 夜空には、月だけでなく星もありますね。昔の人は、その中でもとくに明るい星に注目して、その集まりをいろいろな人や動物、道具に見立てて名前をつけていました。これを '''星座'''(せいざ) といいます。よくうらないで目にする12星座もその一部です。七夕の物語のように星や星座にはいろいろな神話やお話があります。星座は全部で88個です。日本からは、およそ50個の星座を見ることができます。 :※ 星うらない(ほしうらない)には、科学的な根きょはありません。 季節によって、見える星座がかわるばあいがあります。 北極星という北の空にある星と、そのまわりにある北の空の星座は、一年中、みることができます。 南の空や、東や西の空の星座は、季節によってかわります。 地球は、じつは、'''北極'''(ほっきょく)と'''南極'''(なんきょく)を中心にして、まわっています。このような、北極と南極を中心とした回転を'''自転'''(じてん)といいます。 日本は、地球の北がわの'''北半球'''(きたはんきゅう)にあるので、日本からは北極の方角にある空が見えます。南極のほうの空は、日本からは地面にかくれて見えません。地球儀(ちきゅうぎ)で、日本と南極とを糸で結んで、まっすぐに糸をのばすと、地球は丸いので、糸も丸くなりますよね。糸は丸くなれても、人間の目でみる方向は、まっすぐにしか見れません。 つまり、日本から見た南の空は、じつは、日本と南極とを結ぶ線の上にある赤道(せきどう)に向かった方角なのです。 いっぽう、南の空にある、春の星座は、いっぱんに秋にはまったく見ることができません。南の空にある、夏の星座は、冬には見られません。南の空にある、秋の星座は、春には見えません。南の空にある、冬の星座は、夏には見えません。 これは、日本が北半球にあるからです。 もし、南半球にある国の人たちが星座を見たら、南半球ではは、南の空にある星座は一年中、おなじになります。 南半球では、北の空の星座が、季節によって、かわります。 この本では、とくにことわらないかぎり、日本がある北半球にある日本から見た星座について書いています。 星座を夜の空に、さがすときは、明るい星を、手がかりにして、さがすと、さがしやすいと思います。 === 北の空の星座 === [[ファイル:Ursa Major constellation detail map.PNG|thumb|left|北斗七星(ほくと しちせい)]] [[ファイル:Cassiopeia constellation map.svg|thumb|カシオペヤ座。「W」のような形をしている5個の星が、カシオペヤ座。]] 日本から、北の空を見ると、 北斗七星(ほくと しちせい) と カシオペヤ座 が見える。 北斗七星の形は、「ひしゃく」という水をくむための道具のような形をしています。 [[Image:ItsukushimaDipperBasin7431.jpg|thumb|200px|left|ひしゃく]] そして、カシオペヤ座は、5個の星が「W」のような形で、ならんでいる星座です。 ま北の方角に、北極星があります。これは、時間がたっても、うごきません。なので、方角を知るときに、たいせつな星です。 これらの北の空の星は、一年中を通して、日本から、夜に見ることができます。 北極星は北斗七星やカシオペヤ座を利用して探すことができます。 北斗七星の「ひしゃく」の口の2つの星を結んで5倍に伸ばしたところに北極星があります。 なお、北斗七星は、星座ではなく、おおぐま座の一部です。 北極星は、星座ではなく、こぐま座の一部です。こぐま座の、しっぽの先が北極星になっています。 北極星は、一年中、見えるのですから、こぐま座もしっぽの先と、その近くは、一年中、見えるのです。 {{clear}} === 星座早見 === [[ファイル:planisphere.jpg|thumb|left|星座早見]] 夜空で星座をさがすのには、 星座早見(せいざ はやみ) という道具がべんりです。また、プラネタリウムや天文台では、ふだん目にすることのできないような星や宇宙の勉強ができます。では、星座について学習しましょう。 {{clear}} === 夏の大三角 === [[File:Summer triangle map.png|thumb|300px|right|夏の大三角。<br>「Cygnus」(キグナス)とあるのが、はくちょう座で、「Deneb」がデネブ。<br>「Aquila」がわし座で、「Altail」がアルタイル。<br>「Lyra」がこと座で、「Vega」がベガ。]] 7月7日の七夕の日に、南の空に、三角形のような星座が見えますね。この星座は、 '''夏の大三角'''(なつのだいさんかく) といいます。こと座のベガ(おりひめ星)、わし座のアルタイル(ひこ星)、はくちょう座のデネブの3つの明るい星をつないでできる星座です。 はくちょう座は、十字のような形をしている星座です。 わし座も、十字のような形の星座です ===星の動き=== 星は、じつは、時間が立つとともに動きます。 7月7日の午後7時から、さそり座を1時間ごとに観察しましょう。同じ場所で、同じ方位を見て観察することが大切です。観察するときに電信ばしらやたて物などの目じるしがあるとよりわかりやすくなります。午後8時ごろ、東の空に見えるさそり座は、午後10時ごろには南の空を通り、その後、西の空に動きます。星の動きは、太陽の動きと同じです。しかし、気づいたかもしれませんが、時間とともに星は動きますが、そのならび方はかわりません。 {{clear}} :※ あぶないので、けっして太陽の温度を、実験(しっけん)では、しらべては いけません。太陽をちょくせつ見ると、目をいためるキケンがあります。太陽を反射させた光や、プリズムで分けた光でも、目をいためるキケンがあります。 月は、自分からは、光を出していません。太陽の光を反射(はんしゃ)しているので、月は明るく見えるだけです。月の温度は、月の光からは、わからないのです。 === 冬の大三角形 === [[ファイル:Wintersky.jpg|thumb|left|350px|赤い線:冬の大三角<br>青い線:冬のダイヤモンド]] オリオン座の '''ベテルギウス''' と、おおいぬ座の '''シリウス''' と、こいぬ座の '''プロキオン''' が、 '''冬の大三角形''' です。 ちなみに、ベテルギウスの明るさは0.4等星(れいてんよん とうせい)です。シリウスは -1.5等星(マイナスいちてんご とうせい)です。 {{clear}} === 太陽 === :※注意 太陽を{{ruby|直接|ちょくせつ}}見てはいけません。目をいためます。 :※注意 太陽を直接{{ruby|望遠鏡|ぼうえんきょう}}でのぞいてもいけません。目をいためます。 {{clear}} == 骨(ほね)と、筋肉(きんにく) == [[Image:Human_skeleton_front.svg|thumb|right|400px|人間のほね。<br>英語(えいご)ですが、日本語の翻訳(ほんやく)ができあがるまで、これで代用(だいよう)してください。]] 私たちのからだの中には '''骨'''(ほね) があります。骨によって、からだをささえています。また、ほねは、かたいので、のうや内ぞうなどをまもる役目(やくめ)もあります。 ほねのあつまりを 骨格(こっかく) といいます。 * 頭骨(とうこつ) のうをまもっている、あたまの大きな骨です。 目がはいるためのすきまが、あります。 鼻(はな)が通るためのすきまが、あります。 <gallery widths="200px" heights="200px"> File:Human skull front bones numbered.svg|前から見た、とう骨。 File:Human skull side bones numbered.svg|横から見た、とう骨。 </gallery> * 背骨(せぼね) [[File:Spinal column curvature-jp.svg|thumb|left|200px|せぼね]] せなかのまんなかにある、くびのせなかがわから、こしのあたりまでのびている、一本の長いほねです。からだをささえています。 せぼねのある動物(どうぶつ)を '''セキツイ動物''' といいます。わたしたち人間も、セキツイ動物です。 {{clear}} * ろっ骨 [[ファイル:Gray112.png|thumb|left|200px|ろっこつ。(肋骨)]] むねのあたりにある、かごのような、ほねです。「心ぞう」(しんぞう、心臓)と、「はい」(肺)を、まもっています。しんぞうとは、けつえき(血液)をおくりだすところです。「はい」とは、口(くち)からすった空気(くうき)を、からだのなかにとりこむ場所(ばしょ)です。 * 骨ばん(こつばん) [[ファイル:Gray242.png|thumb|right|200px|こつばん。(骨盤)]] 腸(ちょう)などのないぞうを、まもっている。腸(ちょう)とは、食事(しょくじ)でたべた栄養(えいよう)を、からだにとりこむ場所(ばしょ)です。 {{clear}} ;きんにく [[Image:Illu head neck muscle.jpg|thumb|left|350px|あたまの きんにく]] '''筋肉'''(きんにく) は、体(からだ)をうごかすのに、つかわれます。 ほねだけでは、からだは、うごきません。 わたしたちが、うで(腕)を、うごかすときは、きんにくによって、うでのほねをうごかして、そして、腕(うで)が、うごきます。 ;かんせつ うでには、まんなかに、ひじがありますね。骨(ほね)と、べつの骨とが、つながっている場所を '''かんせつ'''(関節) といいます。「ひじ」も、かんせつです。 かんせつは、ほとんどのかんせつの場合、そのかんせつを中心にして、まわりの骨(ほね)を、うごかすことができます。 かんせつは、ひじのほかにも、あります。てくびもかんせつです。てくびは、まげることができますよね。 * ゆび ゆびのまげられる場所もかんせつです。 * かた うでのつけねの '''かた''' にも、かんせつが、あります。<br>うでは、ひだりのうでと、みぎのうでを、べつべつにうごかせるので、みぎのかたにあるかんせつと、ひだりのかたにあるかんせつは、べつのかんせつです。 * くび くびも、くびのむきをかえることができるので、かんせつです。 * せぼね せぼねも、おなかをまるめることができるので、せぼねには、かんせつがあります。 * あしのつけね あしも、あしのつけのところで、あしをうごかせるので、そこには、かんせつが、あります。<br>あしは、ひだりのあしと、みぎのあしを、べつべつにうごかせるので、みぎのつけねにあるかんせつと、ひだりのつけねにあるかんせつは、べつのかんせつです。 * ひざ ひざのところでも、あしをまげられるので、ひざには、かんせつがあります。<br>あしにある「ひざ」と、うでにある「ひじ」は、なまえがにていますが、べつのかんせつです。 * あしのゆびや、あしくび あしくびや、あしのほねにも、かんせつが、あります。 からだをうごかすしくみは、きんにく(筋肉)が、ほね(骨)を、うごかしているのでしたね。ほね(骨)をうごかすためのきんにく(筋肉)は、きんにくのはじっこが、両方(りょうほう)とも、ほね(骨)についています。このような、ほねをうごかすためのきんにくを '''こっかくきん'''(骨格筋) といいます。 こっかくきん(骨格筋)の両はじの、ほねについているぶぶんを '''けん'''(腱) といいます。 このこっかくきんが、ちぢんだり、ゆるんで元(もと)の長さにもどることで、ほねをうごかします。 このしくみで、ほねをうごかせるためには、こっかくきんは、両はじが、べつべつのほねに、ついていなければいけません。 {{コラム|くわしい、かんせつの、しくみ| [[File:Joint white-bone.svg|350px|thumb|left|いっぱんてきな、関節(かんせつ)。 <br>ligament 靱帯(じんたい) <br>enthesis 腱付着部(けん ふちゃくぶ) ※腱(けん)が、くっついている場所です。 <br>synovial cavity 滑液腔(かつえきくう) <br>bursa 滑液嚢(かつえきのう) <br>articular cartilage 関節軟骨(かんせつ なんこつ) <br>joint capsule 関節包(かんせつほう) <br>tendon 腱(けん) <br>epiphyseel bone 骨端(こったん) ※ほねのはじっこのことです ]] 関節(かんせつ)は、2つの骨(ほね)から、なりたちますが、そのうちのいっぽうは、さきがまるいです。もういっぽうは、ほねのさきが、ややくぼんでいます。このようにして、うまく、くみあわさるように、なっています。骨(ほね)の先が丸く出っぱっているほうを関節頭(かんせつとう)といい、くぼんでいるほうの骨を関節窩(かんせつか)といいます。 関節(かんせつ)は、関節頭(かんせつとう)と関節(かんせつ)と関節窩(かんせつか)をつつんでいる'''関節包'''(かんせつほう)を持っています。関節包(かんせつほう)の内がわは'''滑膜'''(かつまく)と呼ばれる膜組織(まくそしき)であり、滑膜から滑液(かつえき)とよばれる液(えき)が分泌(ぶんぴつ)されて、その液が'''関節腔'''(かんせつくう)をみたしています。滑液(かつえき)にはすべるをよくするやくめと、軟骨(なんこつ)に栄養(えいよう)をあたえるやくめがあります。 関節包(かんせつほう)のまわりには、靭帯(じんたい)があって、じょうぶにしています。 }} {{clear}} ;うでのきん肉 [[ファイル:Biceps (PSF).jpg|thumb|left|250px|「うで」の きん肉<br>うでをまげるときは、BICEPS(バイセプス)が、ちぢんでいる。<br>うでをのばすときは、TRICEPS(トリセプス)が、ちぢんでいる。BICEPSは、日本語では上腕二頭筋(じょうわん にとうきん)といい、うでの力こぶのきん肉のこと。TRICEPSは、日本語では三頭筋(さんとうきん)という。]] うで(腕)の、ひじのところで、うでをまげるためのきん肉と、うでをのばすためのきん肉は、べつべつのきん肉です。 もし、ひとつのきん肉しかなかったら、たとえば、うでを曲げるためのきん肉しかなかったら、うでをのばすためには、うでをおろしたりしなければいけません。また、もしも、うでをのばすためのきん肉がないと、うでをのばしたままのかっこうで、手をあげることができません。 うでをのばすときには、うでを曲げるときにつかったほうのきん肉はゆるんでいます。 うでをのばすためのきん肉がちじむことで、うではのびます。 曲げるためのきん肉と、のばすためのきん肉が、りょうほうともあることで、わたしたちは、すばやく、からだをうごかせます。 たとえば、体育(たいいく)の授業(じゅぎょう)などで、たとえばドッジボールでボールをなげるときに、うでをのばしていますよね。 足の、ひざのところで、あしをまげるためのきん肉も、にたようなしくみになっています。 {{clear}} * その他 顔にも筋肉があります。 ウサギやコウモリやハトや魚など、動物の体にも筋肉があります。ニワトリの体にも筋肉があります。 {{clear}} == 気温 == === 気温の、はかり方 === 気温(きおん)とは、空気(くうき)の温度(おんど)のことです。気温(きおん)をはかるには、温度計(おんどけい)をつかいます。 じつは、地面(じめん)からの距離(きょり)によって、温度はかわります。だから、気温をはかるときは、高さ(たかさ)をきめるひつようが、あります。高さは、だいたい、高さは1.2m(メートル)から1.5m(メートル)くらいの高さが、気温をはかるときの高さです。 こうやって、高さをきめておかないと、もしも、ほかの人が、はかったときの温度と、くらべることができなくなって、こまります。 いっぱんに、地面にちかい場所は、太陽からの光によって、あたためられているので、地面に近づくほど、温度が高いです。 「1.2m(メートル)から1.5m(メートル)の、30cmの高さのちがいで、気温はちがわないの?」と、思うかもしれませんが、小学生は、気にしないで、大丈夫です。 温度をかえるものは、'''直しゃ日光'''(ちょくしゃ にっこう)が、あたっているか、あたっていないかでも、温度は、かわります。なので、気温をはかる場合は、どちらかにきめるひつようがありますね。 理科では、気温をはかるときは、「ひかげ」(日陰)ではかる、つまり、直しゃ日光が当たらない場所ではかる、というふうに決めています。 さらに、おなじ日かげでも、ドアやまど(窓)をしめた部屋(へや)の中のように、そとからの風(かぜ)がふかないところと、ドアや窓をあけた部屋とでは、温度はちがいますよね。風通しの少ない場所では、温度は、変化しやすくなります。いっぽう、風通しのよいところは、まわりの平均的(へいきんてき)な気温に、ちかくなります。 だから、外からの風がふく、風通し(かぜとおし)のよい場所で、気温をはかると、理科では、きめています。 気温のはかりかたを、つぎの文(ぶん)に、まとめます。 ;気温の、はかりかたの、きまり * 風通し(かぜとおし)の良い場所で、気温を、はかる。 * 地面からの高さは、1.2m(メートル)から1.5mの高さで、気温をはかる。 * 直しゃ日光(ちょくしゃにっこう)の当たらない、日かげで、気温をはかる。 です。 そのほか、気温にかぎらず、温度計をつかうときの、はかりかたとして、 * 温度計に、息(いき)を、ふきかけてはいけません。 * 液だめ(「えきだめ」、・・・温度計の下のほうにある、赤い、ふくらんだ部分です。)、液だめに、さわっては、いけません。液だめに、息をふきかけても、いけません。 === 百葉箱(ひゃくようばこ) === [[File:Stevenson screen in Ikuta Wooded Area.jpg|thumb|300px|百葉箱(ひゃくようばこ)]] 気温をはかるばあいに、正しい方法で、はかりやすいように、'''百葉箱'''('''ひゃくようばこ''')を、つかってはかる場合があります。 百葉箱は、つぎのような、しくみになっています。 * 屋根(やね)が、ついている。 ・・・ 日光(にっこう)をさえぎり、日かげを、つくるために、屋根が、ついています。 * 色は、白い。 ・・・ 日光を、反射(はんしゃ)するためです。 * よろい戸(よろいど)というとびらになっていて、板のすき間が、あいている。 ・・・ すきまは、風通し(かぜとおし)をよくするためです。 * 百葉箱の高さは、中にある温度計の液だめが、1.2mから1.5mになるように、工夫されています。 * なるべく広い場所に作られている。 ・・・ まわりの、たてものなどによる影響(えいきょう)を、なくしたいからです。 * とびらの方角は、北(きた)に向いています。 ・・・ 太陽の直射日光が、入らないようにするための、工夫です。太陽は、東から登って、南で高くなり、西にしずむのでしたね。 * 地面は、ふつうは、草が生えた芝生(しばふ)です。 ・・・ 日光の照り返し(てりかえし)や、地面からの熱(ねつ)の影響(えいきょう)を、少なくするためです。 ==空気と水の性質(せいしつ)== この空気(くうき)にかんする、じっけんをするときは、おかあさんなどの、おとなのかたに、見てもらってくださいね。ひとりでじっけんしたら、ダメですよ。 むりに、じっけんをしなくても、いいですよ。 つぎの、カッコのなかは、おとなのかたへの、ちゅういがきです。もし、じっけんをしたいばあいは、このちゅういがきをよんでもらってください。 :(保護者の方へ・・・本書の記述は、安全には、なるべく配慮していますが、しかし、不慮の事故の可能性などもあります。たとえば、ふくろを使った実験では、もしイタズラをすると、窒息する危険もあります。他にも、コップなどを使った実験では、ガラス製のコップなどは割れる可能性もあります。また、ウィキペディアには免責事項があります。事故が起きても、責任は取りません。ページ末尾の免責事項をお読みください。) まず、わたしたちの、まわりには、空気(くうき)があります。わたしたちは、鼻(はな)から、空気を、すっています。 目には見えませんが、空気があります。 「空気が、たしかに、せかいには、あるんだ。」ということをたしかめる方法(ほうほう)には、たとえばビニール袋(ぶくろ)に、空気を入れて、ふくろの口を手でふさいで空気を、とじこめてから、水の中に空気が入ったふくろを入れると、ふくろの口のすき間から、空気がもれて、あわがでるかもしれません。 じっけんをやるときは、あまり、ふくろが大きすぎると、くうきをあつめるのが、たいへんになります。うまく大きさを、工夫してくださいね。 あと、くれぐれも、ふくろのなかに入っては、ダメですよ。あぶないですよ。うんがわるいと、空気がすえなくなって、死(し)にますよ。 おなじように、くれぐれも、ふくろの中に、顔や鼻を入れてはダメですよ。うんがわるいと、空気がすえなくなって、死にますよ。 また、コップなどがあれば、コップの口を下に向けて、水に入れれば、空気がとじこめられます。そのまま、水の中でコップを上に向ければ、空気がうかび上がって、おおきな泡(あわ)になって、出てきます。ペットボトルのびんがあれば、それをつかっても、にたようなじっけんができます。 あわがうかびあがることから、どうやら、水のなかでは、空気が、うかびあがるらしいですね。 コップをつかう時は、おとしたら、われて、あぶないので、気をつけてくださいね。もしじっけんをするなら、できれば、プラスチックでできたコップでじっけんをやると、あんぜんだと思います。 風船(ふうせん)を、知ってるでしょうか。ふくらませると丸くなる、あのフーセンのことです。 フーセンがなければ、同じくらいの大きさのビニール袋でもかまいません。 フーセンに空気を入れて、フーセンの口をとじて、水に入れて、手をはなすと、フーセンは水に、うきますよね。 水の入った、ふくろは、どうも、うかぶらしいですね。 プールなどでつかう浮き輪(うきわ)も、おなじしくみです。 フーセンでも、ビニール袋でも、なんでもいいのですが、空気を半分くらい入れて、ふくろの口をしめてみましょう。 ふくろの口をしめるには、ちょうちょ結び(むすび)をするなり、輪ゴム(わゴム)でとめるなり、いろいろと工夫してください。 ふくろに入れる空気は、半分ぐらいまでで、いいですよ。 あんまり空気をいれすぎると、次のじっけんが、わかりづらくなるので、空気は半分くらいにしといてくださいね。 半分に空気をいれたふくろの口をとじて、ふくろを曲げようとしたら、曲げられますよね。 空気がもれていないことを、かくにんしたいなら、ふくろを水の中に入れて、じっけんすれば、いいでしょう。 このように、どうも、空気は、形をかえられるようですね。 空気はちぢめられますが、水はちぢめられません。 水をいれたピストンを押しても、水はちぢみません。 == 温度と物の変化 == :※ちゅうい 学校の理科の授業以外では、火などをつかったじっけんは、しないでください。この節(せつ)では、物をあたためるときに、おきる現象(げんしょう)を、あつかいます。 === 水と温度の関係 === [[Image:Kochendes wasser02.jpg|thumb|right|200px|水の、ふっとう。]] [[ファイル:watervapor_cup.jpg|thumb|200px|ティーカップから立ちのぼる、水蒸気(すいじょうき)をふくむ湯気(ゆげ)]] 水を熱して、お湯にする。お湯をさらに熱していくと、底から泡(あわ)がでてくる。このあわは、水にとけていた空気が、ふくらんで、出てきたものでる。 この、熱された湯から、あわがたくさん出てくる状態を '''ふっとう'''(沸騰) という。 また、'''湯気'''('''ゆげ''')という、白いけむりのようなものが、水面からでてくる。 湯気をよく見ると、水面の近くには、白いものが見えない。だが、この水面の近くにも、目には見えないが、水面から、水から形をかえて見えなくなったものが、空気中に出てきている。このように、熱い湯の表面から、でていく水を'''水蒸気'''('''すいじょうき''')という。 水蒸気は、目には見えない。 湯気は、水蒸気が、水面から、はなれていって、温度が少し下がったので、もとの水の霧(きり)にもどったものである。 沸騰した湯からは、水蒸気が多く出る。水が沸騰する温度は、'''100℃'''である。 液体の水は100℃までしか、温度が上がらない。 この理由は、加えた熱が、水を水蒸気にかえるために、使われているからである。 液体が、沸騰するときの温度を '''ふっ点'''('''ふってん'''、沸点) といいます。 水の沸点は100℃です。 水の沸点が100℃という、きりのいい数字な理由は、じつは、温度の決め方は、水が沸騰しているときを100度として決め、水が氷になるときを0℃として決めたからです。 アルコール温度計では、80℃くらいまでしか、はかれません。もし、アルコール温度計でそれよりも高い温度を図ろうとすると、温度計がこわれます。 これは、アルコールもまた温度が高くなると沸とうし、アルコールの沸点のおよそ80度で沸とうするからです。 100度の温度をはかる時は、べつの温度計をつかいます。 [[File:Phase_change_-_ja.svg‎|thumb|right|300px|状態の変化を表した図。図中の「プラズマ」については、気にしないでください。また、図では気体から固体への変化が「昇華」(しょうか)と記されていますが、本来は「凝結」(ぎょうけつ)が正しい表現と主張する学者もいます。]] 水には、氷(こおり)と水(みず)と水蒸気(すいじょうき)の、三つの状態があります。 水やアルコールのような、目に見えて、形の決まっていなくて、体積はきまっているものを '''液体'''(えきたい) と言います。 空気や、水蒸気のような、目に見えず、形もきまっていなく、体積もきまっていないものを '''気体'''(きたい) といいます。 空気にふくまれている、酸素(さんそ)や二酸化炭素(にさんかたんそ)、も気体です。 氷(こおり)や金属や木などのような、目に見えて、物を '''固体'''(こたい) といいます。 ふっ点でない水からも、じつは、すこしずつ水が気化をして、くうきに水がまじります。これを '''じょう発'''(じょうはつ、蒸発) といいます。 雨がふって、バケツの中に水たまりができても、ほうっておけば、水がなくなるのは、蒸発をしたからです。 洗濯物(せんたくもの)が、晴れ(はれ)の日に、ほすと、かわくのも、じょう発です。 汗(あせ)がかわくのも、じょう発です。 蒸発は、水の温度が高いほど、多くの水が蒸発していきます。だから、あたたかい日のほうが、水が蒸発しやすいです。 {{コラム|紙鍋は、なぜ燃(も)えないの?| [[File:Breakfast at Tamahan Ryokan, Kyoto.jpg|300px|thumb|紙鍋(かみなべ)<br />]] みなさんは、旅館などで、右の写真の右下のような「紙鍋(かみなべ)」を見たことはありますか?<br> 紙を熱していますが、紙は燃えません。なぜでしょう?<br> 紙鍋の紙には、だし(水分)が含まれています。この水分は、熱しても温度は100℃までしか上がりません。<br> しかし、紙が燃える温度は300℃~450℃くらいで、最大100℃では燃えません。<br> だから、熱しても紙鍋は、燃(も)えないのです。 }} [[Image:Hot-air-balloon.jpg|thumb|200px|right|熱気球]] 空気は、あたためられて、温度が上がると、体積がふえる。 水も、あたためられて、温度が上がると、体積が、ほんのすこし増える。 あたためられて、体積がふくらんだ空気は、密度(「みつど」・・・体積あたりの、おもさ)がちいさくなるので、上にのぼります。 熱気球(ねつききゅう)が、空をとぶのは、このしくみを利用しているからです。 おなじように、あたためられた水は、水の中を、うえにのぼります。 お風呂などで、水面にちかい、上のほうの湯があついのは、あたためられた水が、上に登るからです。 部屋の中などの、閉じた場所で、空気が、あたためられて、上に登った場合、元から上にあった空気は、押しのけられて、下に流れます。このような、空気が、じゅんかん(循環)することを '''対流'''(たいりゅう) といいます。 ;対流 [[File:ConvectionCells.svg|thumb|right|300px|上と下とで温度差のある場所での、対流の一例。下からあたためた場合に、熱は、対流によって上部へと運ばれ、液体の表面からの蒸発(じょうはつ)などの熱放出(ねつほうしゅつ)によって冷やされる。冷えた液体は下へと、もぐる。]] 水も、対流をします。あたためられた水は、密度(みつど)がちいさくなるので、うかび上がり、いっぽう、元から上にあったつめたい水は、下がります。 気体(たとえば空気など。)や液体(たとえば水など。)で、対流はおこります。水の中に、温度のちがいがあると、温度が高いところほど、ふくらむので密度(みつど)が小さくなって、浮力(ふりょく)ができるので、水が対流をします。 {{clear}} 温度が上がると、ふくらむのは、空気や水だけでは、ありません。ほとんどの物が、温度があがると、じつは、ふくらんでいます。 温度計の赤い液だめも、この現象(げんしょう)を、利用(りよう)しています。いっぱんに、赤い液だめのある、温度計にはアルコールや油が、もちいられています。 温度計では、液の入っているガラス管(ガラスかん)を細く(ほそく)することで、わずかな体積変化でも、赤い線の長さが大きくかわるように工夫しています。 温度を下げると、どうなるのでしょうか。 温度を下げると、体積は減ります。 あたためた物を、元の温度にもどすと、体積も、元の体積にもどります。 元の温度よりも、もっと温度を下げると、ほとんどの物質では、体積は小さくなります。 鉄や銅などの金属(きんぞく)の固体も、温度があがると、じつは、体積が、ふくらんでいます。 金属の、温度変化による体積の変化は、ほんのわずかです。 電線や、鉄道のレールなどは、金属が、つかわれています。これらの物は、季節によって、まわりの温度が変わるので、じつは、体積や長さも、かわっているのです。 鉄道のレールは、夏場に ふくらんでも、こわれないように、冬場は、ほんのすこしだけ、レールとレールのつぎめに、すき間があいています。 物がふくらむことを '''ぼうちょう'''(膨張) といいます。熱して(ねっして)、あたたかくすると、ふくらむことから、熱膨張(ねつぼうちょう)と、この現象(げんしょう)を、いうこともあります。 物は、温度があがると、膨張します。 体積が減る(へる)ことを、収縮(しゅうしゅく)と、いいます。 物は、温度が下がると、収縮します。 お仕事で、金属を使った製品(せいひん)をつくっている大人の人たちは、もしも製品の温度が変わって、製品が膨張や収縮をしてもも、製品がこわれないように、工夫して、製品をつくっています。 気体と液体と固体で、体積の変化の割合がいちばん大きいのは、気体です。 つぎに、温度による体積変化の割合が大きいのは液体です。 固体は、温度による体積変化の割合が、もっとも小さいです。 {{コラム|せっ氏温度|2= [[ファイル:Clinical thermometer 38.7.JPG|thumb|300px|セルシウス温度計]] 温度の単位として実用上、多く用いられている ℃ 単位の <span style="font-size: large">せっ氏温度</span>(せっしおんど、摂氏温度) を用いる。摂氏温度は セルシウス温度(セルシウスおんど、degree Celsius)とも言う。 ℃ の、「C」はセルシウス Celsius の頭文字のCから、とった文字です。 <div style="background-color:#ccf;margin:3em"> この摂氏温度(せっしおんど)では、温度の基準(きじゅん)として、水 と こおり の共存する温度を 0℃ と決めて、また、大気圧のもとで純水が沸騰(ふっとう)するときの温度を 100℃ と決めている。 なので、水のこおる温度が、きりがよく、ほぼ0℃なのは、そもそも水のこおる温度をもとにして、セルシウス温度の 0℃ を決めたからです。 おなじような理屈(りくつ)で、水が沸騰する温度が、きりがよく、ほぼ 100℃ なのは、水の沸点(ふってん)をもとに、セルシウス温度での100℃をきめたからです。 </div> :;この説明は、{{Ruby|定義|ていぎ}}ではなく{{Ruby|由来|ゆらい}}です。教科書には2019年5月に決まった新しい定義が載っているか、触れられていないかもしれません。 温度計の種類に アルコール温度計 や 水銀温度計 などあるが、これらは物体の温度が上がることによる{{ruby|膨張|ぼうちょう}}する性質を、温度の{{ruby|測定器|そくていき}}として利用した{{ruby|器具|きぐ}}です。 :※注意 水銀は、{{ruby|毒|どく}}であり、とてもキケンなので、家庭での実験では使わないでください。 }} 日本では、ふだんは、℃の単位(たんい)である摂氏温度(せっしおんど)を用いてください。 日本では「温度」といったら、ふつうは、℃の摂氏温度(せっしおんど)のことです。 日本では、温度の たんい には、℃の摂氏温度(せっしおんど)をつかうのが、ふつうです。 === 熱の、つたわりかた === 熱(ねつ)は、外部から手を加えなければ、しぜんと温度の高い所から、温度の低いところへと、熱(ねつ)が移動(いどう)して、つたわっていきます。 その結果(けっか)、温度の高かった場所は、熱を手放していき、だんだんと温度は低くなります。いっぽう、まわりとくらべて温度のひくかった場所は、しだいに温度が高くなる。そして、いつしか、この、ふたつの場所の温度は、同じ温度になります。 == 自然の中の水 == 雨がふると地面に水たまりができました。しかし、晴れた日にはなくなっていました。これはなぜでしょうか。 これは、水が空気中に出て行ったからです。この水などが空気中に出ていこうとするはたらきを '''じょう発''' といいます。じょう発した水は '''水じょう気''' となります。また、土に水がしみこむこともありますが、このとき、つぶの大きさによって水のしみこみやすさにはちがいがあります。また、水は高いところから{{ruby|低|ひく}}いところへと流れていきます。 {{clear}} [[Category:小学校教育|理4]] [[Category:理科教育|小4]] cwlve0hanm08iv6dtooimz2n9z7zweq 朝鮮語/学習/挨拶 0 3944 264132 164143 2024-11-24T17:34:47Z Jiba1219 77989 264132 wikitext text/x-wiki 以下に朝鮮語での主な挨拶(인사<人事>)を挙げる。 *안녕(annjʌŋ)? - 会う時の挨拶で、発音はアンニョンと似てる。時間帯と関係なく使われ、同じ年齢の人たちがお互いを親しく表現する時に使用される。 *안녕하십니까(annjʌŋhashimnikka)? こんにちは(朝から晩まで使える)。 *안녕하세요(annjʌŋhasejo)? こんにちは(親しい人に)。 *만나뵙게 되어 기쁩니다(mannabwepkedweo kippɯmnida). お会いできてうれしいです。 *감사합니다(kamsahamnida). ありがとう。 *고마워요(komawʌjo). ありがとう(親しげな言い方)。 *처음 뵙겠습니다(ʧʰʌɯm pwep̚ˀkessɯmnida). はじめまして。 *미안합니다(mianɦamnida). ごめんなさい。 *죄송합니다(ʧwesoŋɦamnida). 申し訳ございません(上より硬い言い方。自分が何か過ちを犯したときに使う)。 *안녕히 계세요(annjoŋɦi geseyo). さようなら(去る人が言う)。 *안녕히 가세요(annjoŋɦi gaseyo). さようなら(見送る人が言う)。 *안녕히 주무십시오(annjoŋɦi ʧumushipʃio). おやすみなさい。 *새해 복 많이 받으세요(sɛhɛ bok mani padɯsejo). 明けましておめでとうございます(直訳すると『新年福をたくさん受けてください』となる)。 *건배(kʌnbe)! 乾杯! *잘 먹겠습니다(ʧal mokˀkesɯmnida). いただきます。 *잘 먹었습니다(ʧal moɡoˀsɯmnida). ごちそうさま。 *맛있었습니다(maʃiˀsʌˀsɯmnida). おいしかったです。 *당신을 잊지 않습니다(taŋsinɯl iˀʧi ansɯmnida). あなたのことは忘れません。 [[Category:朝鮮語|学 あいさつ]] r1jxvx90mwhazihpj0oirxv70r9wbad 刑法第235条 0 14130 264129 240005 2024-11-24T14:03:55Z Tomzo 248 /* 判例 */ 264129 wikitext text/x-wiki * [[法学]]>[[刑事法]]>[[刑法]]>[[コンメンタール刑法]] * [[法学]]>[[コンメンタール]]>[[コンメンタール刑法]] == 条文 == (窃盗) ; 第235条 : 他人の財物を窃取した者は、窃盗の罪とし、10年以下の拘禁刑又は50万円以下の罰金に処する。 ===改正経緯=== 2022年、以下のとおり改正(施行日2025年6月1日)。 :(改正前)懲役 :(改正後)拘禁刑 == 解説 == {{wikipedia|窃盗罪}} == 参照条文 == *[[刑法第243条]](未遂罪) *:未遂は、罰する。 *[[盗犯等ノ防止及処分ニ関スル法律第2条|盗犯等ノ防止及処分ニ関スル法律(盗犯等防止法)第2条]] *:常習として左の各号の方法に依り刑法第235条<略>の罪又は其の未遂罪を犯したる者に対し[[窃盗罪|窃盗]]を以て論ずべきときは3年以上<略>の有期懲役に処す *:#兇器を携帯して犯したるとき *:#2人以上現場に於て共同して犯したるとき *:#門戸牆壁等を踰越損壊し又は鎖鑰を開き人の住居又は人の看守する邸宅、建造物若は艦船に侵入して犯したるとき *:#夜間人の住居又は人の看守する邸宅、建造物若は艦船に侵入して犯したるとき *[[盗犯等ノ防止及処分ニ関スル法律第3条]] *:常習として前条【盗犯等防止法第2条】に掲げたる刑法各条の罪又は其の未遂罪を犯したる者にして其の行為前10年内に此等の罪又は此等の罪と他の罪との併合罪に付3回以上6月の懲役以上の刑の執行を受け又は其の執行の免除を得たるものに対し刑を科すべきときは前条の例に依る == 判例 == #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=55452 強盗、窃盗、住居侵入](最高裁判決昭和24年12月22日) #;貨物列車から積荷を突落す方法による窃盗罪の成立 #:原判決判示就中「突落し以て窃盗し」との判示とその舉示の證據殊に原審公判廷における被告人Aの突落した後同被告人等兩名は間もなく突落した現場に行き品物をAの家に持ち歸つた旨の供述とを對照すれば、原判示は、積荷を列車外に突落し拾う計畫を實行して拾つた趣旨をも含むものと解することができる。しかのみならず、鐵道線路の地理現場の事情に精通していると認められる鐵道機關助士である被告人等が判示のごとく共謀計畫して判示のごとく定められた目的の地點で積荷を列車外に突落した本件においては、特をの事情の認められない限り、その目的の地點に積荷を突落したるきその物件は他人の支配を脱して被告人等凶暴者の實力支配内に置かれたものを見ることができる。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=70535 窃盗](最高裁判決 昭和23年12月27日) #;窃盜犯既遂の時期 #:窃盜既遂罪は、犯人が不法領得の意思を以て事實上他人の占有すなわち社會通念上他人の支配内にあるものと認められる物件を他人の意思に反して自己の支配内に移したとき完全に成立するものであつて、所論のごとく犯人が更にこれを自由に處分し得べき安全な場所に持去ることを要するものではない。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=54337 窃盗、物価統制令違反](最高裁判決昭和25年6月6日) #;共同占有における窃盜罪の成立 #:原審舉示の證據によれば少なくとも判示係長も占有を有して居たことが認められる。共同占有の場合、共同占有者の占有を奪つて自己單獨の占有に移す行爲は窃盜を以て目すべきこと大審院判例の認める處で其解釋は正當である。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=54507 強盗致傷、住居侵入](最高裁判決昭和25年8月29日) #;強窃盜罪における奪取行爲の目的たる財物の意義と共産黨の中央指令等は同罪の財物にあたるか #: 強、窃盜罪において奪取行爲の目的となる財物とは、財産權殊に所有權の目的となり得べき物を言い、それが金銭的乃至經濟價値を有するや否やは問うところではない。それゆえ、原判決の引用する證據によつて認められる原判示の共産黨の中央指令綴一冊外書類印鑑等數十點は、もとより強、窃盜罪の客体たる財物に當るものと云わなければならない。 #<span id="不法領得の意思"/>[http://www.courts.go.jp/search/jhsp0030?hanreiid=55239&hanreiKbn=02 窃盜](最高裁判決 昭和25年11月15日) ##'''生産管理開始のときから占有していた物を後に領得した行為の擬律''' ##:被告人等が本件生産管理開始のときから判示鉄板を占有していたとしても、それは違法の占有であるから、後にこれを領得しても横領罪とはならず窃盗罪となる。 ##'''生産管理において労働者の団体が工場、設備、資材等を接収してその占有下においた場合には会社側の占有を完全に離脱するか''' ##:原判決が、生産管理においては労働者の団体が工場、設備、資材等一切のものを接収してその占有下におくと判示し、本件においては被告人が既に生産管理に入つたものであることを認めながら、而も他方において判示鉄板は「会社の占有を完全に離脱したものでない」と判示したのは、生産管理開始により労働者の図体が工場、設備、資材等一切のものを自己の支配下におき占有を取得したと言つても、個々の資材物件等については、それが会社構内に存置せられる以上、会社側にもなお占有が存するという趣旨に解すべきである。 ##'''労働者が生産管理中の工場から争議期間中の賃金支払にあてる目的をもつて工場資材を工場外に搬出した行為と窃盗罪の成立''' ##:論旨は、原判決が、本件鉄板は会社の占有を完全に離脱したものではないので被告人等が壇にこれを工場外に搬出した行為は会社の所持を奪つたものであり、窃盗の罪責を免れない、と判示したことを非難し生産管理の下においては占有の所持は労働者側にあり、会社は観念上間接占有を有するに過ぎないから、所持の奪取即ち窃盗はあり得ないい。被告人等には占有奪取の意思もなく、不正領得の意思もなかつたと主張する。しかし労働者側がいわゆる生産管理開始のとき工場、設備、資材等をその占有下においたのは違法の占有であり、判示鉄板についてもそのとき会社側の占有に対して占有の侵奪があつたというべきであるが、原判決はこれを工場外に搬出したとき不法領得の実現行為があつたものと認定したものである。これを証拠に照らし合わせて考えてみても、被告人等が争議期間中の労働者の賃金支払等に充てるために売却する目的を以て、会社側の許可なくしてこれを工場外に運び出し、自己の事実上の支配内に收めた行為は、正に[[不法領得の意思]]を以て会社の所持を奪つたものというべきであつて、原判決が窃盗罪にあたるものとしたのは当然である。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=56799 強盗傷人、窃盗](最高裁判決昭和26年7月13日) ##'''窃盗罪の成立に必要な不正領得の意思及び窃盗犯人に不正領得の意思が認められる一事例''' ##:刑法上窃盗罪の成立に必要な不法領得の意思とは、権利者を排除し他人の物を自己の所有物と同様にその経済的用法に従いこれを利用し又は処分する意思をいうのであつて、永久的にその物の経済的利益を保持する意思であることを必要としないのであるから、被告人等が対岸に該船を乗り捨てる意思で前記肥料船に対するAの所持を奪つた以上、一時的にも該船の権利を排除し終局的に自ら該船に対する完全な支配を取得して所有者と同様の実を挙げる意思即ち右にいわゆる不正領得の意思がなかつたという訳にはゆかない。 ##'''強盗傷人と窃盗の二罪を構成する例''' ##:被告人等が本件強盗傷人の罪を犯す当時には未だ本件窃盗を犯す意思は全然なく、右強盗傷人が既遂となり逃走の途中偶然の機会において新たに本件窃盗の犯意を生じたものであることは原判決挙示の証拠上疑いのないところであるばかりでなく、それらの行為自体からみても、はた又被害法益の点からみても、本件強盗傷人と窃盗の二罪を構成し、所論のように単一の犯罪を構成するものと認めるべきでないことは多言を要しないところである。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=67147 窃盜](最高裁判決 昭和26年8月9日) #;所持禁止の財物に対する窃盗罪の成立 #:刑法における財物取罪の規定は人の財物に対する事実上の所持を保護せんとするものであつて、これを所持するものが法律上その所持を禁じられて居る場合でも現実にこれを所持して居る事実がある以上社会の法的秩序を維持する必要上物の所持という事実上の状態それ自体が保護せられみだりに不正手段によつてこれを侵すことを許さぬものであることは当裁判所判例の示すところである([[刑法第249条#昭和25年4月11日|昭和24年(れ)第2890号同25年4月11日第三小法廷判決]])。さればAが事実上所持していた本件濁酒が所論の如く所有並に所持を禁じられていたものであるとしても被告人が不正手段によつて同人の所持を奪つた判示行為に対し窃盗罪として処断した原判決は正当であるばかりでなくまた判例に反するものでもない。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=54591 窃盜](最高裁判決昭和28年4月7日) #;財物に対する事実上の支配の奪取及び不法領得の意思がないため窃盗罪の成立しない一事例 #:農業協同組合の販売主任又は倉庫係である被告人両名が、同組合倉庫に保管中の政府所有米の俵数が不足しているのを発見した結果、単に政府所有米の俵数を増して在庫俵数のつじつまを合せておくだけの目的で、同組合長の管理する右倉庫中の政府所有米の各俵から米をすこしずつ抜き取り、これを倉庫外には全然持ち出すことなく、その倉庫内でその米によつて同じような米俵を作り、これを同じ場所に政府所有米として積んでおいたに過ぎない場合には、その米に対する事実上の支配の奪取及び不法領得の意思がないため、窃盗罪は成立しない。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=54591 賍物収受](最高裁判決昭和29年6月1日) #;支払呈示期間後に窃取された線引小切手は賍物といい得るか #:支払呈示期間後に窃取された線引小切手と雖も賍物といい得る。 #:*本件小切手は純然たる反古ではなく所有権の目的となり得る財物と認められる #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=51406 詐欺、窃盗](最高裁決定昭和31年1月19日) #*宿泊客が宿泊費を払えず、旅館の提供したその所有の丹前、浴衣、帯、下駄を着用したまま旅館から立ち去った案件。宿泊料金については詐欺罪が成立している。 #;窃盗罪にあたる一事例 #:旅館の宿泊客が、不法領得の意思で、その旅館の提供したその所有の丹前、浴衣、帯、下駄を着用したまま旅館から立ち去る所為は、窃盗罪にあたる。 #:*斎藤悠輔裁判官の小数意見 #:*:原判決は本件窃盗の目的物である丹前、浴衣、帯、下駄は被告人が旅館の承諾の下に借受けて着用したものと認定したことが明白であるから旅館に右物件の民法上の占有権は存在するかも知れないが刑法上の所持は専ら被告人に存するものと解するから被告人に不法領得の意思があつて右物件を旅館に返還しなかつたとしてもその所持を侵奪したものといえないから横領罪を構成することあるいは格別窃盗罪の成立を肯定できない。 #:*:しかのみならず右丹前等の時価は5300円相当であるにかかわらず、旅館に遺留した洋服、靴等の時価は18500円であるというのであるから、それが他から騙取したものであるとしても右丹前等につき不法領得の意思を肯定することは経験則に反する。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=51360 窃盗](最高裁判決 昭和31年8月22日) #;磁石を用いてパチンコ機械から玉を取得する所為と窃盗罪の成否 #:磁石を用いてパチンコ機械から玉を取る所為は、たとえその目的がパチンコ玉を景品交換の手段とするものであつたとしても、窃盗罪が成立する。 #:*磁石を用いて遊技場のパチンコ機械から玉を取る所為は、たとえ、その目的がパチンコ玉を景品交換の手段とするものであつたとしても、経営者の意思にもとづかないで、パチンコ玉の所持を自己に移すものであり、しかもこれを再び使用し、あるいは景品と交換すると否とは自由であるからパチンコ玉につきみずから所有者としてふるまう意思を表現したものというべきもので、所論のようにいわゆる使用窃盗とみるべきではなく、パチンコ玉に対する不法領得の意思が存するものと解するのが相当である。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=51444 窃盗](最高裁決定昭和32年1月24日) #;海中に取り落した物件について所持の認められる一事例 #:海中に取り落した物件については、落主の意にもとづきこれを引き揚げようとする者が、その落下場所の大体の位置を指示し、その引揚方を人に依頼した結果、その人が該物件をその附近で発見したときは、依頼者がその発見された事実を知らなくても、依頼者はその物件に対し所持即ち事実上の支配管理を有するものと解すべきである。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=50497 窃盗](最高裁決定昭和32年4月25日) #;窃盗罪を構成する一事例 #:他人からその所有の衣類在中の繩掛け梱包した行李を預かり保管中質種に供する目的で梱包を解き行李から衣類を取り出したときは、衣類の窃盗罪を構成する。 #:*他人からその所有の衣類在中の縄掛け梱包した行李一個を預り保管していたような場合は、所有者たる他人は行李在中の衣類に対しその所持を失うものでないから、被告人が他から金借する質種に供する目的で擅に梱包を解き右行李から衣類を取出したときは、衣類の窃盗罪を構成し横領罪を構成しない。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=51426 恐喝、傷害、窃盗](最高裁判決昭和32年7月16日) #;飼犬が所有者の事実上の支配を及ぼし得ない地域に出遊した場合とその所持 #:飼犬が時に所有者の事実上の支配を及ぼし得べき地域外に出遊した場合でも、その習性として所有者の許に帰来するのを常としているものは、特段の事情の生じないかぎり、所有者の所持を離れたものということはできない。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=51349 窃盗](最高裁判決昭和32年10月15日) #;地方行政庁の管理する河川の敷地内に堆積する砂利、砂、栗石の無許可採取行為と窃盗罪の成否 #:地方行政庁の管理する河川の敷地内に堆積している砂利、砂、栗石は、その占有を保持するため特段の事実上の支配がなされない限り、これを地方行政庁の許可なくして採取しても窃盗罪を構成しない。 #:*河川法の適用または準用ある河川は、地方行政庁が諸法令によつてこれを管理するのであるが、これらの法令による管理は、公共の利害に重大な関係がある河川を保全するための行政的措置であつて、河川またはその敷地もしくは流水の効用を保護助長することを目的とするものにほかならない。そして、地方行政庁の河川管理は、おのずから河川敷地内に堆積している砂利、砂、栗石にも及ぶことは当然であるが、その採取を地方行政庁の許可にかからしめているのは、採取行為が[[河川法第19条|河川法19条]]にいう流水または敷地の現状等に影響を及ぼす恐れのある行為であるからであつて、地方行政庁が河川を管理するという一事によつて、河川敷地内に存し移動の可能性ある砂利等を当然に管理占有することによるものではない。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=51567 窃盜、同未遂](最高裁判決昭和32年11月8日) ##'''刑法上の占有の意義''' ##:刑法上の占有は人が物を実力的に支配する関係であつて、その支配の態様は物の形状その他の具体的事情によつて一様ではないが、必ずしも物の現実の所持または監視を必要とするものではなく、物が占有者の支配力の及ぶ場所に存在するを以つて足りる。 ##'''占有離脱物と認められない一事例''' ##:被害者がバスを待つ間に写真機を身辺約30cmの個所に置き、行列の移動に連れて改札口の方に進んだが、改札口の手前約3.66mの所に来たとき、写真機を置き忘れたことに気づき直ちに引き返したところ、既にその場から持ち去られていたもので行列が動き始めてからその場所に引き返すまでの時間は約5分、写真機を置いた場所と引き返した点との距離は約19.58mに過ぎないような場合は、未だ被害者の占有を離れたものとはいえない。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=50496 公職選挙法違反、賍物収受窃盜](最高裁判決昭和33年4月17日) #;投票用紙の持出と不法領得の意思。 #:市議会議員選挙に際し、特定の候補者に当選を得しめるため、後日その候補者の氏名を記入して投票中に混入し投票数を増加する目的をもつて、投票所管理者の保管する市選挙管理委員会所有にかかる市議会議員選挙の投票用紙をひそかに持ち出したときは、不法領得の意思なしというを得ず、窃盗罪を構成する。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=51517 窃盗](最高裁判決昭和35年4月26日)[[刑法第242条]] #;窃盗罪を構成する事例(譲渡担保) #:譲渡担保にとつた貨物自動車の所有権が債権者に帰属したとしても、債務者側において引き続き占有保管している右自動車を無断で債権者が運び去る所為は、窃盗罪を構成する。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=55785 窃盗](最高裁決定昭和35年9月9日) #;窃盗罪の成立する事例 #:河川の流れに入り、大水で漂流中の木材一本(トガの木、直径3尺、長さ2間)を拾得して河岸に引揚げた上、その流失を防ぐため、附近の柱に巻きつけてあつた他人所有の電線3本長さ21m(同所からの揚水用モーターに送電するためのもので、当時は大水に備え一時支柱から外し、本柱にまきつけてあつた。)中の約12m(時価約金1,200円相当)を勝手に切断し、これを用いて前記木材を繋留した場合には、右電線を不法に領得する意思がなかつたものとはいえず、同電線窃盗の罪が成立するものと解するのが相当である。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=72978 窃盗](最高裁決定昭和35年9月13日) #;窃盗(浅蜊貝窃盗)罪の成立しない事例。 #:原判決は、A漁業組合が本件漁場内に米粒大の浅蜊貝稚貝を砂と共に移殖したけれども、その移殖箇所には標識や垣は設けず、またその移殖稚貝の個々の識別はもとよりその数量さえも特定することができず、加うるにもともと同所には天然に繁殖した浅蜊貝も生存し、これと移植貝との交配によつてさらに繁殖したものであり、従つて本件漁場内に存在する浅蜊貝については、これらの三者の識別は不可能に近い趣旨を認定判示しているのであるから、被告人が捕獲した本件浅蜊貝についても、その個々が前記移殖貝であるとの認定は到底不可能であるといわねばならない。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=50757 強姦致傷、強姦、殺人、死体遺棄、窃盗](最高裁判決昭和41年4月8日) #;人を殺害した後被害者が身につけていた財物を奪取した行為が窃盗罪にあたるとされた事例 #:野外において人を殺害した後、領得の意思を生じ、右犯行直後その現場で、被害者が身につけていた腕時計を奪取する行為は、窃盗罪を構成する。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=50215 窃盗、道路交通法違反](最高裁決定昭和55年10月30日) #;窃盗罪の成立に必要な不正領得の意思があるとされた事例 #:他人所有の普通乗用自動車を、数時間にわたつて完全に自己の支配下に置く意図のもとに、駐車場から所有者に無断で乗り出し、その後約四時間余りの間乗り廻していたなどの事情があるときは、たとえ、使用後に元の場所に戻しておくつもりであつたとしても、右自動車に対する不正領得の意思があつたということができる。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51194&hanreiKbn=02 常習累犯窃盗](最高裁判決 昭和55年12月23日)[[刑法第130条]], [[盗犯等の防止及び処分に関する法律第3条]] #;常習累犯窃盗の罪と窃盗の着手に至らない窃盗目的の住居侵入の罪との罪数関係 #:窃盗を目的とする住居侵入の罪は、<u>窃盗の着手にまで至らなかつた場合にも</u>、盗犯等の防止及び処分に関する法律第3条の常習累犯窃盗の罪と一罪の関係にある。 # [http://www.courts.go.jp/app/hanrei_jp/detail2?id=50339 窃盗](最高裁判決 昭和62年4月10日) #;ゴルフ場内のいわゆるロストボールが窃盗罪の客体になるとされた事例 #:ゴルフアーが誤つてゴルフ場内の人工池に打ち込み放置したいわゆるロストボールも、ゴルフ場側が早晩その回収、再利用を予定しているときは、ゴルフ場側の所有及び占有に係るものとして窃盗罪の客体になる。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=50313 出資の受入、預り金及び金利等の取締等に関する法律違反、窃盗](最高裁決定平成元年7月7日)[[刑法第242条]] #;自動車金融により所有権を取得した貸主による自動車の引揚行為と窃盗罪の成否 #:買戻約款付自動車売買契約により自動車金融をしていた貸主が、借主の買戻権喪失により自動車の所有権を取得した後、借主の事実上の支配内にある自動車を承諾なしに引き揚げた行為は、刑法242条にいう他人の占有に属する物を窃取したものとして窃盗罪を構成する。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=50088 窃盗被告事件](最高裁決定 平成16年8月25日) #;公園のベンチ上に置き忘れられたポシェットを領得した行為が窃盗罪に当たるとされた事例 #:公園のベンチ上に置き忘れられたポシェットを領得した行為は,被害者がベンチから約27mしか離れていない場所まで歩いて行った時点で行われたことなど判示の事実関係の下では,窃盗罪に当たる。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=34527 建造物侵入,窃盗被告事件](最高裁決定 平成19年4月13日) ##'''専らメダルの不正取得を目的として体感器と称する電子機器を身体に装着してパチスロ機で遊戯する行為の窃盗罪該当性''' ##:専らメダルの不正取得を目的として体感器と称する電子機器を使用する意図のもとにこれを身体に装着してパチスロ機で遊戯する行為は,同機器がパチスロ機に直接には不正の工作ないし影響を与えないものであっても,窃盗罪の実行行為に当たる。 ##'''専らメダルの不正取得を目的として体感器と称する電子機器を身体に装着してパチスロ機で遊戯し取得したメダルについて窃盗罪が成立する範囲''' ##:専らメダルの不正取得を目的として体感器と称する電子機器を使用する意図のもとにこれを身体に装着してパチスロ機で遊戯し取得したメダルについては,それが同機器の操作の結果取得されたものであるか否かを問わず,そのすべてについて窃盗罪が成立する。 ---- {{前後 |[[コンメンタール刑法|刑法]] |[[コンメンタール刑法#2|第2編 罪]]<br> [[コンメンタール刑法#2-36|第36章 窃盗及び強盗の罪]] |[[刑法第234条の2]]<br>(電子計算機損壊等業務妨害) |[[刑法第235条の2]]<br>(不動産侵奪) }} {{stub|law}} [[category:刑法|235]] ajo0qgg4dq58hl49sm2psyl6zydj3o8 刑法第252条 0 14152 264130 239814 2024-11-24T14:04:07Z Tomzo 248 264130 wikitext text/x-wiki *[[法学]]>[[刑事法]]>[[刑法]]>[[コンメンタール刑法]] *[[法学]]>[[コンメンタール]]>[[コンメンタール刑法]] ==条文== (横領) ;第252条 # 自己の占有する他人の物を横領した者は、5年以下の拘禁刑に処する。 # 自己の物であっても、公務所から保管を命ぜられた場合において、これを横領した者も、前項と同様とする。 ===改正経緯=== 2022年、以下のとおり改正(施行日2025年6月1日)。 :(改正前)懲役 :(改正後)拘禁刑 ==解説== {{wikipedia|横領罪}} ==参照条文== ==判例== #[http://www.courts.go.jp/search/jhsp0030?hanreiid=55404&hanreiKbn=02 横領](最高裁判決 昭和23年06月05日) #;贈賄のためその資金を預かつた者の領得行爲と横領罪 #:不法原因の爲め給付をした者はその給付したものの返還を請求することができないことは、[[民法第708条]]の規定するところであるが刑法第252条第1項の横領罪の目的物は單に犯人の占有する他人の物であることを要件としているのであつて必ずしも物の給付者において民法上その返還を請求し得べきものであることを要件としていないのである。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=74697 業務上横領](最高裁判決 昭和23年07月16日) #;横領罪の意義 #:横領罪は他人の物を保管する者が、他人の権利を排除して、ほしいままにこれを処分すれば成立するのであつて、必らずしも自己の所有とし又はこれによつて利益をうることを必要としない。 #<span id="不法領得の意思"/>[https://www.courts.go.jp/app/hanrei_jp/detail2?id=55408 業務上横領](最高裁判決 昭和24年06月29日) #;横領罪における不法領得の意義 #:横領罪は、他人の物を保管する者が、他人の権利を排除してほしいままにこれを処分すれば、それによつて成立するものであることは明らかであり、必ずしも自分の所有となし、もしくは自分が利益を得ることを要しない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=55239&hanreiKbn=02 窃盜](最高裁判決 昭和25年11月15日)[[刑法第235条]] #;生産管理開始のときから占有していた物を後に領得した行為の擬律 #:被告人等が本件生産管理開始のときから判示鉄板を占有していたとしても、それは違法の占有であるから、後にこれを領得しても横領罪とはならず窃盗罪となる。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=67624&hanreiKbn=02 業務上横領、横領](最高裁判決 昭和26年01月23日)[[刑法第247条]],刑訴法第405条3号 #;銀行の出納係主任が他人と共謀して業務上保管にかかる金品を擅に他人の営業資金に流用費消した行為の擬律と判例違反の主張の適否 #:論旨は被告人Aは自己の名義ではなく、判示銀行の名義で判示金員を貸付けたのであるから背任罪を以て問擬すべきであるに拘わらず横領罪として処罰した原判決は大審院判例(昭和10年(れ)第502号同年7月3日刑事第三部判決)に反すると主張する。記録に懲するに第一審判決並に第二審判決は何れも被告人Aが銀行名義を以て判示金員を貸付けた事実は認定していない。ただ原判決は銀行の出納係主任が他人と共謀して業務上保管にかかる金員をほしいまゝに他人の営業資金に流用して費消したときは自己の物として不法に領得する意思を実現したものであるからたとえ右の流用が銀行名義を以てする貸付の形式をとつても出納係主任に金員貸付の権限が全くない以上右の行為は業務上横領罪を構成し背任罪に問擬すべきものでないと判示したことは所論の通りである。按ずるに<u>他人の物の占有者が委託の任務に背いてその物について権限を有しないに拘わらず所有者でなければできないような処分をする意思を以て自己の保管にかかる物を処分すれば横領罪は成立する</u>ことは当裁判所判例の示すところである。(昭和23年(れ)第1412号同24年3月8日第三小法廷判決)そのして原判決は右当裁判所判例と同一趣旨であることは判文上明白であるから論旨は理由がない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=54505&hanreiKbn=02 横領](最高裁判決 昭和26年05月25日) #;使途を定められて寄託された金銭と横領罪 #:使途を定められて寄託された金銭については特別の事情のないかぎり受託者は刑法第252条にいわゆる「他人ノ物」を占有するものと解すべきであつて、受託者がその金銭について擅に委託の本旨に違つた処分をしたときは横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=64471&hanreiKbn=02 公文書偽造、業務上横領、横領、臨時物資需給調整法第違反、銃砲等所持禁止令違反](最高裁判決 昭和27年10月17日)銃砲等所持禁止令1条1項,銃砲等所持禁止令附則2項 #;横領罪の成立に必要な不法領得の意思を発現する行為の意義 #:横領罪は自己の占有する他人の物を自己に領得する意思を外部に発現する行為があつたときに成立するものである。そしてその不法領得の意思を発現する行為は必ずしもその物の処方のような客観的な領得行為たることを要せず、単に領得の意思をもつて為した行為たるをもつて足るのである。 #<span id="二重売買"/>[http://www.courts.go.jp/search/jhsp0030?hanreiid=56953&hanreiKbn=02 横領](最高裁判決 昭和30年12月26日) #;不動産の二重売買と横領罪 #:不動産の所有権が売買によつて買主に移転した場合、登記簿上の所有名義がなお売主にあるときは、売主はその不動産を占有するものと解すべく、従つていわゆる二重売買においては横領罪が成立する。 #:*なお、[[刑法第247条#二重抵当|二重抵当の設定は背任罪を構成する]]。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51322&hanreiKbn=02 横領、たばこ専売法第違反](最高裁判決 昭和31年06月26日) ##'''他に所有権移転後未だその旨の登記を経ざる不動産を、悪意にて代物弁済として所有権を取得する行為と横領罪共犯の成否''' ##:甲がその所有にかかる不動産を第三者に売却し所有権を移転したるも未だその旨の登記を了しない場合において、乙がその情を知りながら甲に対する債権の代物弁済として右不動産の所有権を取得しその旨の登記をしたとしても、乙は適法に所有権を取得したものであるから、甲の不動産横領罪の共犯とはならない。 ##'''いわゆる事後処分として横領罪を構成しない一事例''' ##:甲がその所有にかかる不動産を第三者に売却し所有権を移転したるも未だその旨の登記を了しないことを奇貨とし、乙に対し右不動産につき抵当権を設定しその旨の登記をするときは横領罪が成立する。従つて、甲がその後更に乙に対し右不動産の所有権を移転してその旨の登記をした場合には前記抵当権設定登記をした時に横領罪が成立し右所有権移転契約後登記の直前に抵当権設定登記を抹消したとしても、更に横領罪を構成するものではない。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=50497 窃盗](最高裁決定昭和32年4月25日) #;窃盗罪を構成する一事例 #:他人からその所有の衣類在中の繩掛け梱包した行李を預かり保管中質種に供する目的で梱包を解き行李から衣類を取り出したときは、衣類の窃盗罪を構成する。 #:*他人からその所有の衣類在中の縄掛け梱包した行李一個を預り保管していたような場合は、所有者たる他人は行李在中の衣類に対しその所持を失うものでないから、被告人が他から金借する質種に供する目的で擅に梱包を解き右行李から衣類を取出したときは、衣類の窃盗罪を構成し横領罪を構成しない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51303&hanreiKbn=02 横領](最高裁決定 昭和32年12月19日) #;設立中の株式会社の財産について横領罪の成立する一事例 #:株式会社設立のため出資された資金によつて建設された建物が、会社設立前でも出資者の組合財産であると認められる場合は、その組合の事業を委されている者がこれを自己名義に保存登記をした上、自己の債務の弁済に供するため他に譲渡した場合は横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=56820&hanreiKbn=02 業務上横領、暴力行為等処罰に関する法第律違反](最高裁判決 昭和33年09月19日)[[労働組合法第1条]]2項,[[刑法第253条]],[[日本国憲法第28条|憲法第28条]] #;いわゆる納金ストと横領罪の成否 #:労働争議の手段として、集金した電気料金を、会社に納入しないで、一時自己の下に保管し、しかもその保管の方法が会社のため安全且つ確実なものであり、毫も自らこれを利用、処分する意思なく、争議解決まで、専ら会社のため一時保管の意味で単に形式上自己名義の預金としたに過ぎない場合には、右のごとき抑留保管の所為をもつて直ちに横領罪の成立を認むべきでない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51480&hanreiKbn=02 業務上横領](最高裁判決 昭和34年02月13日) #;農林漁業資金融通法による政府貸付金について業務上横領罪の成立する場合 #:社団法人たる森林組合を代表し組合業務一切を掌理する組合長および組合長を補佐し組合業務を執行する組合常務理事が、農林漁業資金融通法(昭和26年法律第105号)の規定により政府から組合に対し組合員に造林資金として転貸交付する目的をもつて貸付され、右転貸資金以外他のいかなる用途にも流用支出することのできない金員を組合のため業務上保管中共謀の上その保管方法と使途の規正に反し、もつぱら第三者たる地方公共団体の利益を図り、その諸経費支払資金に充てしめるため、ほしいままにこれに貸付支出したときは、対政府関係における融資条件違反の罰則の有無にかかわらず、また、たとえその金員が組合の所有に属し、右第三者に対する貸付が組合名義をもつて処理されているとしても、横領罪の成立に必要な不法領得の意思ありと認めて妨げなく、業務上横領罪が成立する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51670&hanreiKbn=02 横領、器物損壊](最高裁決定 昭和35年12月27日) #;応訴して自己の所有権を主張・抗争する所為は横領罪を構成するか #:登記簿上自己が所有名義人となつて預り保管中の不動産につき所有権移転登記手続請求の訴を提起された場合に、右不動産に対する不法領得意思の確定的発現として、右訴訟において自己の所有権を主張・抗争する所為は、不動産の横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=50602&hanreiKbn=02 賍物牙保、横領](最高裁判決 昭和36年10月10日) #;賍物の牙保者がその売却代金を着服した場合と横領罪の成否 #:窃盗犯人から賍物の牙保を依頼されてその交付を受けた牙保者が、その売却代金をほしいままに着服した場合は、横領罪が成立する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=50903&hanreiKbn=02 業務上横領](最高裁決定 昭和45年03月27日) ##'''商品市場における売買取引の委託について顧客から商品仲買人に委託証拠金の代用として有価証券を預託する行為の法律上の性質''' ##:商品市場における売買取引の委託について、顧客から商品仲買人に委託証拠金の代用として有価証券を預託する行為の法律上の性質は、根質権の設定であつて、消費寄託ではない。 ##'''転質と横領罪の成否''' ##:質権者は、質権設定者の同意がなくても、その権利の範囲内において質物を転質となしうるが、新たに設定された質権が原質権の範囲を超越するときは、横領罪を構成する。 ##'''商品仲買人がいわゆる委託証拠金充用証券を担保に差し入れる行為が業務上横領罪にあたるとされた事例''' ##:商品仲買人が、いわゆる委託証拠金充用証券を顧客の同意なく担保に差し入れる行為は、それが原質権の範囲を超越しているときは、業務上横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=60391&hanreiKbn=02 横領](最高裁決定 昭和55年07月15日) #;自動車販売会社から所有権留保の特約付割賦売買契約に基づいて引渡を受けた自動車を金融業者に対し自己の借入金の担保として提供した所為が横領罪に該当するとされた事例 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=37501&hanreiKbn=02 電磁的公正証書原本不実記録,同供用,横領被告事件](最高裁決定 平成21年03月26日) #;他人所有の建物を同人のために預かり保管していた者が,金銭的利益を得ようとして,同建物の電磁的記録である登記記録に不実の抵当権設定仮登記を了したことにつき,電磁的公正証書原本不実記録罪及び同供用罪とともに,横領罪が成立するとされた事例 #:甲会社から乙及び丙に順次譲渡されたものの,所有権移転登記が未了のため甲会社が登記簿上の所有名義人であった建物を,甲会社の実質的代表者として丙のために預かり保管していた被告人が,甲会社が名義人であることを奇貨とし,乙及び丙から原状回復にしゃ口して解決金を得ようと企て,上記建物に係る電磁的記録である登記記録に不実の抵当権設定仮登記を了した場合には,電磁的公正証書原本不実記録罪及び同供用罪とともに,横領罪が成立する。 ---- {{前後 |[[コンメンタール刑法|刑法]] |[[コンメンタール刑法#2|第2編 罪]]<br> [[コンメンタール刑法#2-38|第38章 横領の罪]]<br> |[[刑法第251条]]<br>(準用) |[[刑法第253条]]<br>(業務上横領) }} {{stub|law}} [[category:刑法|252]] nyop075a0xf2halmnsy10nj0yg1xiap 264134 264130 2024-11-24T19:45:34Z Tomzo 248 /* 判例 */ 264134 wikitext text/x-wiki *[[法学]]>[[刑事法]]>[[刑法]]>[[コンメンタール刑法]] *[[法学]]>[[コンメンタール]]>[[コンメンタール刑法]] ==条文== (横領) ;第252条 # 自己の占有する他人の物を横領した者は、5年以下の拘禁刑に処する。 # 自己の物であっても、公務所から保管を命ぜられた場合において、これを横領した者も、前項と同様とする。 ===改正経緯=== 2022年、以下のとおり改正(施行日2025年6月1日)。 :(改正前)懲役 :(改正後)拘禁刑 ==解説== {{wikipedia|横領罪}} ==参照条文== ==判例== #[http://www.courts.go.jp/search/jhsp0030?hanreiid=55404&hanreiKbn=02 横領](最高裁判決 昭和23年06月05日) #;贈賄のためその資金を預かつた者の領得行為と横領罪 #:不法原因の爲め給付をした者はその給付したものの返還を請求することができないことは、[[民法第708条]]の規定するところであるが刑法第252条第1項の横領罪の目的物は単に犯人の占有する他人の物であることを要件としているのであつて必ずしも物の給付者において民法上その返還を請求し得べきものであることを要件としていない。 #<span id="不法領得の意思"/>[https://www.courts.go.jp/app/hanrei_jp/detail2?id=56494 業務上横領](最高裁判決 昭和24年03月88日) #*同旨:[https://www.courts.go.jp/app/hanrei_jp/detail2?id=74697 最判昭和23年07月16日]、[https://www.courts.go.jp/app/hanrei_jp/detail2?id=55408 最判昭和24年06月29日] #;横領罪の成立に必要な不法領得の意思の意義 #:横領罪の成立に必要な不法領得の意思とは、他人の物の占有者が委託の任務に背いて、その物につき権限がないのに所有者でなければできないような処分をする意思をいうのであつて必ずしも占有者が自己の利益取得を意図することを必要とするものではなく、又占有者において不法に処分したものを後日に補填する意思が行為当時にあつたからとて横領罪の成立を妨げるものではない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=55239&hanreiKbn=02 窃盜](最高裁判決 昭和25年11月15日)[[刑法第235条]] #;生産管理開始のときから占有していた物を後に領得した行為の擬律 #:被告人等が本件生産管理開始のときから判示鉄板を占有していたとしても、それは違法の占有であるから、後にこれを領得しても横領罪とはならず窃盗罪となる。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=67624&hanreiKbn=02 業務上横領、横領](最高裁判決 昭和26年01月23日)[[刑法第247条]],刑訴法第405条3号 #;銀行の出納係主任が他人と共謀して業務上保管にかかる金品を擅に他人の営業資金に流用費消した行為の擬律と判例違反の主張の適否 #:論旨は被告人Aは自己の名義ではなく、判示銀行の名義で判示金員を貸付けたのであるから背任罪を以て問擬すべきであるに拘わらず横領罪として処罰した原判決は大審院判例(昭和10年(れ)第502号同年7月3日刑事第三部判決)に反すると主張する。記録に懲するに第一審判決並に第二審判決は何れも被告人Aが銀行名義を以て判示金員を貸付けた事実は認定していない。ただ原判決は銀行の出納係主任が他人と共謀して業務上保管にかかる金員をほしいまゝに他人の営業資金に流用して費消したときは自己の物として不法に領得する意思を実現したものであるからたとえ右の流用が銀行名義を以てする貸付の形式をとつても出納係主任に金員貸付の権限が全くない以上右の行為は業務上横領罪を構成し背任罪に問擬すべきものでないと判示したことは所論の通りである。按ずるに<u>他人の物の占有者が委託の任務に背いてその物について権限を有しないに拘わらず所有者でなければできないような処分をする意思を以て自己の保管にかかる物を処分すれば横領罪は成立する</u>ことは当裁判所判例の示すところである。(昭和23年(れ)第1412号同24年3月8日第三小法廷判決)そのして原判決は右当裁判所判例と同一趣旨であることは判文上明白であるから論旨は理由がない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=54505&hanreiKbn=02 横領](最高裁判決 昭和26年05月25日) #;使途を定められて寄託された金銭と横領罪 #:使途を定められて寄託された金銭については特別の事情のないかぎり受託者は刑法第252条にいわゆる「他人ノ物」を占有するものと解すべきであつて、受託者がその金銭について擅に委託の本旨に違つた処分をしたときは横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=64471&hanreiKbn=02 公文書偽造、業務上横領、横領、臨時物資需給調整法第違反、銃砲等所持禁止令違反](最高裁判決 昭和27年10月17日)銃砲等所持禁止令1条1項,銃砲等所持禁止令附則2項 #;横領罪の成立に必要な不法領得の意思を発現する行為の意義 #:横領罪は自己の占有する他人の物を自己に領得する意思を外部に発現する行為があつたときに成立するものである。そしてその不法領得の意思を発現する行為は必ずしもその物の処方のような客観的な領得行為たることを要せず、単に領得の意思をもつて為した行為たるをもつて足るのである。 #<span id="二重売買"/>[http://www.courts.go.jp/search/jhsp0030?hanreiid=56953&hanreiKbn=02 横領](最高裁判決 昭和30年12月26日) #;不動産の二重売買と横領罪 #:不動産の所有権が売買によつて買主に移転した場合、登記簿上の所有名義がなお売主にあるときは、売主はその不動産を占有するものと解すべく、従つていわゆる二重売買においては横領罪が成立する。 #:*なお、[[刑法第247条#二重抵当|二重抵当の設定は背任罪を構成する]]。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51322&hanreiKbn=02 横領、たばこ専売法第違反](最高裁判決 昭和31年06月26日) ##'''他に所有権移転後未だその旨の登記を経ざる不動産を、悪意にて代物弁済として所有権を取得する行為と横領罪共犯の成否''' ##:甲がその所有にかかる不動産を第三者に売却し所有権を移転したるも未だその旨の登記を了しない場合において、乙がその情を知りながら甲に対する債権の代物弁済として右不動産の所有権を取得しその旨の登記をしたとしても、乙は適法に所有権を取得したものであるから、甲の不動産横領罪の共犯とはならない。 ##'''いわゆる事後処分として横領罪を構成しない一事例''' ##:甲がその所有にかかる不動産を第三者に売却し所有権を移転したるも未だその旨の登記を了しないことを奇貨とし、乙に対し右不動産につき抵当権を設定しその旨の登記をするときは横領罪が成立する。従つて、甲がその後更に乙に対し右不動産の所有権を移転してその旨の登記をした場合には前記抵当権設定登記をした時に横領罪が成立し右所有権移転契約後登記の直前に抵当権設定登記を抹消したとしても、更に横領罪を構成するものではない。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=50497 窃盗](最高裁決定昭和32年4月25日) #;窃盗罪を構成する一事例 #:他人からその所有の衣類在中の繩掛け梱包した行李を預かり保管中質種に供する目的で梱包を解き行李から衣類を取り出したときは、衣類の窃盗罪を構成する。 #:*他人からその所有の衣類在中の縄掛け梱包した行李一個を預り保管していたような場合は、所有者たる他人は行李在中の衣類に対しその所持を失うものでないから、被告人が他から金借する質種に供する目的で擅に梱包を解き右行李から衣類を取出したときは、衣類の窃盗罪を構成し横領罪を構成しない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51303&hanreiKbn=02 横領](最高裁決定 昭和32年12月19日) #;設立中の株式会社の財産について横領罪の成立する一事例 #:株式会社設立のため出資された資金によつて建設された建物が、会社設立前でも出資者の組合財産であると認められる場合は、その組合の事業を委されている者がこれを自己名義に保存登記をした上、自己の債務の弁済に供するため他に譲渡した場合は横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=56820&hanreiKbn=02 業務上横領、暴力行為等処罰に関する法第律違反](最高裁判決 昭和33年09月19日)[[労働組合法第1条]]2項,[[刑法第253条]],[[日本国憲法第28条|憲法第28条]] #;いわゆる納金ストと横領罪の成否 #:労働争議の手段として、集金した電気料金を、会社に納入しないで、一時自己の下に保管し、しかもその保管の方法が会社のため安全且つ確実なものであり、毫も自らこれを利用、処分する意思なく、争議解決まで、専ら会社のため一時保管の意味で単に形式上自己名義の預金としたに過ぎない場合には、右のごとき抑留保管の所為をもつて直ちに横領罪の成立を認むべきでない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51480&hanreiKbn=02 業務上横領](最高裁判決 昭和34年02月13日) #;農林漁業資金融通法による政府貸付金について業務上横領罪の成立する場合 #:社団法人たる森林組合を代表し組合業務一切を掌理する組合長および組合長を補佐し組合業務を執行する組合常務理事が、農林漁業資金融通法(昭和26年法律第105号)の規定により政府から組合に対し組合員に造林資金として転貸交付する目的をもつて貸付され、右転貸資金以外他のいかなる用途にも流用支出することのできない金員を組合のため業務上保管中共謀の上その保管方法と使途の規正に反し、もつぱら第三者たる地方公共団体の利益を図り、その諸経費支払資金に充てしめるため、ほしいままにこれに貸付支出したときは、対政府関係における融資条件違反の罰則の有無にかかわらず、また、たとえその金員が組合の所有に属し、右第三者に対する貸付が組合名義をもつて処理されているとしても、横領罪の成立に必要な不法領得の意思ありと認めて妨げなく、業務上横領罪が成立する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51670&hanreiKbn=02 横領、器物損壊](最高裁決定 昭和35年12月27日) #;応訴して自己の所有権を主張・抗争する所為は横領罪を構成するか #:登記簿上自己が所有名義人となつて預り保管中の不動産につき所有権移転登記手続請求の訴を提起された場合に、右不動産に対する不法領得意思の確定的発現として、右訴訟において自己の所有権を主張・抗争する所為は、不動産の横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=50602&hanreiKbn=02 賍物牙保、横領](最高裁判決 昭和36年10月10日) #;賍物の牙保者がその売却代金を着服した場合と横領罪の成否 #:窃盗犯人から賍物の牙保を依頼されてその交付を受けた牙保者が、その売却代金をほしいままに着服した場合は、横領罪が成立する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=50903&hanreiKbn=02 業務上横領](最高裁決定 昭和45年03月27日) ##'''商品市場における売買取引の委託について顧客から商品仲買人に委託証拠金の代用として有価証券を預託する行為の法律上の性質''' ##:商品市場における売買取引の委託について、顧客から商品仲買人に委託証拠金の代用として有価証券を預託する行為の法律上の性質は、根質権の設定であつて、消費寄託ではない。 ##'''転質と横領罪の成否''' ##:質権者は、質権設定者の同意がなくても、その権利の範囲内において質物を転質となしうるが、新たに設定された質権が原質権の範囲を超越するときは、横領罪を構成する。 ##'''商品仲買人がいわゆる委託証拠金充用証券を担保に差し入れる行為が業務上横領罪にあたるとされた事例''' ##:商品仲買人が、いわゆる委託証拠金充用証券を顧客の同意なく担保に差し入れる行為は、それが原質権の範囲を超越しているときは、業務上横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=60391&hanreiKbn=02 横領](最高裁決定 昭和55年07月15日) #;自動車販売会社から所有権留保の特約付割賦売買契約に基づいて引渡を受けた自動車を金融業者に対し自己の借入金の担保として提供した所為が横領罪に該当するとされた事例 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=37501&hanreiKbn=02 電磁的公正証書原本不実記録,同供用,横領被告事件](最高裁決定 平成21年03月26日) #;他人所有の建物を同人のために預かり保管していた者が,金銭的利益を得ようとして,同建物の電磁的記録である登記記録に不実の抵当権設定仮登記を了したことにつき,電磁的公正証書原本不実記録罪及び同供用罪とともに,横領罪が成立するとされた事例 #:甲会社から乙及び丙に順次譲渡されたものの,所有権移転登記が未了のため甲会社が登記簿上の所有名義人であった建物を,甲会社の実質的代表者として丙のために預かり保管していた被告人が,甲会社が名義人であることを奇貨とし,乙及び丙から原状回復にしゃ口して解決金を得ようと企て,上記建物に係る電磁的記録である登記記録に不実の抵当権設定仮登記を了した場合には,電磁的公正証書原本不実記録罪及び同供用罪とともに,横領罪が成立する。 ---- {{前後 |[[コンメンタール刑法|刑法]] |[[コンメンタール刑法#2|第2編 罪]]<br> [[コンメンタール刑法#2-38|第38章 横領の罪]]<br> |[[刑法第251条]]<br>(準用) |[[刑法第253条]]<br>(業務上横領) }} {{stub|law}} [[category:刑法|252]] k0va6uzv2imlc00kow4qnetqhksxo22 264138 264134 2024-11-24T22:10:12Z Tomzo 248 /* 判例 */ 264138 wikitext text/x-wiki *[[法学]]>[[刑事法]]>[[刑法]]>[[コンメンタール刑法]] *[[法学]]>[[コンメンタール]]>[[コンメンタール刑法]] ==条文== (横領) ;第252条 # 自己の占有する他人の物を横領した者は、5年以下の拘禁刑に処する。 # 自己の物であっても、公務所から保管を命ぜられた場合において、これを横領した者も、前項と同様とする。 ===改正経緯=== 2022年、以下のとおり改正(施行日2025年6月1日)。 :(改正前)懲役 :(改正後)拘禁刑 ==解説== {{wikipedia|横領罪}} ==参照条文== ==判例== #[http://www.courts.go.jp/search/jhsp0030?hanreiid=55404&hanreiKbn=02 横領](最高裁判決 昭和23年06月05日) #;贈賄のためその資金を預かつた者の領得行為と横領罪 #:不法原因の爲め給付をした者はその給付したものの返還を請求することができないことは、[[民法第708条]]の規定するところであるが刑法第252条第1項の横領罪の目的物は単に犯人の占有する他人の物であることを要件としているのであつて必ずしも物の給付者において民法上その返還を請求し得べきものであることを要件としていない。 #<span id="不法領得の意思"/>[https://www.courts.go.jp/app/hanrei_jp/detail2?id=56494 業務上横領](最高裁判決 昭和24年03月08日) #*同旨:[https://www.courts.go.jp/app/hanrei_jp/detail2?id=74697 最判昭和23年07月16日]、[https://www.courts.go.jp/app/hanrei_jp/detail2?id=55408 最判昭和24年06月29日] #;横領罪の成立に必要な不法領得の意思の意義 #:横領罪の成立に必要な不法領得の意思とは、他人の物の占有者が委託の任務に背いて、その物につき権限がないのに所有者でなければできないような処分をする意思をいうのであつて必ずしも占有者が自己の利益取得を意図することを必要とするものではなく、又占有者において不法に処分したものを後日に補填する意思が行為当時にあつたからとて横領罪の成立を妨げるものではない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=55239&hanreiKbn=02 窃盜](最高裁判決 昭和25年11月15日)[[刑法第235条]] #;生産管理開始のときから占有していた物を後に領得した行為の擬律 #:被告人等が本件生産管理開始のときから判示鉄板を占有していたとしても、それは違法の占有であるから、後にこれを領得しても横領罪とはならず窃盗罪となる。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=67624&hanreiKbn=02 業務上横領、横領](最高裁判決 昭和26年01月23日)[[刑法第247条]],刑訴法第405条3号 #;銀行の出納係主任が他人と共謀して業務上保管にかかる金品を擅に他人の営業資金に流用費消した行為の擬律と判例違反の主張の適否 #:論旨は被告人Aは自己の名義ではなく、判示銀行の名義で判示金員を貸付けたのであるから背任罪を以て問擬すべきであるに拘わらず横領罪として処罰した原判決は大審院判例(昭和10年(れ)第502号同年7月3日刑事第三部判決)に反すると主張する。記録に懲するに第一審判決並に第二審判決は何れも被告人Aが銀行名義を以て判示金員を貸付けた事実は認定していない。ただ原判決は銀行の出納係主任が他人と共謀して業務上保管にかかる金員をほしいまゝに他人の営業資金に流用して費消したときは自己の物として不法に領得する意思を実現したものであるからたとえ右の流用が銀行名義を以てする貸付の形式をとつても出納係主任に金員貸付の権限が全くない以上右の行為は業務上横領罪を構成し背任罪に問擬すべきものでないと判示したことは所論の通りである。按ずるに<u>他人の物の占有者が委託の任務に背いてその物について権限を有しないに拘わらず所有者でなければできないような処分をする意思を以て自己の保管にかかる物を処分すれば横領罪は成立する</u>ことは当裁判所判例の示すところであり([[#不法領得の意思|昭和23年(れ)第1412号同24年3月8日第三小法廷判決]])、原判決は右当裁判所判例と同一趣旨であることは判文上明白であるから論旨は理由がない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=54505&hanreiKbn=02 横領](最高裁判決 昭和26年05月25日) #;使途を定められて寄託された金銭と横領罪 #:使途を定められて寄託された金銭については特別の事情のないかぎり受託者は刑法第252条にいわゆる「他人ノ物」を占有するものと解すべきであつて、受託者がその金銭について擅に委託の本旨に違つた処分をしたときは横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=64471&hanreiKbn=02 公文書偽造、業務上横領、横領、臨時物資需給調整法第違反、銃砲等所持禁止令違反](最高裁判決 昭和27年10月17日)銃砲等所持禁止令1条1項,銃砲等所持禁止令附則2項 #;横領罪の成立に必要な不法領得の意思を発現する行為の意義 #:横領罪は自己の占有する他人の物を自己に領得する意思を外部に発現する行為があつたときに成立するものである。そしてその不法領得の意思を発現する行為は必ずしもその物の処方のような客観的な領得行為たることを要せず、単に領得の意思をもつて為した行為たるをもつて足るのである。 #:*被告人は、他人から同人所有の脇差及び太刀について銃砲等所持禁止令による保管許可申請手続をすることを頼まれてこれを受取り保管場所Aに保管中、これを自分の物として日頃交際する警察官に贈与する目的で故ら所定期日迄にその手続をせず以後擅に自己の為にこれを保管場所Aに蔵置していた。 #<span id="二重売買"/>[http://www.courts.go.jp/search/jhsp0030?hanreiid=56953&hanreiKbn=02 横領](最高裁判決 昭和30年12月26日) #;不動産の二重売買と横領罪 #:不動産の所有権が売買によつて買主に移転した場合、登記簿上の所有名義がなお売主にあるときは、売主はその不動産を占有するものと解すべく、従つていわゆる二重売買においては横領罪が成立する。 #:*なお、[[刑法第247条#二重抵当|二重抵当の設定は背任罪を構成する]]。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51322&hanreiKbn=02 横領、たばこ専売法第違反](最高裁判決 昭和31年06月26日) ##'''他に所有権移転後未だその旨の登記を経ざる不動産を、悪意にて代物弁済として所有権を取得する行為と横領罪共犯の成否''' ##:甲がその所有にかかる不動産を第三者に売却し所有権を移転したるも未だその旨の登記を了しない場合において、乙がその情を知りながら甲に対する債権の代物弁済として右不動産の所有権を取得しその旨の登記をしたとしても、乙は適法に所有権を取得したものであるから、甲の不動産横領罪の共犯とはならない。 ##'''いわゆる事後処分として横領罪を構成しない一事例''' ##:甲がその所有にかかる不動産を第三者に売却し所有権を移転したるも未だその旨の登記を了しないことを奇貨とし、乙に対し右不動産につき抵当権を設定しその旨の登記をするときは横領罪が成立する。従つて、甲がその後更に乙に対し右不動産の所有権を移転してその旨の登記をした場合には前記抵当権設定登記をした時に横領罪が成立し右所有権移転契約後登記の直前に抵当権設定登記を抹消したとしても、更に横領罪を構成するものではない。 # [https://www.courts.go.jp/app/hanrei_jp/detail2?id=50497 窃盗](最高裁決定昭和32年4月25日) #;窃盗罪を構成する一事例 #:他人からその所有の衣類在中の繩掛け梱包した行李を預かり保管中質種に供する目的で梱包を解き行李から衣類を取り出したときは、衣類の窃盗罪を構成する。 #:*他人からその所有の衣類在中の縄掛け梱包した行李一個を預り保管していたような場合は、所有者たる他人は行李在中の衣類に対しその所持を失うものでないから、被告人が他から金借する質種に供する目的で擅に梱包を解き右行李から衣類を取出したときは、衣類の窃盗罪を構成し横領罪を構成しない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51303&hanreiKbn=02 横領](最高裁決定 昭和32年12月19日) #;設立中の株式会社の財産について横領罪の成立する一事例 #:株式会社設立のため出資された資金によつて建設された建物が、会社設立前でも出資者の組合財産であると認められる場合は、その組合の事業を委されている者がこれを自己名義に保存登記をした上、自己の債務の弁済に供するため他に譲渡した場合は横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=56820&hanreiKbn=02 業務上横領、暴力行為等処罰に関する法第律違反](最高裁判決 昭和33年09月19日)[[労働組合法第1条]]2項,[[刑法第253条]],[[日本国憲法第28条|憲法第28条]] #;いわゆる納金ストと横領罪の成否 #:労働争議の手段として、集金した電気料金を、会社に納入しないで、一時自己の下に保管し、しかもその保管の方法が会社のため安全且つ確実なものであり、毫も自らこれを利用、処分する意思なく、争議解決まで、専ら会社のため一時保管の意味で単に形式上自己名義の預金としたに過ぎない場合には、右のごとき抑留保管の所為をもつて直ちに横領罪の成立を認むべきでない。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51480&hanreiKbn=02 業務上横領](最高裁判決 昭和34年02月13日) #;農林漁業資金融通法による政府貸付金について業務上横領罪の成立する場合 #:社団法人たる森林組合を代表し組合業務一切を掌理する組合長および組合長を補佐し組合業務を執行する組合常務理事が、農林漁業資金融通法(昭和26年法律第105号)の規定により政府から組合に対し組合員に造林資金として転貸交付する目的をもつて貸付され、右転貸資金以外他のいかなる用途にも流用支出することのできない金員を組合のため業務上保管中共謀の上その保管方法と使途の規正に反し、もつぱら第三者たる地方公共団体の利益を図り、その諸経費支払資金に充てしめるため、ほしいままにこれに貸付支出したときは、対政府関係における融資条件違反の罰則の有無にかかわらず、また、たとえその金員が組合の所有に属し、右第三者に対する貸付が組合名義をもつて処理されているとしても、横領罪の成立に必要な不法領得の意思ありと認めて妨げなく、業務上横領罪が成立する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=51670&hanreiKbn=02 横領、器物損壊](最高裁決定 昭和35年12月27日) #;応訴して自己の所有権を主張・抗争する所為は横領罪を構成するか #:登記簿上自己が所有名義人となつて預り保管中の不動産につき所有権移転登記手続請求の訴を提起された場合に、右不動産に対する不法領得意思の確定的発現として、右訴訟において自己の所有権を主張・抗争する所為は、不動産の横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=50602&hanreiKbn=02 賍物牙保、横領](最高裁判決 昭和36年10月10日) #;賍物の牙保者がその売却代金を着服した場合と横領罪の成否 #:窃盗犯人から賍物の牙保を依頼されてその交付を受けた牙保者が、その売却代金をほしいままに着服した場合は、横領罪が成立する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=50903&hanreiKbn=02 業務上横領](最高裁決定 昭和45年03月27日) ##'''商品市場における売買取引の委託について顧客から商品仲買人に委託証拠金の代用として有価証券を預託する行為の法律上の性質''' ##:商品市場における売買取引の委託について、顧客から商品仲買人に委託証拠金の代用として有価証券を預託する行為の法律上の性質は、根質権の設定であつて、消費寄託ではない。 ##'''転質と横領罪の成否''' ##:質権者は、質権設定者の同意がなくても、その権利の範囲内において質物を転質となしうるが、新たに設定された質権が原質権の範囲を超越するときは、横領罪を構成する。 ##'''商品仲買人がいわゆる委託証拠金充用証券を担保に差し入れる行為が業務上横領罪にあたるとされた事例''' ##:商品仲買人が、いわゆる委託証拠金充用証券を顧客の同意なく担保に差し入れる行為は、それが原質権の範囲を超越しているときは、業務上横領罪を構成する。 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=60391&hanreiKbn=02 横領](最高裁決定 昭和55年07月15日) #;自動車販売会社から所有権留保の特約付割賦売買契約に基づいて引渡を受けた自動車を金融業者に対し自己の借入金の担保として提供した所為が横領罪に該当するとされた事例 #[http://www.courts.go.jp/search/jhsp0030?hanreiid=37501&hanreiKbn=02 電磁的公正証書原本不実記録,同供用,横領被告事件](最高裁決定 平成21年03月26日) #;他人所有の建物を同人のために預かり保管していた者が,金銭的利益を得ようとして,同建物の電磁的記録である登記記録に不実の抵当権設定仮登記を了したことにつき,電磁的公正証書原本不実記録罪及び同供用罪とともに,横領罪が成立するとされた事例 #:甲会社から乙及び丙に順次譲渡されたものの,所有権移転登記が未了のため甲会社が登記簿上の所有名義人であった建物を,甲会社の実質的代表者として丙のために預かり保管していた被告人が,甲会社が名義人であることを奇貨とし,乙及び丙から原状回復にしゃ口して解決金を得ようと企て,上記建物に係る電磁的記録である登記記録に不実の抵当権設定仮登記を了した場合には,電磁的公正証書原本不実記録罪及び同供用罪とともに,横領罪が成立する。 ---- {{前後 |[[コンメンタール刑法|刑法]] |[[コンメンタール刑法#2|第2編 罪]]<br> [[コンメンタール刑法#2-38|第38章 横領の罪]]<br> |[[刑法第251条]]<br>(準用) |[[刑法第253条]]<br>(業務上横領) }} {{stub|law}} [[category:刑法|252]] db8n0b0g2sy33ii1fhdfw2n46ncjfyr 刑法第253条 0 14153 264133 246574 2024-11-24T19:36:10Z Tomzo 248 264133 wikitext text/x-wiki *[[法学]]>[[刑事法]]>[[刑法]]>[[コンメンタール刑法]] *[[法学]]>[[コンメンタール]]>[[コンメンタール刑法]] ==条文== (業務上横領) ;第253条 : 業務上自己の占有する他人の物を横領した者は、10年以下の拘禁刑に処する。 ===改正経緯=== 2022年、以下のとおり改正(施行日2025年6月1日)。 :(改正前)懲役 :(改正後)拘禁刑 ==解説== {{wikipedia|横領罪}} ==参照条文== ==判例== ★主に「業務」に関する判例 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=55318 業務上横領](最高裁判決昭和23年6月5日) #;刑法第253条の業務 #:復員事務官でA上陸地連絡所庶務課勤務を命ぜられた者が他課の所管ではあるが復員者に対する旅費の交付及びこれに充てる国庫の前渡資金保管の事務についても平素から事質上担当主任事務官の輔佐としてこれに従事し関係上司においてもこれを認めていた以上特にその命令に出でたものでなくてもその事務の処理は刑法第253条のいわゆる業務に該当するものと解すべきである。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=74951 業務上横領](最高裁判決昭和25年3月24日) #;刑法第253条にいわゆる「業務」の意義と民生委員の担当事務が業務に該る一例 #:刑法第253条にいわゆる業務とは法令によると慣例によると将に契約によるとを問わず苟も一定の事務を営業として反覆する場合を指称するのである。従って本件において判示給与金品の伝達事務が被告人の民生委員としての法令上当然の業務でなくても判示a村において判示日時以降民生委員を通して給与金員を支給されることになり被告人が民生委員としてその事務を担当するに至つた事実のある以上その事務は被告人の業務と解すべきである。 ---- {{前後 |[[コンメンタール刑法|刑法]] |[[コンメンタール刑法#2|第2編 罪]]<br> [[コンメンタール刑法#2-38|第38章 横領の罪]]<br> |[[刑法第252条]]<br>(横領) |[[刑法第254条]]<br>(遺失物等横領) }} {{stub|law}} [[category:刑法|253]] [[category:業務犯|253]] 55ce31nu46huu3msg6tmk8bn5fzjjdd 264135 264133 2024-11-24T20:00:42Z Tomzo 248 /* 判例 */ 264135 wikitext text/x-wiki *[[法学]]>[[刑事法]]>[[刑法]]>[[コンメンタール刑法]] *[[法学]]>[[コンメンタール]]>[[コンメンタール刑法]] ==条文== (業務上横領) ;第253条 : 業務上自己の占有する他人の物を横領した者は、10年以下の拘禁刑に処する。 ===改正経緯=== 2022年、以下のとおり改正(施行日2025年6月1日)。 :(改正前)懲役 :(改正後)拘禁刑 ==解説== {{wikipedia|横領罪}} ==参照条文== ==判例== ★主に「業務」に関する判例 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=55318 業務上横領](最高裁判決昭和23年6月5日) #;刑法第253条の業務 #:復員事務官でA上陸地連絡所庶務課勤務を命ぜられた者が他課の所管ではあるが復員者に対する旅費の交付及びこれに充てる国庫の前渡資金保管の事務についても平素から事質上担当主任事務官の輔佐としてこれに従事し関係上司においてもこれを認めていた以上特にその命令に出でたものでなくてもその事務の処理は刑法第253条のいわゆる業務に該当するものと解すべきである。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=74951 業務上横領](最高裁判決昭和25年3月24日) #;刑法第253条にいわゆる「業務」の意義と民生委員の担当事務が業務に該る一例 #:刑法第253条にいわゆる業務とは法令によると慣例によると将に契約によるとを問わず苟も一定の事務を営業として反覆する場合を指称するのである。従って本件において判示給与金品の伝達事務が被告人の民生委員としての法令上当然の業務でなくても判示a村において判示日時以降民生委員を通して給与金員を支給されることになり被告人が民生委員としてその事務を担当するに至つた事実のある以上その事務は被告人の業務と解すべきである。 #[https://www.courts.go.jp/app/hanrei_jp/detail2?id=66969 業務上横領等](最高裁判決昭和26年6月12日) #;会社がその業務に関係なく受託保管した物を保管する右会社の物資保管担当者の不法領得行為と業務上横領罪の成立 #:被告人の本件特殊物件の保管が、同被告人の業務(「会社」の生産部長事務取扱として同会社の所要資材の調査出納保管の事務を担当す)に属するものである。そしてまた、「会社」が運輸省のために右特殊物件を保管したことが、「会社」の業務に属するものでないとしても、被告人の右物件の横領行為に対しては業務上横領罪が成立する。 ---- {{前後 |[[コンメンタール刑法|刑法]] |[[コンメンタール刑法#2|第2編 罪]]<br> [[コンメンタール刑法#2-38|第38章 横領の罪]]<br> |[[刑法第252条]]<br>(横領) |[[刑法第254条]]<br>(遺失物等横領) }} {{stub|law}} [[category:刑法|253]] [[category:業務犯|253]] tjavuv6vgdy25ilaa1rcaplcx14752o PHP/入門/関数とは 0 18238 264139 228003 2024-11-24T22:54:31Z Ef3 694 s/(<syntaxhighlight lang=.*)>/$1 copy>/22 264139 wikitext text/x-wiki <includeonly> = 関数 = </includeonly> <noinclude> {{Nav}} </noinclude> 関数は、プログラムを書く上で非常に重要な概念です。関数を使うことによって、同じ処理を何度も繰り返す必要がなくなり、コードの再利用性が高まります。また、関数は複雑な処理を単純な手順に分割することができ、プログラムの可読性や保守性を向上させます。 PHPにおいても、関数は非常に重要な役割を担っています。PHPには多くの便利な組み込み関数が用意されており、また、自分で関数を定義することもできます。この章では、PHPで関数を使う方法や、関数の定義方法、引数や戻り値の扱い方などを解説します。関数を使いこなすことで、より高度なプログラミングを行うことができるようになるでしょう。 __TOC__ == 関数定義と呼出し == PHPの関数定義の構文は以下の通りです。 ;PHPの関数定義の構文:<syntaxhighlight lang=php copy> function 関数名(引数1, 引数2, ...) { // 処理内容 return 戻り値; } </syntaxhighlight> # <code>function</code> キーワードで関数定義を開始します。 # <code>関数名</code> には任意の名前を付けます。関数名は英数字とアンダースコア(_)の組み合わせで構成されます。また、関数名は大文字小文字を区別しません。 # <code>()</code> 内に引数を定義します。引数は任意の数だけ定義できます。引数がない場合は、<code>()</code> だけを記述します。 # <code>{}</code> 内に処理内容を記述します。 # <code>return</code> キーワードを使って、関数から返す値を定義します。<code>return</code> 文がない場合、関数は何も返しません。 以下は、具体的な例です。 ;[https://paiza.io/projects/MRQwNwTZ9ax9lwxgy4gHOA?language=php 関数定義と呼出しの例]:<syntaxhighlight lang=php copy> <?php function greet($name) { echo "Hello, {$name}!", PHP_EOL; } greet("John"); // "Hello, John!" と出力される ?> </syntaxhighlight> : このコードは、引数として受け取った <code>$name</code> を使って、「Hello, 名前!」というメッセージを表示する関数 <code>greet()</code> を定義し、その関数を <code>"John"</code> という引数で呼出しています。 : 具体的には、<code>greet()</code> 関数に <code>"John"</code> という文字列を引数として渡し、関数内で <code>"Hello, {$name}!"</code> という文字列を表示しています。<code>{$name}</code> は、変数 <code>$name</code> の値を埋め込んだ文字列として扱われます。 : そして、<code>greet("John");</code> という呼出しを行うことで、関数 <code>greet()</code> が引数 <code>"John"</code> を受け取り、<code>"Hello, John!"</code> という文字列を表示する処理が実行されます。結果として、画面に <code>"Hello, John!"</code> というメッセージが表示されます。 : このように、関数を定義することで、同じような処理を何度も簡単に実行することができます。また、関数に引数を渡すことで、処理の柔軟性が高まり、より汎用的な関数を作ることができます。 : PHP_EOLは、PHPの内部定数であり、OSごとの改行文字列を表します。つまり、Windowsでは"\r\n"、LinuxやmacOSでは"\n"が使用されます。 : この定数は、プログラムを複数のプラットフォームで実行する場合に便利です。改行文字列を明示的に指定することで、プログラムがどのプラットフォームでも同じ出力を生成することができます。 === 関数の引数と戻値 === PHPの関数は、0個以上の引数を渡すことができます。引数は関数内で変数として扱われます。引数の値は、関数呼出しの際に渡されます。 ;[https://paiza.io/projects/lQKREhXGKAXX-d2Zo2pt3w?language=php 関数の引数と戻値の例]:<syntaxhighlight lang=php copy> <?php function add($a, $b) { return $a + $b; } $result = add(3, 5); // $resultには8が代入される ?> </syntaxhighlight> :上記の例では、<code>add</code> という関数を定義しています。この関数は、2つの引数 $a と $b を受け取り、それらを加算した値を返すという処理を行っています。 :そして、<code>add</code> 関数に引数として 3 と 5 を渡して呼出し、その戻り値を $result 変数に代入しています。 === 可変長引数 === また、PHPには可変長引数という機能があります。これは、引数の数が可変である場合に使用することができます。可変長引数は、<code>...</code> を引数の前に付けて定義します。 ;[https://paiza.io/projects/lqb5Pga9hLcGONiQ0OrGNg?language=php 可変長引数の例]:<syntaxhighlight lang=php copy> <?php function sum(...$numbers) { $total = 0; foreach ($numbers as $number) { $total += $number; } return $total; } $result1 = sum(1, 2, 3); // $result1には6が代入される $result2 = sum(4, 5, 6, 7); // $result2には22が代入される ?> </syntaxhighlight> :上記の例では、sum という関数を定義しています。この関数は、可変長引数 $numbers を受け取り、引数に渡された数値をすべて加算してその結果を返すという処理を行っています。 :そして、sum 関数に引数として 1、2、3 を渡して呼出し、その戻り値を $result1 変数に代入し、次に引数として 4、5、6、7 を渡して呼出し、その戻り値を $result2 変数に代入しています。 === 残余引数 === 残余引数も可変長引数と同様に多数の引数を渡すことができますが、配列として渡されます。また、可変長引数とは異なり、残余引数は引数のリストの途中に配置することができます。 以下は、残余引数を受け入れる関数の例です。 :<syntaxhighlight lang=php copy> <?php function scores($subject, $student, ...$scores) { $total = 0; foreach ($scores as $score) { $total += $score; } $average = $total / count($scores); echo "{$student} got an average of {$average} in {$subject}."; } scores("Math", "John", 80, 85, 90); //==> John got an average of 85 in Math. ?> </syntaxhighlight> === 引数のデフォルト値とキーワード引数 === さらに、PHP 8.0 からは、引数のデフォルト値を設定したり、キーワード引数を使った関数定義もサポートされました。引数にデフォルト値を設定する場合は、引数の後に = を付けてデフォルト値を指定します。また、キーワード引数を使う場合は、引数名を指定して値を渡すことができます。 ;[https://paiza.io/projects/g3c14A4SyQQApuHSSL_BVQ?language=php 引数のデフォルト値とキーワード引数の例]:<syntaxhighlight lang=php copy> <?php function greet($name = "World") { echo "Hello, {$name}!", PHP_EOL; } greet(); // "Hello, World!" と出力される greet("John"); // "Hello, John!" と出力される greet(name: "Alice"); // "Hello, JAlice" と出力される ?> </syntaxhighlight> ==== 型宣言 ==== 型宣言は、関数の引数や返り値、そして PHP 7.4.0 以降ではクラスのプロパティに追加することができます。 これらは、呼出し時に指定した型の値であることを保証し、 一致しない場合は TypeError がスローされます。 strict_types を 1 にセットすると、型宣言漏れをエラーにできます。 また、strict_types を有効にすると、関数の返り値の型宣言についても厳密なチェックが行われます。 つまり、返り値が宣言された型と異なる場合は TypeError がスローされます。 以下は、引数と返り値に型宣言を追加した greet() 関数の例です。 ;[https://paiza.io/projects/n6BJiE3txCAGD7kO4oCxIw?language=php 型宣言の例]:<syntaxhighlight lang=php copy> <?php declare(strict_types=1); function greet(string $name): string { // return 0; // PHP Fatal error: Uncaught TypeError: greet(): Return value must be of type string, int returned return "Hello, {$name}!"; } echo greet("John"); // "Hello, John!" と出力される // echo greet(123); // PHP Fatal error: Uncaught TypeError: greet(): Argument #1 ($name) must be of type string, int given // echo greet(); // PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function greet(), 0 passed ?> </syntaxhighlight> : このコードは、厳密な型チェックを有効にするために <code>declare(strict_types=1)</code> が宣言されている関数 <code>greet()</code> を定義しています。 : <code>greet()</code> 関数は、1 つの文字列型の引数 <code>$name</code> を受け取り、戻り値として文字列型の値を返します。このように、関数に対して厳密な型宣言がされているため、関数の引数と戻り値は指定された型と一致しなければなりません。 : <code>greet()</code> 関数が文字列型ではなく整数型を返す場合に <code>TypeError</code> がスローされます。 : <code>greet()</code> 関数に整数型を渡すと、<code>TypeError</code> がスローされ、エラーメッセージが表示されます。 : また、<code>greet()</code> 関数に引数を渡さずに呼出すと、引数が足りないため、<code>ArgumentCountError</code> がスローされます。 : <code>string</code> 型の引数を渡す必要があります。このように、引数と戻り値の型が厳密に指定されているため、不正な型が渡されると、<code>TypeError</code> がスローされます。 === PHPの関数定義の構文 === ;PHPの関数定義の構文:<syntaxhighlight lang=php copy> function 関数名(引数1の型 $引数1の名前 = デフォルト値, 引数2の型 $引数2の名前 = デフォルト値, ...可変長引数) : 戻り値の型 { // 関数の処理 return 戻り値; } </syntaxhighlight> ==== 有効な型 ==== プリミティブ型のほか、クラスやインターフェースの名前は、型名として認識されます。 以下は、PHPでサポートされる型とサポートされるようになったバージョンの一覧です。 :{| class="wikitable" |+ PHPの関数の引数や戻値の型 !型 !説明 !バージョン |- !int |整数 |5.0.0 |- !float |浮動小数点数 |5.0.0 |- !string |文字列 |5.0.0 |- !bool |真偽値 |4.2.0 |- !array |配列 |4.0.0 |- !object |オブジェクト |4.0.0 |- !callable |コールバック(関数名やクロージャなど) |5.4.0 |- !iterable |イテレータ |7.1.0 |- !self |自分自身のクラス |5.0.0 |- !parent |親クラス |5.0.0 |- !?int |nullまたは整数 |7.1.0 |- !?float |nullまたは浮動小数点数 |7.1.0 |- !?string |nullまたは文字列 |7.1.0 |- !?bool |nullまたは真偽値 |7.1.0 |- !?array |nullまたは配列 |7.1.0 |- !?object |nullまたはオブジェクト |7.2.0 |- !ClassName |クラス名 |5.0.0 |- !Interface |インターフェース名 |5.0.0 |- !array<int> |整数型の配列 |7.0.0 |- !array<mixed> |任意の型の配列 |7.0.0 |- !array<T> |型Tの配列。Tにはint,stringなどの型名を指定することができます。 |7.3.0 |} 注意点として、iterableやarray<T>などは、PHP 7.1.0以降でのみサポートされているため、それ以前のバージョンでは使用できません。 また、array<T>のようなジェネリック型は、厳密な型検査がされるわけではなく、実行時にエラーが発生する可能性があるので注意が必要です。 <!-- :{| class="wikitable" |+ PHPの関数の引数や戻値の型 !型 !説明 !バージョン |- | classまたはinterfacd の名前 | 値は与えられたクラスまたはインターフェースのインスタンスでなければなりません。 | |- |self | 値は型宣言が使用されているクラスと同じクラスのインスタンスでなければなりません。クラス内でのみ使用可能。 | |- |parent |型宣言が使われているクラスの親のインスタンスでなければなりません。クラス内でのみ使用可能。 | |- |array |値は配列でなければなりません。 | |- |callable |値は有効な callable である必要があります。クラスのプロパティの型宣言としては使用できません。 | |- |bool |値はブール値でなければなりません。 | |- |float |値は浮動小数点数でなければなりません。 | |- |int |値は整数値でなければなりません。 | |- |string |値は文字列でなければなりません。 | |- |iterable |値は、配列か Traversable のインスタンスでなければなりません。 |PHP 7.1.0 |- |object |値はオブジェクトでなければなりません。 |PHP 7.2.0 |- |mixed |値は任意の値であることができます。 |PHP 8.0.0 |} --> === 変数のスコープ === PHPには、ローカルスコープ、グローバルスコープ、そして静的スコープの3つのスコープがあります。 ==== ローカルスコープ ==== ローカルスコープは、関数内で宣言された変数が含まれます。この変数は、関数の実行が終了した時点で破棄されます。例えば、次のコードでは、関数 <code>greet()</code> の中で <code>$name</code> という変数が宣言されています。 ;[https://paiza.io/projects/AuCyhrEn4ZwlhuDULIll6Q?language=php ローカルスコープの例]:<syntaxhighlight lang=php copy> <?php function greet() { $name = "John"; echo "Hello, {$name}!"; } greet(); // "Hello, John!" と出力される echo $name; // PHP Warning: Undefined variable $name ?> </syntaxhighlight> :関数の外から <code>$name</code> 変数にアクセスすると、<code>Undefined variable</code> のエラーが発生します。 ==== グローバルスコープ ==== グローバルスコープは、関数の外で宣言された変数が含まれます。この変数は、プログラムの終了まで有効です。例えば、次のコードでは、<code>$name</code> という変数が関数の外で宣言されています。 ;[https://paiza.io/projects/JaPHlr93XWKOReDsUdO7Mg?language=php ローカルスコープの例]:<syntaxhighlight lang=php copy> <?php function greet() { static $count = 0; $count++; echo "Hello, this function has been called {$count} times!", PHP_EOL; } greet(); // "Hello, this function has been called 1 times!" と出力される greet(); // "Hello, this function has been called 2 times!" と出力される greet(); // "Hello, this function has been called 3 times!" と出力される ?> </syntaxhighlight> :<code>global</code> キーワードを使って、関数内でグローバル変数にアクセスすることができます。 ==== 静的スコープ ==== 静的スコープは、関数内で宣言された変数が含まれますが、その変数は関数の実行が終了しても破棄されず、次回の関数実行時にも値を保持します。例えば、次のコードでは、<code>greet()</code> 関数内で <code>$count</code> 変数が宣言されており、呼出し回数をカウントするために使われます。 ;[https://paiza.io/projects/HXMx_fuL3GvHBI4D_il4pw?language=php 静的スコープの例]:<syntaxhighlight lang=php copy> $name = "John"; function greet() { global $name; echo "Hello, {$name}!"; } greet(); // "Hello, John!" と出力される echo $name; // "John" と出力される </syntaxhighlight> :<code>static</code> キーワードを使って、静的変数を宣言することができます。<code>$count</code> 変数は、関数が終了しても破棄されず、次回の関数実行時にも値を保持します。 === スーパーグローバル変数 === PHPには、どこからでもアクセスできるスーパーグローバル変数がいくつかあります。これらは、関数やクラスのスコープを超えて、グローバルにアクセス可能な変数です。 :{| class=wikitable |+ スーパーグローバル変数 !変数名 !説明 |- !$GLOBALS |スクリプト全体で利用可能なグローバル変数の連想配列 |- !$_SERVER |サーバー情報(HTTPヘッダ、パス、スクリプトの位置など)の連想配列 |- !$_GET |URLパラメータで渡された値の連想配列 |- !$_POST |HTTP POSTメソッドで渡された値の連想配列 |- !$_FILES |HTTP POSTメソッドでアップロードされたファイルの連想配列 |- !$_COOKIE |クライアントから送信されたクッキーの連想配列 |- !$_SESSION |セッション変数の連想配列 |- !$_REQUEST |HTTP POST、HTTP GET、およびクッキーの値を含む連想配列 |- !$_ENV |環境変数の連想配列 |} これらの変数は、スクリプトのどこからでもアクセス可能で、グローバルなスコープを持ちます。 また、変数名の前に「$_」がつくのが特徴です。これは、変数名がスーパーグローバルであることを明示するための命名規則です。 === マジック定数 === PHPには、特定の状況下で自動的に設定されるマジック定数と呼ばれる定数があります。これらの定数は、スクリプトのどこからでもアクセスできます。 :{| class=wikitable |+ マジック定数 !マジック定数 !説明 |- ! __LINE__ |現在の行番号 |- ! __FILE__ |現在のファイル名(ファイルパスを含む) |- ! __DIR__ |現在のファイルのディレクトリ名 |- ! __FUNCTION__ |現在の関数名 |- ! __CLASS__ |現在のクラス名 |- ! __TRAIT__ |現在のトレイト名 |- ! __METHOD__ |現在のメソッド名(クラス名も含む) |- ! __NAMESPACE__ |現在の名前空間名 |} :これらのマジック定数は、プログラム実行中に自動的に設定され、その値を取得することができます。 :例えば、__LINE__は現在の行番号を表し、__FILE__は現在のファイル名を表します。 :また、__FUNCTION__は現在の関数名を表し、__CLASS__は現在のクラス名を表します。 :これらのマジック定数を使うことで、デバッグやログ出力などで便利に利用することができます。 === 高階関数 === 高階関数とは、引数として別の関数を受け取る関数のことを指します。一般的に、高階関数は、関数を引数として受け取り、その関数を実行することによって機能を拡張するために使用されます。PHPにおいても、高階関数が使用されることがあります。 以下に、PHPにおける高階関数の例を示します。 :<syntaxhighlight lang=php copy> <?php // map関数 function map($arr, $func) { $result = []; foreach ($arr as $elem) { $result[] = $func($elem); } return $result; } // 配列の要素を2倍にする関数 function double($x) { return $x * 2; } // 配列の各要素を2倍にする $arr = [1, 2, 3, 4]; $arr2 = map($arr, 'double'); // $arr2 = [2, 4, 6, 8] ?> </syntaxhighlight> : 上記の例では、<code>map</code>関数が高階関数として定義されています。この関数は、第1引数に配列、第2引数に関数を受け取り、配列の各要素に関数を適用した結果の配列を返します。<code>double</code>関数は、引数を2倍にする単純な関数で、<code>map</code>関数によって使用されています。 このように、高階関数は、汎用性が高く、再利用性の高いコードを実現するために有用です。 === 無名関数 === 無名関数とは、名前を持たずに関数の機能を持つPHPの関数のことです。通常の関数と同様に、引数を受け取り、何らかの処理を行い、戻り値を返すことができます。 無名関数は、コールバック関数やクロージャーとして使用されます。コールバック関数は、ある処理が完了したときに呼出される関数であり、クロージャーは、定義された環境内の変数にアクセスできる無名関数です。 以下は、無名関数の基本的な構文の例です。 :<syntaxhighlight lang=php copy> $func = function($arg1, $arg2) { // 無名関数の中身 }; </syntaxhighlight> 無名関数を使用する場合、変数に関数を代入することができます。また、関数の引数に渡したり、コールバック関数やクロージャーとして使用することもできます。 === コールバック関数 === PHPにおいて、コールバック関数とは、ある関数の引数として渡され、その関数内で呼び出される関数のことを指します。つまり、コールバック関数は、関数を引数として渡すことができる高度な機能であり、PHPの強力な機能の一つと言えます。 コールバック関数は、通常は無名関数を使って定義されますが、名前付き関数も渡すことができます。以下は、無名関数を使って、コールバック関数を定義する例です。 :<syntaxhighlight lang=php copy> <?php function executeCallback($callback) { if (is_callable($callback)) { $callback(); } else { echo "The callback is not callable."; } } executeCallback(function() { echo "This is a callback function."; }); ?> </syntaxhighlight> :上記の例では、<code>executeCallback</code>という関数を定義し、引数として渡された<code>$callback</code>がcallableであれば、その<code>$callback</code>を実行する処理が書かれています。 :そして、<code>executeCallback</code>を呼び出す際に、無名関数を渡しています。この無名関数がコールバック関数として使用されます。 コールバック関数を使うことで、汎用的な関数を作成することができます。また、PHPには、配列を操作するための便利なコールバック関数が多数用意されており、それらを利用することで、配列を簡単に操作することができます。例えば、<code>array_map</code>関数は、与えられた関数を、配列の各要素に適用し、新しい配列を返す関数です。以下は、<code>array_map</code>を使って、配列の各要素を二乗する例です。 ;[https://paiza.io/projects/AYkQIPL_0kvjS_EIbD3z3w?language=php 配列の各要素を二乗する例]:<syntaxhighlight lang=php copy> <?php $numbers = [1, 2, 3, 4, 5]; $squares = array_map(function($number) { return $number * $number; }, $numbers); print_r($squares); // [1, 4, 9, 16, 25] を出力 ?> </syntaxhighlight> :上記の例では、<code>array_map</code>関数を使って、配列<code>$numbers</code>の各要素を二乗した新しい配列<code>$squares</code>を作成しています。 :<code>array_map</code>関数の第一引数には、配列の各要素に適用する関数が、第二引数には、適用する配列が指定されています。 :この例では、第一引数として、無名関数を定義しています。この無名関数は、引数として与えられた数値を二乗した結果を返すように定義されています。: :<code>array_map</code>関数が呼び出されると、無名関数が、配列<code>$numbers</code>の各要素に対して === クロージャー === クロージャー (Closure) は、無名関数を格納するためのオブジェクトであり、関数を定義する時点で外部変数を捕捉し、その変数を関数の中で使うことができるようにします。 クロージャーは、外部変数が割り当てられた後に定義され、その変数にアクセスすることができます。クロージャーが定義されると、その変数はクロージャーによって保持され、クロージャーが解放されるまで維持されます。 以下は、PHPにおけるクロージャーの例です。 ;[https://paiza.io/projects/iYzGI4cjoL3-d4Tmhh7xGA?language=php クロージャーの例]:<syntaxhighlight lang=php copy> <?php function add($a) { return function ($b) use ($a) { return $a + $b; }; } $addFive = add(5); echo $addFive(3); // 8 ?> </syntaxhighlight> :この例では、<code>add()</code> 関数はクロージャーを返し、そのクロージャーは <code>$a</code> 変数を保持しています。 :<code>$addFive</code> 変数にクロージャーを割り当て、引数として <code>3</code> を渡すことで、<code>$a</code> の値が <code>5</code> であるため、<code>5 + 3</code> の結果である <code>8</code> が出力されます。 === 再帰的呼出し === 再帰的呼出しとは、ある関数が自分自身を呼出すことを指します。この呼出しは、同じ処理を何度も繰り返す必要がある場合や、複雑なアルゴリズムを実装する場合に便利です。 PHPでも、再帰的呼出しをすることができます。以下は、簡単な例として、1から与えられた数までの自然数の和を再帰的に計算する関数です。 ;[https://paiza.io/projects/9FQl6XI-65P8R1HUfMs1yQ?language=php 再帰的呼出しの例]:<syntaxhighlight lang=php copy> <?php function sum($n) { if ($n === 1) { return 1; } else { return $n + sum($n - 1); } } echo sum(5); // 15 ?> </syntaxhighlight> :このコードは、再帰的呼出しを使って、1から引数の数値までの整数の和を求める関数を定義しています。 :まず、関数 <code>sum</code> の引数 <code>$n</code> が1と等しい場合、1を返します。これは、再帰呼出しの終了条件となります。 :それ以外の場合、関数 <code>sum</code> は <code>$n</code> と <code>sum($n - 1)</code> を足した値を返します。<code>sum($n - 1)</code> は、引数 <code>$n - 1</code> を渡して自身を再帰的に呼出しており、これによって <code>$n</code> が1になるまで再帰的に呼出されます。 :最終的に <code>sum(1)</code> が呼出されると、終了条件によって1が返され、再帰呼出しは終了します。その後、すべての再帰呼出しが返した値が足し合わされ、1から引数の数値までの整数の和が求められます。 再帰的呼出しは、アルゴリズムが再帰的な場合には簡潔なコードにすることができますが、理解やデバッグの難易度を高めることがあるため、注意が必要です。 さらに、再帰的に呼出す関数の処理が大きくなりすぎると、スタックオーバーフローの原因になる場合があります。 また、適切な条件判定や終了処理の実装が必要です。 ---- === ジェネレーター関数 === PHPにおけるジェネレーター関数は、反復可能なオブジェクトを生成するための特殊な関数です。 ジェネレーター関数は、<code>yield</code>キーワードを使用して値を返し、内部の状態を保持します。 <code>yield</code>キーワードを使用すると、ジェネレーター関数の実行が一時停止され、呼出し元に値が返されます。 呼出し元は、ジェネレーター関数が再開されるときに、再びジェネレーター関数を呼出すことができます。 ;[https://paiza.io/projects/qQA7qDf386VLLzuUsbkEEg?language=php 例]:<syntaxhighlight lang=php line highlight=6 copy> <?php declare(strict_types=1); function gen_square() : iterable { for ($i = 0; $i < 10; $i++) { yield $i * $i; } } foreach (gen_square() as $value) { echo "$value\n"; } var_export(array(...gen_square())); </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text copy> 0 1 4 9 16 25 36 49 64 81 array ( 0 => 0, 1 => 1, 2 => 4, 3 => 9, 4 => 16, 5 => 25, 6 => 36, 7 => 49, 8 => 64, 9 => 81, ) </syntaxhighlight> :このコードは、ジェネレーター関数 <code>gen_square()</code> を定義しています。この関数は、0から9までの整数の2乗を生成し、それぞれ <code>yield</code> キーワードで返します。そして、<code>foreach</code>ループを使って <code>gen_square()</code> の戻り値を反復処理し、値を出力します。 :また、<code>array(...gen_square())</code> を使って、<code>gen_square()</code> の返すイテレータを配列に展開しています。この記法は PHP 7.4 から導入されたスプレッド演算子を使用しており、配列リテラル内で <code>...</code> を使用することで、配列を展開することができます。 :関数の戻り値型として、<code>iterable</code> を指定しています。これは、PHP 7.1 から導入された型で、反復処理可能なオブジェクトを表す型です。ジェネレーター関数は <code>iterable</code> を返すことができます。 ジェネレーターは配列に似ていますが、配列は要素数 × 要素1つあたりのサイズのメモリーフットプリントを消費します。それに対し、ジェネレーターは <code>yield</code> で返す値は都度計算できるため、メモリ消費が配列に比べて小さくなります。 == コードキャラリー == まとまった規模で、実用的な目的に叶うコードを読まないと機能の存在理由などの言語設計に思い至りにくいので、コードの断片から少し踏み込んだプログラムを掲載します。 === array_*関数の拡張 === PHPの組込み関数には、array_reduce(),array_map() のように array_ はじまる配列関数群があります。 これらは便利なのですが、配列とハッシュ兼用でJavaScriptやRubyなどから来ると面食らうことがあります。 また、配列の添字がcallback関数にわたらない仕様も移植のときに問題になります。 そこで、上記の問題をクリアした配列専用の関数群を作ってみました。 また、sum() は、カハンの加算アルゴリズムを使い誤差を最小にするようにしています。 ;[https://paiza.io/projects/PxiQBByxsovlo_AvfhwGog?language=php 実装]:<syntaxhighlight lang=php line copy> <?php // phpinfo(); declare(strict_types=1); function reduce(array $ary, callable $code, mixed $result = null): mixed { $i = 0; foreach ($ary as $el) { if ($i == 0 && !isset($result)) { $result = $el; } else { $result = $code($result, $el, $i); } $i++; } return $result; } echo 'reduce([1, 2, 3], fn($s, $x) => $s + $x) --> ', reduce([1, 2, 3], fn($s, $x) => $s + $x), PHP_EOL; echo 'reduce([1, 2, 3], fn($s, $x) => $s + $x, 10) --> ', reduce([1, 2, 3], fn($s, $x) => $s + $x, 10), PHP_EOL; echo 'reduce(["A", "B", "C"], fn($s, $x) => $s . $x) --> ', reduce(["A", "B", "C"], fn($s, $x) => $s . $x), PHP_EOL; echo 'reduce(["A", "B", "C"], fn($s, $x) => [ ...$s, "<$x>"], []) --> ', var_export(reduce(["A", "B", "C"], fn($s, $x) => [...$s , "<$x>"], []), true),PHP_EOL; echo PHP_EOL; function map(array $ary, callable $code): array { $result = []; $i = 0; foreach ($ary as $el) { $result[] = $code($el, $i++); } return $result; } $a1 = [2, 3, 5, 7, 11]; echo '$a1 = [2, 3, 5, 7, 11];', PHP_EOL; echo 'map($a1, fn($x) => $x * $x) --> ', var_export(map($a1, fn($x) => $x * $x), true), PHP_EOL; echo PHP_EOL; function each(array $ary, callable $code): void { $i = 0; foreach ($ary as $el) { $code($el, $i++); } } echo 'each($a1, fn($x, $i) => printf("%d[%d] ", $x, $i)); --> '; each($a1, fn($x, $i) => printf("%d[%d] ", $x, $i)); echo PHP_EOL; echo PHP_EOL; function filter(array $ary, callable $code): array { $result = []; $i = 0; foreach ($ary as $el) { if ($code($el, $i++)) { $result[] = $el; } } return $result; } echo 'filter($a1, fn($x) => $x % 2) --> ', var_export(filter($a1, fn($x) => $x % 2), true), PHP_EOL; echo 'filter($a1, fn($x) => $x < 6) --> ', var_export(filter($a1, fn($x) => $x < 6), true), PHP_EOL; echo PHP_EOL; function sum(array $ary): int|float|null { $sum = null; $i = 0; foreach ($ary as $delta) { if ($i == 0) { $sum = $delta; $c = $delta - $delta; } else { $y = $delta - $c; $t = $sum + $y; $c = ( $t - $sum ) - $y; $sum = $t; } $i++; } return $sum; } $nums = array_fill(0, 10, 0.1); echo '$nums = array_fill(0, 10, 0.1);', PHP_EOL; echo 'reduce($nums, fn($x, $y) => $x + $y) --> ', sprintf("%.53f", reduce($nums, fn($x, $y) => $x + $y)), PHP_EOL; echo 'array_sum($nums) --> ', sprintf("%.53f", array_sum($nums)), PHP_EOL; echo 'sum($nums) --> ', sprintf("%.53f", sum($nums)), PHP_EOL; echo 'sum(range(1, 100)) --> ', sprintf("%d", sum(range(1, 100))), PHP_EOL; echo 'sum([]) --> ',var_export(sum([]), true), PHP_EOL; echo PHP_EOL; function every(array $ary, callable $code): bool { $i = 0; foreach ($ary as $el) { if (!$code($el, $i++)) { return false; } } return true; } echo 'every($a1, fn($x) => $x != 1) --> ', var_export(every($a1, fn($x) => $x != 1), true), PHP_EOL; echo 'every($a1, fn($x) => $x == 2) --> ', var_export(every($a1, fn($x) => $x == 2), true), PHP_EOL; echo PHP_EOL; function some(array $ary, callable $code): bool { $i = 0; foreach ($ary as $el) { if ($code($el, $i++)) { return true; } } return false; } echo 'some($a1, fn($x) => $x != 1) --> ', var_export(some($a1, fn($x) => $x != 1), true), PHP_EOL; echo 'some($a1, fn($x) => $x == 2) --> ', var_export(some($a1, fn($x) => $x == 2), true), PHP_EOL; echo PHP_EOL; </syntaxhighlight> ;実行結果:<syntaxhighlight lang=text copy> reduce([1, 2, 3], fn($s, $x) => $s + $x) --> 6 reduce([1, 2, 3], fn($s, $x) => $s + $x, 10) --> 16 reduce(["A", "B", "C"], fn($s, $x) => $s . $x) --> ABC reduce(["A", "B", "C"], fn($s, $x) => [ ...$s, "<$x>"], []) --> array ( 0 => '<A>', 1 => '<B>', 2 => '<C>', ) $a1 = [2, 3, 5, 7, 11]; map($a1, fn($x) => $x * $x) --> array ( 0 => 4, 1 => 9, 2 => 25, 3 => 49, 4 => 121, ) each($a1, fn($x, $i) => printf("%d[%d] ", $x, $i)); --> 2[0] 3[1] 5[2] 7[3] 11[4] filter($a1, fn($x) => $x % 2) --> array ( 0 => 3, 1 => 5, 2 => 7, 3 => 11, ) filter($a1, fn($x) => $x < 6) --> array ( 0 => 2, 1 => 3, 2 => 5, ) $nums = array_fill(0, 10, 0.1); reduce($nums, fn($x, $y) => $x + $y) --> 0.99999999999999988897769753748434595763683319091796875 array_sum($nums) --> 0.99999999999999988897769753748434595763683319091796875 sum($nums) --> 1.00000000000000000000000000000000000000000000000000000 sum(range(1, 100)) --> 5050 sum([]) --> NULL every($a1, fn($x) => $x != 1) --> true every($a1, fn($x) => $x == 2) --> false some($a1, fn($x) => $x != 1) --> true some($a1, fn($x) => $x == 2) --> true </syntaxhighlight> :このコードは、PHPでArrayメソッドを実装したものです。主に、reduce、map、each、filter、sum、every関数を定義しています。 :reduce関数は、配列の要素を走査して、コールバック関数を適用し、最終的な単一の値を返します。また、第3引数に初期値を渡すこともできます。 :map関数は、配列の各要素に対してコールバック関数を適用し、新しい配列を作成して返します。 :each関数は、配列の各要素に対してコールバック関数を適用します。ただし、戻り値はありません。 :filter関数は、配列の要素を走査し、コールバック関数がtrueを返す要素を含む新しい配列を作成して返します。 :sum関数は、数値配列の合計値を返します。2つの浮動小数点数を正確に加算するために、内部で処理を行っています。 ::アルゴリズムは、Kahanの加算アルゴリズムと呼ばれる方法を使っています。このアルゴリズムは、浮動小数点数の加算において、誤差を最小限に抑えるために考案されました。 ::具体的には、各要素を順番に加算する際に、現在の誤差を考慮して加算を行い、その誤差を記憶しておきます。次に、次の要素を加算する前に、前回の誤差を引いてから加算を行います。 ::これにより、浮動小数点数の誤差を効果的に抑えることができます。 ::この関数では、変数 <code>$sum</code> に合計値を、変数 <code>$c</code> に現在の誤差を保持し、各要素を順番に加算していくことで、正確な合計値を得ています。 :every関数は、配列の各要素に対してコールバック関数を適用し、すべての要素がtrueを返した場合にtrueを返します。それ以外の場合は、falseを返します。 == 附録 == === チートシート === :<syntaxhighlight lang=php line copy> <?php // 関数定義 function 関数名 (引数1, 引数2, ...) { 処理; return 戻り値; } // 関数呼び出し $result = 関数名(引数1, 引数2, ...); // 引数のデフォルト値 function 関数名 (引数1 = 値1, 引数2 = 値2, ...) { 処理; } // 可変長引数 function 関数名 (...$args) { 処理; } // クロージャ $closure = function (引数1, 引数2, ...) { 処理; return 戻り値; }; // 無名関数の即時実行 $result = (function (引数1, 引数2, ...) { 処理; return 戻り値; })(値1, 値2, ...); // 再帰的呼び出し function 関数名 (引数) { if (条件) { return 値; } else { return 関数名(引数を更新); } } // スーパーグローバル変数 $GLOBALS $_SERVER $_GET $_POST $_FILES $_COOKIE $_SESSION $_REQUEST $_ENV // マジック定数 __LINE__ __FILE__ __DIR__ __FUNCTION__ __CLASS__ __TRAIT__ __METHOD__ __NAMESPACE__ // 名前空間 namespace 名前空間名; use 名前空間名\クラス名; クラス名::メソッド名(引数); </syntaxhighlight> 以上がPHPの関数に関するチートシートです。 === 用語集 === * 関数 (function) : 名前を持ったプログラムの断片で、一連の処理をまとめて、その名前で呼び出すことができる。プログラムの構造化と再利用性を高める。 * 引数 (argument) : 関数に渡される値のこと。関数定義で宣言された引数と同じ数だけ渡す必要がある。 * 戻り値 (return value) : 関数から呼び出し元に返される値のこと。return文で指定された式の値が返り値として扱われる。 * 可変長引数 (variable-length argument) : 引数の数が可変長であることを示す機能。可変長引数を受け取る関数は、引数名の前に「...」を付ける。 * 引数のデフォルト値 (default value of argument) : 引数にデフォルト値を設定することができる。呼び出し時に引数が指定されなかった場合に、デフォルト値が使われる。 * キーワード引数 (keyword argument) : 引数を名前で指定する機能。引数名と値を「引数名 => 値」という形式で渡す。 * 型宣言 (type declaration) : 引数や戻り値の型を宣言することができる。PHP 7からサポートされた機能。 * スコープ (scope) : 変数が定義されている有効範囲のこと。スコープによって変数のアクセス可能範囲が決まる。 * ローカルスコープ (local scope) : 関数内で定義された変数の有効範囲のこと。関数の外からはアクセスできない。 * グローバルスコープ (global scope) : 関数の外で定義された変数の有効範囲のこと。どこからでもアクセスできる。 * 静的スコープ (static scope) : 関数内で定義された静的変数の有効範囲のこと。関数の呼び出し回数に依存せず、値が保持される。 * スーパーグローバル変数 (superglobal variable) : スクリプトのどこからでもアクセスできる特別な変数。$GLOBALS、$_SERVER、$_GET、$_POST、$_FILES、$_COOKIE、$_SESSION、$_REQUEST、$_ENVがある。 * 無名関数 (anonymous function): 名前を持たない関数のこと。変数に代入して使用することができる。 * クロージャ (closure): 関数が変数に代入された場合、その関数はそのまま変数として使用することができ、その変数を引数に取る関数のこと。 * 再帰的呼び出し (recursive call): 関数が自身を呼び出すこと。 * ジェネレーター関数 (generator function): 実行を一時停止し、値を返すことができる関数。 <noinclude> {{Nav}} {{DEFAULTSORT:かんすうとは}} [[Category:PHP]] </noinclude> m5ti60ouuxhgsbjq2a2z2jwevnhj3sq 高等学校歴史総合 0 21706 264156 264107 2024-11-25T03:23:41Z Kwawe 68789 /* 第一次世界大戦と国際社会 */ 264156 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>高等学校歴史総合 {{進捗状況}} 「'''歴史総合'''」は標準単位数2単位で'''必修科目'''です。 === 注意事項 === # 目次の項目、本文内容ともに[https://www.shimizushoin.co.jp/info_kyo/rekishisougou/index.html 清水書院『私たちの歴史総合』]【歴総705】に合わせています。 # なお、古代と中世に関しては、当科目では扱っていないので、[[高等学校世界史探究|世界史探究]]と[[高等学校日本史探究|日本史探究]]の学習内容を見てください。 == 第1編 歴史の扉 == === 第1章 歴史と私たち === * [[高等学校歴史総合/日本とスポーツの歴史|日本とスポーツの歴史]]{{進捗|100%|2024-11-22}}(スポーツ史) === 第2章 歴史の特質と資料 === * 8月15日とそれぞれの「終戦」{{進捗|00%|2022-12-18}}(玉音放送) == 第2編 近代化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 結びつく世界と日本 === ==== 18世紀までの世界 ==== * [[高等学校歴史総合/近世の日本と世界|近世の日本と世界]]{{進捗|100%|2024-11-23}}(日本の「鎖国」と東アジアの交易、近世東アジアの国際秩序) * 18世紀の中国とアジア貿易{{進捗|00%|2023-02-12}}(清の繁栄、清と近隣諸国とのつながり) * 18世紀のイギリス・アジア・アフリカ{{進捗|00%|2023-02-12}}(ヨーロッパの世界進出と大西洋三角貿易、世界経済の覇権を握ったイギリス) * もっと知りたい 海を渡った日本産陶磁器{{進捗|00%|2023-12-24}}(陶磁器の歴史) * もっと知りたい 琉球と蝦夷地{{進捗|00%|2022-12-25}}(琉球王国、蝦夷地) ==== 工業化と世界市場の形成 ==== * 産業革命による経済発展と社会の変化{{進捗|00%|2022-11-25}}(産業革命、資本主義社会) * 世界市場の形成とイギリスによるアジア進出{{進捗|00%|2023-02-25}}(イギリスによる世界市場の形成、イギリスのアジア進出 ) * 日本の開国とその影響{{進捗|00%|2022-11-21}}(日本の開国・開港、交通革命の進展と東アジア) * 歴史のなかの16歳 工女と工場法{{進捗|00%|2022-12-25}}(工場法など) * [[高等学校歴史総合/もっと知りたい 産業革命とブラスバンド|もっと知りたい 産業革命とブラスバンド]]{{進捗|100%|2024-11-23}}(金管楽器の歴史) === 第3章 国民国家と明治維新 === ==== 国民国家と立憲体制 ==== * 二つの市民革命と近代民主主義社会の成立{{進捗|00%|2022-11-22}}(アメリカ独立革命、フランス革命、ナポレオン) * 国民統合とナショナリズム{{進捗|00%|2022-11-23}}(19世紀前半のヨーロッパ諸国、ドイツ統一、南北戦争など) * 明治維新期の日本と世界{{進捗|100%|2023-02-19}}(明治新政府の成立、近代化と東アジア) * 近代国家への移行と憲法の制定{{進捗|00%|2022-11-24}}(大日本帝国憲法、条約改正の実現) * もっと知りたい 国境の過去・現在・未来{{進捗|00%|2022-12-26}}(近代国家と領土画定など) * もっと知りたい 女王と天皇 理想の家族{{進捗|00%|2022-02-12}}(近代の天皇史) ==== 帝国主義とアジア・アフリカの変容 ==== * 列強による帝国主義{{進捗|00%|2023-02-17}}(第2次産業革命と帝国主義、欧米諸国の帝国主義政策) * 帝国主義がアジア・アフリカにもたらしたもの{{進捗|00%|2023-02-18}}(列強のアフリカ分割、西アジア諸国の改革など) * 日清戦争とその影響{{進捗|00%|2023-02-15}}(日清戦争、東アジアの構造変動) * 日露戦争{{進捗|00%|2022-11-22}}(義和団事件、日露戦争、朝鮮の植民地化、辛亥革命) * もっと知りたい 近代の博覧会{{進捗|00%|2022-12-24}}(万国博覧会の歴史) * [[高等学校歴史総合/もっと知りたい ペストと感染症|もっと知りたい ペストと感染症]]{{進捗|75%|2024-11-24}}(近代におけるペストの流行ほか) === 第4章 近代化と現代的な諸課題 === * 鉄道建設{{進捗|00%|2023-03-02}} == 第3編 国際秩序の変化や大衆化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 第一次世界大戦と大衆社会 === ==== 第一次世界大戦と国際社会 ==== * [[高等学校歴史総合/第一次世界大戦|第一次世界大戦]]{{進捗|50%|2024-11-25}}(第一次世界大戦) * [[高等学校歴史総合/社会主義革命|社会主義革命]]{{進捗|00%|2022-12-30}}(ロシア革命、コミンテルン、ソビエト社会主義共和国連邦) * [[高等学校歴史総合/国際協調体制|国際協調体制]]{{進捗|100%|2024-11-23}}(ヴェルサイユ体制とワシントン体制、国際協調の高まり) * アジアの民族運動{{進捗|00%|2023-01-27}}(アジアの経済成長、東アジアの民族運動、インド・東南アジア・西アジアの民族運動) * もっと知りたい ユダヤ人のパレスチナ移住とパレスチナ分割{{進捗|00%|2022-12-30}}(パレスチナの歴史、シオニズム運動) * もっと知りたい 浅川巧 朝鮮の人々とともに生きた日本人{{進捗|00%|2022-12-30}}(浅川兄弟) ==== 1920年代の世界と大衆の時代の到来 ==== * 大衆の政治参加{{進捗|00%|2023-01-08}}(世界史上の民衆運動、大正デモクラシーと大衆の政治参加) * 女性の社会参加{{進捗|00%|2023-02-23}}(女性の社会進出、日本の大正期の女性) * [[高等学校歴史総合/大衆社会の形成|大衆社会の形成]]{{進捗|00%|2023-02-12}}(大衆社会の出現、1920年代のアメリカ、日本の大衆社会) * もっと知りたい 映画と「大衆化」{{進捗|00%|2022-12-28}}(映画の歴史) * もっと知りたい オリンピックの歩み{{進捗|00%|2022-12-28}}(オリンピックの歴史) === 第3章 経済危機と第二次世界大戦 === ==== 国際協調の挫折と2度目の世界大戦 ==== * 世界恐慌{{進捗|00%|2022-11-24}}(昭和恐慌、ブロック経済圏) * ファシズムの台頭{{進捗|00%|2022-12-31}}(ファシズム、ナチ党の政権掌握) * 日本の大陸進出{{進捗|00%|2022-12-08}}(満州事変、日中戦争) * 第二次世界大戦{{進捗|00%|2022-11-16}}(ドイツの拡大、第二次世界大戦、大量殺戮と民衆の抵抗) * もっと知りたい リンゲルブルム・アーカイヴと『アンネの日記』{{進捗|00%|2022-12-25}}(アンネ・フランク) * 歴史のなかの16歳 満蒙開拓青少年義勇軍{{進捗|100%|2022-11-21}}(満州農業移民、満蒙開拓青少年義勇軍、「鍬の戦士」) ==== 世界大戦がもたらしたもの ==== * アジア太平洋戦争{{進捗|100%|2023-01-29}}(日米交渉の挫折と開戦、日本のアジア支配、戦争の被害と加害) * 戦争が変えた人々のくらし{{進捗|00%|2023-02-19}}(マス・メディアの普及と情報や生活の画一化、国民の組織化と戦時動員ほか) * 戦後世界の新たな枠組み{{進捗|00%|2023-01-29}}(戦後構想と大戦の終結、冷戦の開始とドイツの分断、国際連合の成立) * 敗戦後の日本とアジア{{進捗|00%|2023-02-19}}(日本の戦後改革、大衆は敗戦をどう生きたか、冷戦と日本の独立) * 冷戦下の東アジア{{進捗|00%|2023-02-19}}(戦後の中国、朝鮮半島の南北分断、現代の朝鮮半島と台湾) * もっと知りたい 戦争を「記憶」するということ{{進捗|00%|2022-12-24}}(明日の神話ほか) * もっと知りたい 核と原子力エネルギー{{進捗|00%|2023-02-09}}(原子力の平和利用、原子力エネルギーの普及と課題) === 第4章 国際秩序の変化や大衆化と現代的な諸課題 === * ナショナリズム{{進捗|00%|2022-03-08}}[発展講義] == 第4編 グローバル化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 冷戦と世界経済 === ==== 冷戦と国際政治 ==== * 脱植民地化とアジア・アフリカ諸国{{進捗|00%|2023-01-25}}(アジア・アフリカ諸国の独立、第三世界の形成と連帯) * 冷戦下の地域紛争{{進捗|00%|2023-01-26}}(ベトナム戦争、中東戦争) * 先進国の政治と社会運動{{進捗|00%|2023-01-29}}(西側諸国と福祉国家政策、国境をこえる社会運動) * 核兵器の脅威と核軍縮{{進捗|00%|2023-01-29}}(核拡散と核兵器反対運動、核軍縮の取り組みと課題) ==== 世界経済の拡大と日本 ==== * 西ヨーロッパ・東南アジアの地域連携{{進捗|00%|2022-12-31}}(西ヨーロッパ統合への動き、東南アジア諸国の動き) * 戦後の日本とアジア諸国との関係{{進捗|00%|2023-01-01}}(日本の国連加盟、アジア諸国との国交回復、沖縄の本土復帰) * 高度経済成長{{進捗|00%|2023-01-01}}(日本と西ドイツの経済成長、高度経済成長と人々の生活、成長のもたらした課題) * もっと知りたい グローバリゼーションとストリートダンス{{進捗|00%|2022-12-27}}(ダンスの歴史) * 歴史のなかの16歳 集団就職 「金の卵」たちの時代{{進捗|00%|2023-02-09}}(集団就職列車など) === 第3章 世界秩序の変容と日本 === ==== 市場経済の変容と冷戦の終結 ==== * 石油危機と価値観の転換{{進捗|00%|2023-02-09}}(戦後経済の転換、石油危機と日本、価値観の転換) * アジアの成長{{進捗|00%|2023-02-13}}(アジア諸国の成長、第三世界の多様化、日本の経済大国化) * 冷戦の終結{{進捗|00%|2023-02-12}}(社会主義世界の変容、冷戦の終結とソ連の崩壊、冷戦後の地域紛争と日本) ==== 冷戦終結後の世界 ==== * 民主化の進展と冷戦終結後の日本{{進捗|00%|2022-12-31}}(民主化の進展と課題、日本の政治の展開) * 市場開放と経済の自由化{{進捗|00%|2022-12-31}}(新自由主義の台頭、経済のグローバル化と新たな国際経済組織) * 地域統合の進展と課題{{進捗|00%|2022-12-31}}(地域統合の拡大、地域統合の課題) * 情報通信技術の発達{{進捗|00%|2022-12-30}}(情報通信技術の発達と社会の変化、情報化社会とその課題) * 冷戦終結後の紛争と平和への取り組み{{進捗|100%|2023-01-01}}(冷戦終結後の紛争、紛争の解決と国際社会の役割) * もっと知りたい 災害と私たち{{進捗|00%|2022-11-21}}(阪神淡路大震災、東日本大震災) * もっと知りたい 中東の少数派クルド人{{進捗|00%|2022-12-27}}(国民国家の中の少数派、クルド人問題の展開) === 第4章 現代的な諸課題の形成と展望 === * 移民{{進捗|00%|2023-02-22}}(近代の移民史) == 近現代史関連用語解説・参考 == * 近現代史関連用語解説{{進捗|00%|2023-02-22}} * 途上国から見た国際関係理論{{進捗|00%|2023-03-05}}[発展講義(イマニュエル・ウォーラースティンなど)] [[カテゴリ:歴史|こうとうかつこうれきしそうこう]] [[カテゴリ:高等学校歴史総合|*]] 8bf3iosxitaxstukt36dltb3ero4dvt 264159 264156 2024-11-25T03:27:05Z Kwawe 68789 /* 冷戦終結後の世界 */ 264159 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>高等学校歴史総合 {{進捗状況}} 「'''歴史総合'''」は標準単位数2単位で'''必修科目'''です。 === 注意事項 === # 目次の項目、本文内容ともに[https://www.shimizushoin.co.jp/info_kyo/rekishisougou/index.html 清水書院『私たちの歴史総合』]【歴総705】に合わせています。 # なお、古代と中世に関しては、当科目では扱っていないので、[[高等学校世界史探究|世界史探究]]と[[高等学校日本史探究|日本史探究]]の学習内容を見てください。 == 第1編 歴史の扉 == === 第1章 歴史と私たち === * [[高等学校歴史総合/日本とスポーツの歴史|日本とスポーツの歴史]]{{進捗|100%|2024-11-22}}(スポーツ史) === 第2章 歴史の特質と資料 === * 8月15日とそれぞれの「終戦」{{進捗|00%|2022-12-18}}(玉音放送) == 第2編 近代化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 結びつく世界と日本 === ==== 18世紀までの世界 ==== * [[高等学校歴史総合/近世の日本と世界|近世の日本と世界]]{{進捗|100%|2024-11-23}}(日本の「鎖国」と東アジアの交易、近世東アジアの国際秩序) * 18世紀の中国とアジア貿易{{進捗|00%|2023-02-12}}(清の繁栄、清と近隣諸国とのつながり) * 18世紀のイギリス・アジア・アフリカ{{進捗|00%|2023-02-12}}(ヨーロッパの世界進出と大西洋三角貿易、世界経済の覇権を握ったイギリス) * もっと知りたい 海を渡った日本産陶磁器{{進捗|00%|2023-12-24}}(陶磁器の歴史) * もっと知りたい 琉球と蝦夷地{{進捗|00%|2022-12-25}}(琉球王国、蝦夷地) ==== 工業化と世界市場の形成 ==== * 産業革命による経済発展と社会の変化{{進捗|00%|2022-11-25}}(産業革命、資本主義社会) * 世界市場の形成とイギリスによるアジア進出{{進捗|00%|2023-02-25}}(イギリスによる世界市場の形成、イギリスのアジア進出 ) * 日本の開国とその影響{{進捗|00%|2022-11-21}}(日本の開国・開港、交通革命の進展と東アジア) * 歴史のなかの16歳 工女と工場法{{進捗|00%|2022-12-25}}(工場法など) * [[高等学校歴史総合/もっと知りたい 産業革命とブラスバンド|もっと知りたい 産業革命とブラスバンド]]{{進捗|100%|2024-11-23}}(金管楽器の歴史) === 第3章 国民国家と明治維新 === ==== 国民国家と立憲体制 ==== * 二つの市民革命と近代民主主義社会の成立{{進捗|00%|2022-11-22}}(アメリカ独立革命、フランス革命、ナポレオン) * 国民統合とナショナリズム{{進捗|00%|2022-11-23}}(19世紀前半のヨーロッパ諸国、ドイツ統一、南北戦争など) * 明治維新期の日本と世界{{進捗|100%|2023-02-19}}(明治新政府の成立、近代化と東アジア) * 近代国家への移行と憲法の制定{{進捗|00%|2022-11-24}}(大日本帝国憲法、条約改正の実現) * もっと知りたい 国境の過去・現在・未来{{進捗|00%|2022-12-26}}(近代国家と領土画定など) * もっと知りたい 女王と天皇 理想の家族{{進捗|00%|2022-02-12}}(近代の天皇史) ==== 帝国主義とアジア・アフリカの変容 ==== * 列強による帝国主義{{進捗|00%|2023-02-17}}(第2次産業革命と帝国主義、欧米諸国の帝国主義政策) * 帝国主義がアジア・アフリカにもたらしたもの{{進捗|00%|2023-02-18}}(列強のアフリカ分割、西アジア諸国の改革など) * 日清戦争とその影響{{進捗|00%|2023-02-15}}(日清戦争、東アジアの構造変動) * 日露戦争{{進捗|00%|2022-11-22}}(義和団事件、日露戦争、朝鮮の植民地化、辛亥革命) * もっと知りたい 近代の博覧会{{進捗|00%|2022-12-24}}(万国博覧会の歴史) * [[高等学校歴史総合/もっと知りたい ペストと感染症|もっと知りたい ペストと感染症]]{{進捗|75%|2024-11-24}}(近代におけるペストの流行ほか) === 第4章 近代化と現代的な諸課題 === * 鉄道建設{{進捗|00%|2023-03-02}} == 第3編 国際秩序の変化や大衆化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 第一次世界大戦と大衆社会 === ==== 第一次世界大戦と国際社会 ==== * [[高等学校歴史総合/第一次世界大戦|第一次世界大戦]]{{進捗|50%|2024-11-25}}(第一次世界大戦) * [[高等学校歴史総合/社会主義革命|社会主義革命]]{{進捗|00%|2022-12-30}}(ロシア革命、コミンテルン、ソビエト社会主義共和国連邦) * [[高等学校歴史総合/国際協調体制|国際協調体制]]{{進捗|100%|2024-11-23}}(ヴェルサイユ体制とワシントン体制、国際協調の高まり) * アジアの民族運動{{進捗|00%|2023-01-27}}(アジアの経済成長、東アジアの民族運動、インド・東南アジア・西アジアの民族運動) * もっと知りたい ユダヤ人のパレスチナ移住とパレスチナ分割{{進捗|00%|2022-12-30}}(パレスチナの歴史、シオニズム運動) * もっと知りたい 浅川巧 朝鮮の人々とともに生きた日本人{{進捗|00%|2022-12-30}}(浅川兄弟) ==== 1920年代の世界と大衆の時代の到来 ==== * 大衆の政治参加{{進捗|00%|2023-01-08}}(世界史上の民衆運動、大正デモクラシーと大衆の政治参加) * 女性の社会参加{{進捗|00%|2023-02-23}}(女性の社会進出、日本の大正期の女性) * [[高等学校歴史総合/大衆社会の形成|大衆社会の形成]]{{進捗|00%|2023-02-12}}(大衆社会の出現、1920年代のアメリカ、日本の大衆社会) * もっと知りたい 映画と「大衆化」{{進捗|00%|2022-12-28}}(映画の歴史) * もっと知りたい オリンピックの歩み{{進捗|00%|2022-12-28}}(オリンピックの歴史) === 第3章 経済危機と第二次世界大戦 === ==== 国際協調の挫折と2度目の世界大戦 ==== * 世界恐慌{{進捗|00%|2022-11-24}}(昭和恐慌、ブロック経済圏) * ファシズムの台頭{{進捗|00%|2022-12-31}}(ファシズム、ナチ党の政権掌握) * 日本の大陸進出{{進捗|00%|2022-12-08}}(満州事変、日中戦争) * 第二次世界大戦{{進捗|00%|2022-11-16}}(ドイツの拡大、第二次世界大戦、大量殺戮と民衆の抵抗) * もっと知りたい リンゲルブルム・アーカイヴと『アンネの日記』{{進捗|00%|2022-12-25}}(アンネ・フランク) * 歴史のなかの16歳 満蒙開拓青少年義勇軍{{進捗|100%|2022-11-21}}(満州農業移民、満蒙開拓青少年義勇軍、「鍬の戦士」) ==== 世界大戦がもたらしたもの ==== * アジア太平洋戦争{{進捗|100%|2023-01-29}}(日米交渉の挫折と開戦、日本のアジア支配、戦争の被害と加害) * 戦争が変えた人々のくらし{{進捗|00%|2023-02-19}}(マス・メディアの普及と情報や生活の画一化、国民の組織化と戦時動員ほか) * 戦後世界の新たな枠組み{{進捗|00%|2023-01-29}}(戦後構想と大戦の終結、冷戦の開始とドイツの分断、国際連合の成立) * 敗戦後の日本とアジア{{進捗|00%|2023-02-19}}(日本の戦後改革、大衆は敗戦をどう生きたか、冷戦と日本の独立) * 冷戦下の東アジア{{進捗|00%|2023-02-19}}(戦後の中国、朝鮮半島の南北分断、現代の朝鮮半島と台湾) * もっと知りたい 戦争を「記憶」するということ{{進捗|00%|2022-12-24}}(明日の神話ほか) * もっと知りたい 核と原子力エネルギー{{進捗|00%|2023-02-09}}(原子力の平和利用、原子力エネルギーの普及と課題) === 第4章 国際秩序の変化や大衆化と現代的な諸課題 === * ナショナリズム{{進捗|00%|2022-03-08}}[発展講義] == 第4編 グローバル化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 冷戦と世界経済 === ==== 冷戦と国際政治 ==== * 脱植民地化とアジア・アフリカ諸国{{進捗|00%|2023-01-25}}(アジア・アフリカ諸国の独立、第三世界の形成と連帯) * 冷戦下の地域紛争{{進捗|00%|2023-01-26}}(ベトナム戦争、中東戦争) * 先進国の政治と社会運動{{進捗|00%|2023-01-29}}(西側諸国と福祉国家政策、国境をこえる社会運動) * 核兵器の脅威と核軍縮{{進捗|00%|2023-01-29}}(核拡散と核兵器反対運動、核軍縮の取り組みと課題) ==== 世界経済の拡大と日本 ==== * 西ヨーロッパ・東南アジアの地域連携{{進捗|00%|2022-12-31}}(西ヨーロッパ統合への動き、東南アジア諸国の動き) * 戦後の日本とアジア諸国との関係{{進捗|00%|2023-01-01}}(日本の国連加盟、アジア諸国との国交回復、沖縄の本土復帰) * 高度経済成長{{進捗|00%|2023-01-01}}(日本と西ドイツの経済成長、高度経済成長と人々の生活、成長のもたらした課題) * もっと知りたい グローバリゼーションとストリートダンス{{進捗|00%|2022-12-27}}(ダンスの歴史) * 歴史のなかの16歳 集団就職 「金の卵」たちの時代{{進捗|00%|2023-02-09}}(集団就職列車など) === 第3章 世界秩序の変容と日本 === ==== 市場経済の変容と冷戦の終結 ==== * 石油危機と価値観の転換{{進捗|00%|2023-02-09}}(戦後経済の転換、石油危機と日本、価値観の転換) * アジアの成長{{進捗|00%|2023-02-13}}(アジア諸国の成長、第三世界の多様化、日本の経済大国化) * 冷戦の終結{{進捗|00%|2023-02-12}}(社会主義世界の変容、冷戦の終結とソ連の崩壊、冷戦後の地域紛争と日本) ==== 冷戦終結後の世界 ==== * 民主化の進展と冷戦終結後の日本{{進捗|00%|2022-12-31}}(民主化の進展と課題、日本の政治の展開) * [[高等学校歴史総合/市場開放と経済の自由化|市場開放と経済の自由化]]{{進捗|00%|2022-12-31}}(新自由主義の台頭、経済のグローバル化と新たな国際経済組織) * 地域統合の進展と課題{{進捗|00%|2022-12-31}}(地域統合の拡大、地域統合の課題) * [[高等学校歴史総合/情報通信技術の発達|情報通信技術の発達]]{{進捗|00%|2022-12-30}}(情報通信技術の発達と社会の変化、情報化社会とその課題) * 冷戦終結後の紛争と平和への取り組み{{進捗|100%|2023-01-01}}(冷戦終結後の紛争、紛争の解決と国際社会の役割) * もっと知りたい 災害と私たち{{進捗|00%|2022-11-21}}(阪神淡路大震災、東日本大震災) * もっと知りたい 中東の少数派クルド人{{進捗|00%|2022-12-27}}(国民国家の中の少数派、クルド人問題の展開) === 第4章 現代的な諸課題の形成と展望 === * 移民{{進捗|00%|2023-02-22}}(近代の移民史) == 近現代史関連用語解説・参考 == * 近現代史関連用語解説{{進捗|00%|2023-02-22}} * 途上国から見た国際関係理論{{進捗|00%|2023-03-05}}[発展講義(イマニュエル・ウォーラースティンなど)] [[カテゴリ:歴史|こうとうかつこうれきしそうこう]] [[カテゴリ:高等学校歴史総合|*]] qjuzjhxwjfoqpn2zyvzkpnj13hfk8or 264162 264159 2024-11-25T03:29:17Z Kwawe 68789 /* 冷戦終結後の世界 */ 264162 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>高等学校歴史総合 {{進捗状況}} 「'''歴史総合'''」は標準単位数2単位で'''必修科目'''です。 === 注意事項 === # 目次の項目、本文内容ともに[https://www.shimizushoin.co.jp/info_kyo/rekishisougou/index.html 清水書院『私たちの歴史総合』]【歴総705】に合わせています。 # なお、古代と中世に関しては、当科目では扱っていないので、[[高等学校世界史探究|世界史探究]]と[[高等学校日本史探究|日本史探究]]の学習内容を見てください。 == 第1編 歴史の扉 == === 第1章 歴史と私たち === * [[高等学校歴史総合/日本とスポーツの歴史|日本とスポーツの歴史]]{{進捗|100%|2024-11-22}}(スポーツ史) === 第2章 歴史の特質と資料 === * 8月15日とそれぞれの「終戦」{{進捗|00%|2022-12-18}}(玉音放送) == 第2編 近代化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 結びつく世界と日本 === ==== 18世紀までの世界 ==== * [[高等学校歴史総合/近世の日本と世界|近世の日本と世界]]{{進捗|100%|2024-11-23}}(日本の「鎖国」と東アジアの交易、近世東アジアの国際秩序) * 18世紀の中国とアジア貿易{{進捗|00%|2023-02-12}}(清の繁栄、清と近隣諸国とのつながり) * 18世紀のイギリス・アジア・アフリカ{{進捗|00%|2023-02-12}}(ヨーロッパの世界進出と大西洋三角貿易、世界経済の覇権を握ったイギリス) * もっと知りたい 海を渡った日本産陶磁器{{進捗|00%|2023-12-24}}(陶磁器の歴史) * もっと知りたい 琉球と蝦夷地{{進捗|00%|2022-12-25}}(琉球王国、蝦夷地) ==== 工業化と世界市場の形成 ==== * 産業革命による経済発展と社会の変化{{進捗|00%|2022-11-25}}(産業革命、資本主義社会) * 世界市場の形成とイギリスによるアジア進出{{進捗|00%|2023-02-25}}(イギリスによる世界市場の形成、イギリスのアジア進出 ) * 日本の開国とその影響{{進捗|00%|2022-11-21}}(日本の開国・開港、交通革命の進展と東アジア) * 歴史のなかの16歳 工女と工場法{{進捗|00%|2022-12-25}}(工場法など) * [[高等学校歴史総合/もっと知りたい 産業革命とブラスバンド|もっと知りたい 産業革命とブラスバンド]]{{進捗|100%|2024-11-23}}(金管楽器の歴史) === 第3章 国民国家と明治維新 === ==== 国民国家と立憲体制 ==== * 二つの市民革命と近代民主主義社会の成立{{進捗|00%|2022-11-22}}(アメリカ独立革命、フランス革命、ナポレオン) * 国民統合とナショナリズム{{進捗|00%|2022-11-23}}(19世紀前半のヨーロッパ諸国、ドイツ統一、南北戦争など) * 明治維新期の日本と世界{{進捗|100%|2023-02-19}}(明治新政府の成立、近代化と東アジア) * 近代国家への移行と憲法の制定{{進捗|00%|2022-11-24}}(大日本帝国憲法、条約改正の実現) * もっと知りたい 国境の過去・現在・未来{{進捗|00%|2022-12-26}}(近代国家と領土画定など) * もっと知りたい 女王と天皇 理想の家族{{進捗|00%|2022-02-12}}(近代の天皇史) ==== 帝国主義とアジア・アフリカの変容 ==== * 列強による帝国主義{{進捗|00%|2023-02-17}}(第2次産業革命と帝国主義、欧米諸国の帝国主義政策) * 帝国主義がアジア・アフリカにもたらしたもの{{進捗|00%|2023-02-18}}(列強のアフリカ分割、西アジア諸国の改革など) * 日清戦争とその影響{{進捗|00%|2023-02-15}}(日清戦争、東アジアの構造変動) * 日露戦争{{進捗|00%|2022-11-22}}(義和団事件、日露戦争、朝鮮の植民地化、辛亥革命) * もっと知りたい 近代の博覧会{{進捗|00%|2022-12-24}}(万国博覧会の歴史) * [[高等学校歴史総合/もっと知りたい ペストと感染症|もっと知りたい ペストと感染症]]{{進捗|75%|2024-11-24}}(近代におけるペストの流行ほか) === 第4章 近代化と現代的な諸課題 === * 鉄道建設{{進捗|00%|2023-03-02}} == 第3編 国際秩序の変化や大衆化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 第一次世界大戦と大衆社会 === ==== 第一次世界大戦と国際社会 ==== * [[高等学校歴史総合/第一次世界大戦|第一次世界大戦]]{{進捗|50%|2024-11-25}}(第一次世界大戦) * [[高等学校歴史総合/社会主義革命|社会主義革命]]{{進捗|00%|2022-12-30}}(ロシア革命、コミンテルン、ソビエト社会主義共和国連邦) * [[高等学校歴史総合/国際協調体制|国際協調体制]]{{進捗|100%|2024-11-23}}(ヴェルサイユ体制とワシントン体制、国際協調の高まり) * アジアの民族運動{{進捗|00%|2023-01-27}}(アジアの経済成長、東アジアの民族運動、インド・東南アジア・西アジアの民族運動) * もっと知りたい ユダヤ人のパレスチナ移住とパレスチナ分割{{進捗|00%|2022-12-30}}(パレスチナの歴史、シオニズム運動) * もっと知りたい 浅川巧 朝鮮の人々とともに生きた日本人{{進捗|00%|2022-12-30}}(浅川兄弟) ==== 1920年代の世界と大衆の時代の到来 ==== * 大衆の政治参加{{進捗|00%|2023-01-08}}(世界史上の民衆運動、大正デモクラシーと大衆の政治参加) * 女性の社会参加{{進捗|00%|2023-02-23}}(女性の社会進出、日本の大正期の女性) * [[高等学校歴史総合/大衆社会の形成|大衆社会の形成]]{{進捗|00%|2023-02-12}}(大衆社会の出現、1920年代のアメリカ、日本の大衆社会) * もっと知りたい 映画と「大衆化」{{進捗|00%|2022-12-28}}(映画の歴史) * もっと知りたい オリンピックの歩み{{進捗|00%|2022-12-28}}(オリンピックの歴史) === 第3章 経済危機と第二次世界大戦 === ==== 国際協調の挫折と2度目の世界大戦 ==== * 世界恐慌{{進捗|00%|2022-11-24}}(昭和恐慌、ブロック経済圏) * ファシズムの台頭{{進捗|00%|2022-12-31}}(ファシズム、ナチ党の政権掌握) * 日本の大陸進出{{進捗|00%|2022-12-08}}(満州事変、日中戦争) * 第二次世界大戦{{進捗|00%|2022-11-16}}(ドイツの拡大、第二次世界大戦、大量殺戮と民衆の抵抗) * もっと知りたい リンゲルブルム・アーカイヴと『アンネの日記』{{進捗|00%|2022-12-25}}(アンネ・フランク) * 歴史のなかの16歳 満蒙開拓青少年義勇軍{{進捗|100%|2022-11-21}}(満州農業移民、満蒙開拓青少年義勇軍、「鍬の戦士」) ==== 世界大戦がもたらしたもの ==== * アジア太平洋戦争{{進捗|100%|2023-01-29}}(日米交渉の挫折と開戦、日本のアジア支配、戦争の被害と加害) * 戦争が変えた人々のくらし{{進捗|00%|2023-02-19}}(マス・メディアの普及と情報や生活の画一化、国民の組織化と戦時動員ほか) * 戦後世界の新たな枠組み{{進捗|00%|2023-01-29}}(戦後構想と大戦の終結、冷戦の開始とドイツの分断、国際連合の成立) * 敗戦後の日本とアジア{{進捗|00%|2023-02-19}}(日本の戦後改革、大衆は敗戦をどう生きたか、冷戦と日本の独立) * 冷戦下の東アジア{{進捗|00%|2023-02-19}}(戦後の中国、朝鮮半島の南北分断、現代の朝鮮半島と台湾) * もっと知りたい 戦争を「記憶」するということ{{進捗|00%|2022-12-24}}(明日の神話ほか) * もっと知りたい 核と原子力エネルギー{{進捗|00%|2023-02-09}}(原子力の平和利用、原子力エネルギーの普及と課題) === 第4章 国際秩序の変化や大衆化と現代的な諸課題 === * ナショナリズム{{進捗|00%|2022-03-08}}[発展講義] == 第4編 グローバル化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 冷戦と世界経済 === ==== 冷戦と国際政治 ==== * 脱植民地化とアジア・アフリカ諸国{{進捗|00%|2023-01-25}}(アジア・アフリカ諸国の独立、第三世界の形成と連帯) * 冷戦下の地域紛争{{進捗|00%|2023-01-26}}(ベトナム戦争、中東戦争) * 先進国の政治と社会運動{{進捗|00%|2023-01-29}}(西側諸国と福祉国家政策、国境をこえる社会運動) * 核兵器の脅威と核軍縮{{進捗|00%|2023-01-29}}(核拡散と核兵器反対運動、核軍縮の取り組みと課題) ==== 世界経済の拡大と日本 ==== * 西ヨーロッパ・東南アジアの地域連携{{進捗|00%|2022-12-31}}(西ヨーロッパ統合への動き、東南アジア諸国の動き) * 戦後の日本とアジア諸国との関係{{進捗|00%|2023-01-01}}(日本の国連加盟、アジア諸国との国交回復、沖縄の本土復帰) * 高度経済成長{{進捗|00%|2023-01-01}}(日本と西ドイツの経済成長、高度経済成長と人々の生活、成長のもたらした課題) * もっと知りたい グローバリゼーションとストリートダンス{{進捗|00%|2022-12-27}}(ダンスの歴史) * 歴史のなかの16歳 集団就職 「金の卵」たちの時代{{進捗|00%|2023-02-09}}(集団就職列車など) === 第3章 世界秩序の変容と日本 === ==== 市場経済の変容と冷戦の終結 ==== * 石油危機と価値観の転換{{進捗|00%|2023-02-09}}(戦後経済の転換、石油危機と日本、価値観の転換) * アジアの成長{{進捗|00%|2023-02-13}}(アジア諸国の成長、第三世界の多様化、日本の経済大国化) * 冷戦の終結{{進捗|00%|2023-02-12}}(社会主義世界の変容、冷戦の終結とソ連の崩壊、冷戦後の地域紛争と日本) ==== 冷戦終結後の世界 ==== * 民主化の進展と冷戦終結後の日本{{進捗|00%|2022-12-31}}(民主化の進展と課題、日本の政治の展開) * [[高等学校歴史総合/市場開放と経済の自由化|市場開放と経済の自由化]]{{進捗|00%|2022-12-31}}(新自由主義の台頭、経済のグローバル化と新たな国際経済組織) * [[高等学校歴史総合/地域統合の進展と課題|地域統合の進展と課題]]{{進捗|00%|2022-12-31}}(地域統合の拡大、地域統合の課題) * [[高等学校歴史総合/情報通信技術の発達|情報通信技術の発達]]{{進捗|00%|2022-12-30}}(情報通信技術の発達と社会の変化、情報化社会とその課題) * [[高等学校歴史総合/冷戦終結後の紛争と平和への取り組み|冷戦終結後の紛争と平和への取り組み]]{{進捗|00%|2023-01-01}}(冷戦終結後の紛争、紛争の解決と国際社会の役割) * もっと知りたい 災害と私たち{{進捗|00%|2022-11-21}}(阪神淡路大震災、東日本大震災) * もっと知りたい 中東の少数派クルド人{{進捗|00%|2022-12-27}}(国民国家の中の少数派、クルド人問題の展開) === 第4章 現代的な諸課題の形成と展望 === * 移民{{進捗|00%|2023-02-22}}(近代の移民史) == 近現代史関連用語解説・参考 == * 近現代史関連用語解説{{進捗|00%|2023-02-22}} * 途上国から見た国際関係理論{{進捗|00%|2023-03-05}}[発展講義(イマニュエル・ウォーラースティンなど)] [[カテゴリ:歴史|こうとうかつこうれきしそうこう]] [[カテゴリ:高等学校歴史総合|*]] 8eafyqia41hzurtntrc7iiihmb4wk57 264165 264162 2024-11-25T03:32:17Z Kwawe 68789 /* 18世紀までの世界 */ 264165 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>高等学校歴史総合 {{進捗状況}} 「'''歴史総合'''」は標準単位数2単位で'''必修科目'''です。 === 注意事項 === # 目次の項目、本文内容ともに[https://www.shimizushoin.co.jp/info_kyo/rekishisougou/index.html 清水書院『私たちの歴史総合』]【歴総705】に合わせています。 # なお、古代と中世に関しては、当科目では扱っていないので、[[高等学校世界史探究|世界史探究]]と[[高等学校日本史探究|日本史探究]]の学習内容を見てください。 == 第1編 歴史の扉 == === 第1章 歴史と私たち === * [[高等学校歴史総合/日本とスポーツの歴史|日本とスポーツの歴史]]{{進捗|100%|2024-11-22}}(スポーツ史) === 第2章 歴史の特質と資料 === * 8月15日とそれぞれの「終戦」{{進捗|00%|2022-12-18}}(玉音放送) == 第2編 近代化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 結びつく世界と日本 === ==== 18世紀までの世界 ==== * [[高等学校歴史総合/近世の日本と世界|近世の日本と世界]]{{進捗|100%|2024-11-23}}(日本の「鎖国」と東アジアの交易、近世東アジアの国際秩序) * [[高等学校歴史総合/18世紀の中国とアジア貿易|18世紀の中国とアジア貿易]]{{進捗|00%|2023-02-12}}(清の繁栄、清と近隣諸国とのつながり) * [[高等学校歴史総合/18世紀のイギリス・アジア・アフリカ|18世紀のイギリス・アジア・アフリカ]]{{進捗|00%|2023-02-12}}(ヨーロッパの世界進出と大西洋三角貿易、世界経済の覇権を握ったイギリス) * もっと知りたい 海を渡った日本産陶磁器{{進捗|00%|2023-12-24}}(陶磁器の歴史) * もっと知りたい 琉球と蝦夷地{{進捗|00%|2022-12-25}}(琉球王国、蝦夷地) ==== 工業化と世界市場の形成 ==== * 産業革命による経済発展と社会の変化{{進捗|00%|2022-11-25}}(産業革命、資本主義社会) * 世界市場の形成とイギリスによるアジア進出{{進捗|00%|2023-02-25}}(イギリスによる世界市場の形成、イギリスのアジア進出 ) * 日本の開国とその影響{{進捗|00%|2022-11-21}}(日本の開国・開港、交通革命の進展と東アジア) * 歴史のなかの16歳 工女と工場法{{進捗|00%|2022-12-25}}(工場法など) * [[高等学校歴史総合/もっと知りたい 産業革命とブラスバンド|もっと知りたい 産業革命とブラスバンド]]{{進捗|100%|2024-11-23}}(金管楽器の歴史) === 第3章 国民国家と明治維新 === ==== 国民国家と立憲体制 ==== * 二つの市民革命と近代民主主義社会の成立{{進捗|00%|2022-11-22}}(アメリカ独立革命、フランス革命、ナポレオン) * 国民統合とナショナリズム{{進捗|00%|2022-11-23}}(19世紀前半のヨーロッパ諸国、ドイツ統一、南北戦争など) * 明治維新期の日本と世界{{進捗|100%|2023-02-19}}(明治新政府の成立、近代化と東アジア) * 近代国家への移行と憲法の制定{{進捗|00%|2022-11-24}}(大日本帝国憲法、条約改正の実現) * もっと知りたい 国境の過去・現在・未来{{進捗|00%|2022-12-26}}(近代国家と領土画定など) * もっと知りたい 女王と天皇 理想の家族{{進捗|00%|2022-02-12}}(近代の天皇史) ==== 帝国主義とアジア・アフリカの変容 ==== * 列強による帝国主義{{進捗|00%|2023-02-17}}(第2次産業革命と帝国主義、欧米諸国の帝国主義政策) * 帝国主義がアジア・アフリカにもたらしたもの{{進捗|00%|2023-02-18}}(列強のアフリカ分割、西アジア諸国の改革など) * 日清戦争とその影響{{進捗|00%|2023-02-15}}(日清戦争、東アジアの構造変動) * 日露戦争{{進捗|00%|2022-11-22}}(義和団事件、日露戦争、朝鮮の植民地化、辛亥革命) * もっと知りたい 近代の博覧会{{進捗|00%|2022-12-24}}(万国博覧会の歴史) * [[高等学校歴史総合/もっと知りたい ペストと感染症|もっと知りたい ペストと感染症]]{{進捗|75%|2024-11-24}}(近代におけるペストの流行ほか) === 第4章 近代化と現代的な諸課題 === * 鉄道建設{{進捗|00%|2023-03-02}} == 第3編 国際秩序の変化や大衆化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 第一次世界大戦と大衆社会 === ==== 第一次世界大戦と国際社会 ==== * [[高等学校歴史総合/第一次世界大戦|第一次世界大戦]]{{進捗|50%|2024-11-25}}(第一次世界大戦) * [[高等学校歴史総合/社会主義革命|社会主義革命]]{{進捗|00%|2022-12-30}}(ロシア革命、コミンテルン、ソビエト社会主義共和国連邦) * [[高等学校歴史総合/国際協調体制|国際協調体制]]{{進捗|100%|2024-11-23}}(ヴェルサイユ体制とワシントン体制、国際協調の高まり) * アジアの民族運動{{進捗|00%|2023-01-27}}(アジアの経済成長、東アジアの民族運動、インド・東南アジア・西アジアの民族運動) * もっと知りたい ユダヤ人のパレスチナ移住とパレスチナ分割{{進捗|00%|2022-12-30}}(パレスチナの歴史、シオニズム運動) * もっと知りたい 浅川巧 朝鮮の人々とともに生きた日本人{{進捗|00%|2022-12-30}}(浅川兄弟) ==== 1920年代の世界と大衆の時代の到来 ==== * 大衆の政治参加{{進捗|00%|2023-01-08}}(世界史上の民衆運動、大正デモクラシーと大衆の政治参加) * 女性の社会参加{{進捗|00%|2023-02-23}}(女性の社会進出、日本の大正期の女性) * [[高等学校歴史総合/大衆社会の形成|大衆社会の形成]]{{進捗|00%|2023-02-12}}(大衆社会の出現、1920年代のアメリカ、日本の大衆社会) * もっと知りたい 映画と「大衆化」{{進捗|00%|2022-12-28}}(映画の歴史) * もっと知りたい オリンピックの歩み{{進捗|00%|2022-12-28}}(オリンピックの歴史) === 第3章 経済危機と第二次世界大戦 === ==== 国際協調の挫折と2度目の世界大戦 ==== * 世界恐慌{{進捗|00%|2022-11-24}}(昭和恐慌、ブロック経済圏) * ファシズムの台頭{{進捗|00%|2022-12-31}}(ファシズム、ナチ党の政権掌握) * 日本の大陸進出{{進捗|00%|2022-12-08}}(満州事変、日中戦争) * 第二次世界大戦{{進捗|00%|2022-11-16}}(ドイツの拡大、第二次世界大戦、大量殺戮と民衆の抵抗) * もっと知りたい リンゲルブルム・アーカイヴと『アンネの日記』{{進捗|00%|2022-12-25}}(アンネ・フランク) * 歴史のなかの16歳 満蒙開拓青少年義勇軍{{進捗|100%|2022-11-21}}(満州農業移民、満蒙開拓青少年義勇軍、「鍬の戦士」) ==== 世界大戦がもたらしたもの ==== * アジア太平洋戦争{{進捗|100%|2023-01-29}}(日米交渉の挫折と開戦、日本のアジア支配、戦争の被害と加害) * 戦争が変えた人々のくらし{{進捗|00%|2023-02-19}}(マス・メディアの普及と情報や生活の画一化、国民の組織化と戦時動員ほか) * 戦後世界の新たな枠組み{{進捗|00%|2023-01-29}}(戦後構想と大戦の終結、冷戦の開始とドイツの分断、国際連合の成立) * 敗戦後の日本とアジア{{進捗|00%|2023-02-19}}(日本の戦後改革、大衆は敗戦をどう生きたか、冷戦と日本の独立) * 冷戦下の東アジア{{進捗|00%|2023-02-19}}(戦後の中国、朝鮮半島の南北分断、現代の朝鮮半島と台湾) * もっと知りたい 戦争を「記憶」するということ{{進捗|00%|2022-12-24}}(明日の神話ほか) * もっと知りたい 核と原子力エネルギー{{進捗|00%|2023-02-09}}(原子力の平和利用、原子力エネルギーの普及と課題) === 第4章 国際秩序の変化や大衆化と現代的な諸課題 === * ナショナリズム{{進捗|00%|2022-03-08}}[発展講義] == 第4編 グローバル化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 冷戦と世界経済 === ==== 冷戦と国際政治 ==== * 脱植民地化とアジア・アフリカ諸国{{進捗|00%|2023-01-25}}(アジア・アフリカ諸国の独立、第三世界の形成と連帯) * 冷戦下の地域紛争{{進捗|00%|2023-01-26}}(ベトナム戦争、中東戦争) * 先進国の政治と社会運動{{進捗|00%|2023-01-29}}(西側諸国と福祉国家政策、国境をこえる社会運動) * 核兵器の脅威と核軍縮{{進捗|00%|2023-01-29}}(核拡散と核兵器反対運動、核軍縮の取り組みと課題) ==== 世界経済の拡大と日本 ==== * 西ヨーロッパ・東南アジアの地域連携{{進捗|00%|2022-12-31}}(西ヨーロッパ統合への動き、東南アジア諸国の動き) * 戦後の日本とアジア諸国との関係{{進捗|00%|2023-01-01}}(日本の国連加盟、アジア諸国との国交回復、沖縄の本土復帰) * 高度経済成長{{進捗|00%|2023-01-01}}(日本と西ドイツの経済成長、高度経済成長と人々の生活、成長のもたらした課題) * もっと知りたい グローバリゼーションとストリートダンス{{進捗|00%|2022-12-27}}(ダンスの歴史) * 歴史のなかの16歳 集団就職 「金の卵」たちの時代{{進捗|00%|2023-02-09}}(集団就職列車など) === 第3章 世界秩序の変容と日本 === ==== 市場経済の変容と冷戦の終結 ==== * 石油危機と価値観の転換{{進捗|00%|2023-02-09}}(戦後経済の転換、石油危機と日本、価値観の転換) * アジアの成長{{進捗|00%|2023-02-13}}(アジア諸国の成長、第三世界の多様化、日本の経済大国化) * 冷戦の終結{{進捗|00%|2023-02-12}}(社会主義世界の変容、冷戦の終結とソ連の崩壊、冷戦後の地域紛争と日本) ==== 冷戦終結後の世界 ==== * 民主化の進展と冷戦終結後の日本{{進捗|00%|2022-12-31}}(民主化の進展と課題、日本の政治の展開) * [[高等学校歴史総合/市場開放と経済の自由化|市場開放と経済の自由化]]{{進捗|00%|2022-12-31}}(新自由主義の台頭、経済のグローバル化と新たな国際経済組織) * [[高等学校歴史総合/地域統合の進展と課題|地域統合の進展と課題]]{{進捗|00%|2022-12-31}}(地域統合の拡大、地域統合の課題) * [[高等学校歴史総合/情報通信技術の発達|情報通信技術の発達]]{{進捗|00%|2022-12-30}}(情報通信技術の発達と社会の変化、情報化社会とその課題) * [[高等学校歴史総合/冷戦終結後の紛争と平和への取り組み|冷戦終結後の紛争と平和への取り組み]]{{進捗|00%|2023-01-01}}(冷戦終結後の紛争、紛争の解決と国際社会の役割) * もっと知りたい 災害と私たち{{進捗|00%|2022-11-21}}(阪神淡路大震災、東日本大震災) * もっと知りたい 中東の少数派クルド人{{進捗|00%|2022-12-27}}(国民国家の中の少数派、クルド人問題の展開) === 第4章 現代的な諸課題の形成と展望 === * 移民{{進捗|00%|2023-02-22}}(近代の移民史) == 近現代史関連用語解説・参考 == * 近現代史関連用語解説{{進捗|00%|2023-02-22}} * 途上国から見た国際関係理論{{進捗|00%|2023-03-05}}[発展講義(イマニュエル・ウォーラースティンなど)] [[カテゴリ:歴史|こうとうかつこうれきしそうこう]] [[カテゴリ:高等学校歴史総合|*]] cwiqnix5mjxgnoo1jn71piidntnxhi2 264180 264165 2024-11-25T10:17:36Z Kwawe 68789 /* 第一次世界大戦と国際社会 */ 264180 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>高等学校歴史総合 {{進捗状況}} 「'''歴史総合'''」は標準単位数2単位で'''必修科目'''です。 === 注意事項 === # 目次の項目、本文内容ともに[https://www.shimizushoin.co.jp/info_kyo/rekishisougou/index.html 清水書院『私たちの歴史総合』]【歴総705】に合わせています。 # なお、古代と中世に関しては、当科目では扱っていないので、[[高等学校世界史探究|世界史探究]]と[[高等学校日本史探究|日本史探究]]の学習内容を見てください。 == 第1編 歴史の扉 == === 第1章 歴史と私たち === * [[高等学校歴史総合/日本とスポーツの歴史|日本とスポーツの歴史]]{{進捗|100%|2024-11-22}}(スポーツ史) === 第2章 歴史の特質と資料 === * 8月15日とそれぞれの「終戦」{{進捗|00%|2022-12-18}}(玉音放送) == 第2編 近代化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 結びつく世界と日本 === ==== 18世紀までの世界 ==== * [[高等学校歴史総合/近世の日本と世界|近世の日本と世界]]{{進捗|100%|2024-11-23}}(日本の「鎖国」と東アジアの交易、近世東アジアの国際秩序) * [[高等学校歴史総合/18世紀の中国とアジア貿易|18世紀の中国とアジア貿易]]{{進捗|00%|2023-02-12}}(清の繁栄、清と近隣諸国とのつながり) * [[高等学校歴史総合/18世紀のイギリス・アジア・アフリカ|18世紀のイギリス・アジア・アフリカ]]{{進捗|00%|2023-02-12}}(ヨーロッパの世界進出と大西洋三角貿易、世界経済の覇権を握ったイギリス) * もっと知りたい 海を渡った日本産陶磁器{{進捗|00%|2023-12-24}}(陶磁器の歴史) * もっと知りたい 琉球と蝦夷地{{進捗|00%|2022-12-25}}(琉球王国、蝦夷地) ==== 工業化と世界市場の形成 ==== * 産業革命による経済発展と社会の変化{{進捗|00%|2022-11-25}}(産業革命、資本主義社会) * 世界市場の形成とイギリスによるアジア進出{{進捗|00%|2023-02-25}}(イギリスによる世界市場の形成、イギリスのアジア進出 ) * 日本の開国とその影響{{進捗|00%|2022-11-21}}(日本の開国・開港、交通革命の進展と東アジア) * 歴史のなかの16歳 工女と工場法{{進捗|00%|2022-12-25}}(工場法など) * [[高等学校歴史総合/もっと知りたい 産業革命とブラスバンド|もっと知りたい 産業革命とブラスバンド]]{{進捗|100%|2024-11-23}}(金管楽器の歴史) === 第3章 国民国家と明治維新 === ==== 国民国家と立憲体制 ==== * 二つの市民革命と近代民主主義社会の成立{{進捗|00%|2022-11-22}}(アメリカ独立革命、フランス革命、ナポレオン) * 国民統合とナショナリズム{{進捗|00%|2022-11-23}}(19世紀前半のヨーロッパ諸国、ドイツ統一、南北戦争など) * 明治維新期の日本と世界{{進捗|100%|2023-02-19}}(明治新政府の成立、近代化と東アジア) * 近代国家への移行と憲法の制定{{進捗|00%|2022-11-24}}(大日本帝国憲法、条約改正の実現) * もっと知りたい 国境の過去・現在・未来{{進捗|00%|2022-12-26}}(近代国家と領土画定など) * もっと知りたい 女王と天皇 理想の家族{{進捗|00%|2022-02-12}}(近代の天皇史) ==== 帝国主義とアジア・アフリカの変容 ==== * 列強による帝国主義{{進捗|00%|2023-02-17}}(第2次産業革命と帝国主義、欧米諸国の帝国主義政策) * 帝国主義がアジア・アフリカにもたらしたもの{{進捗|00%|2023-02-18}}(列強のアフリカ分割、西アジア諸国の改革など) * 日清戦争とその影響{{進捗|00%|2023-02-15}}(日清戦争、東アジアの構造変動) * 日露戦争{{進捗|00%|2022-11-22}}(義和団事件、日露戦争、朝鮮の植民地化、辛亥革命) * もっと知りたい 近代の博覧会{{進捗|00%|2022-12-24}}(万国博覧会の歴史) * [[高等学校歴史総合/もっと知りたい ペストと感染症|もっと知りたい ペストと感染症]]{{進捗|75%|2024-11-24}}(近代におけるペストの流行ほか) === 第4章 近代化と現代的な諸課題 === * 鉄道建設{{進捗|00%|2023-03-02}} == 第3編 国際秩序の変化や大衆化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 第一次世界大戦と大衆社会 === ==== 第一次世界大戦と国際社会 ==== * [[高等学校歴史総合/第一次世界大戦|第一次世界大戦]]{{進捗|75%|2024-11-25}}(第一次世界大戦) * [[高等学校歴史総合/社会主義革命|社会主義革命]]{{進捗|00%|2022-12-30}}(ロシア革命、コミンテルン、ソビエト社会主義共和国連邦) * [[高等学校歴史総合/国際協調体制|国際協調体制]]{{進捗|100%|2024-11-23}}(ヴェルサイユ体制とワシントン体制、国際協調の高まり) * アジアの民族運動{{進捗|00%|2023-01-27}}(アジアの経済成長、東アジアの民族運動、インド・東南アジア・西アジアの民族運動) * もっと知りたい ユダヤ人のパレスチナ移住とパレスチナ分割{{進捗|00%|2022-12-30}}(パレスチナの歴史、シオニズム運動) * もっと知りたい 浅川巧 朝鮮の人々とともに生きた日本人{{進捗|00%|2022-12-30}}(浅川兄弟) ==== 1920年代の世界と大衆の時代の到来 ==== * 大衆の政治参加{{進捗|00%|2023-01-08}}(世界史上の民衆運動、大正デモクラシーと大衆の政治参加) * 女性の社会参加{{進捗|00%|2023-02-23}}(女性の社会進出、日本の大正期の女性) * [[高等学校歴史総合/大衆社会の形成|大衆社会の形成]]{{進捗|00%|2023-02-12}}(大衆社会の出現、1920年代のアメリカ、日本の大衆社会) * もっと知りたい 映画と「大衆化」{{進捗|00%|2022-12-28}}(映画の歴史) * もっと知りたい オリンピックの歩み{{進捗|00%|2022-12-28}}(オリンピックの歴史) === 第3章 経済危機と第二次世界大戦 === ==== 国際協調の挫折と2度目の世界大戦 ==== * 世界恐慌{{進捗|00%|2022-11-24}}(昭和恐慌、ブロック経済圏) * ファシズムの台頭{{進捗|00%|2022-12-31}}(ファシズム、ナチ党の政権掌握) * 日本の大陸進出{{進捗|00%|2022-12-08}}(満州事変、日中戦争) * 第二次世界大戦{{進捗|00%|2022-11-16}}(ドイツの拡大、第二次世界大戦、大量殺戮と民衆の抵抗) * もっと知りたい リンゲルブルム・アーカイヴと『アンネの日記』{{進捗|00%|2022-12-25}}(アンネ・フランク) * 歴史のなかの16歳 満蒙開拓青少年義勇軍{{進捗|100%|2022-11-21}}(満州農業移民、満蒙開拓青少年義勇軍、「鍬の戦士」) ==== 世界大戦がもたらしたもの ==== * アジア太平洋戦争{{進捗|100%|2023-01-29}}(日米交渉の挫折と開戦、日本のアジア支配、戦争の被害と加害) * 戦争が変えた人々のくらし{{進捗|00%|2023-02-19}}(マス・メディアの普及と情報や生活の画一化、国民の組織化と戦時動員ほか) * 戦後世界の新たな枠組み{{進捗|00%|2023-01-29}}(戦後構想と大戦の終結、冷戦の開始とドイツの分断、国際連合の成立) * 敗戦後の日本とアジア{{進捗|00%|2023-02-19}}(日本の戦後改革、大衆は敗戦をどう生きたか、冷戦と日本の独立) * 冷戦下の東アジア{{進捗|00%|2023-02-19}}(戦後の中国、朝鮮半島の南北分断、現代の朝鮮半島と台湾) * もっと知りたい 戦争を「記憶」するということ{{進捗|00%|2022-12-24}}(明日の神話ほか) * もっと知りたい 核と原子力エネルギー{{進捗|00%|2023-02-09}}(原子力の平和利用、原子力エネルギーの普及と課題) === 第4章 国際秩序の変化や大衆化と現代的な諸課題 === * ナショナリズム{{進捗|00%|2022-03-08}}[発展講義] == 第4編 グローバル化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 冷戦と世界経済 === ==== 冷戦と国際政治 ==== * 脱植民地化とアジア・アフリカ諸国{{進捗|00%|2023-01-25}}(アジア・アフリカ諸国の独立、第三世界の形成と連帯) * 冷戦下の地域紛争{{進捗|00%|2023-01-26}}(ベトナム戦争、中東戦争) * 先進国の政治と社会運動{{進捗|00%|2023-01-29}}(西側諸国と福祉国家政策、国境をこえる社会運動) * 核兵器の脅威と核軍縮{{進捗|00%|2023-01-29}}(核拡散と核兵器反対運動、核軍縮の取り組みと課題) ==== 世界経済の拡大と日本 ==== * 西ヨーロッパ・東南アジアの地域連携{{進捗|00%|2022-12-31}}(西ヨーロッパ統合への動き、東南アジア諸国の動き) * 戦後の日本とアジア諸国との関係{{進捗|00%|2023-01-01}}(日本の国連加盟、アジア諸国との国交回復、沖縄の本土復帰) * 高度経済成長{{進捗|00%|2023-01-01}}(日本と西ドイツの経済成長、高度経済成長と人々の生活、成長のもたらした課題) * もっと知りたい グローバリゼーションとストリートダンス{{進捗|00%|2022-12-27}}(ダンスの歴史) * 歴史のなかの16歳 集団就職 「金の卵」たちの時代{{進捗|00%|2023-02-09}}(集団就職列車など) === 第3章 世界秩序の変容と日本 === ==== 市場経済の変容と冷戦の終結 ==== * 石油危機と価値観の転換{{進捗|00%|2023-02-09}}(戦後経済の転換、石油危機と日本、価値観の転換) * アジアの成長{{進捗|00%|2023-02-13}}(アジア諸国の成長、第三世界の多様化、日本の経済大国化) * 冷戦の終結{{進捗|00%|2023-02-12}}(社会主義世界の変容、冷戦の終結とソ連の崩壊、冷戦後の地域紛争と日本) ==== 冷戦終結後の世界 ==== * 民主化の進展と冷戦終結後の日本{{進捗|00%|2022-12-31}}(民主化の進展と課題、日本の政治の展開) * [[高等学校歴史総合/市場開放と経済の自由化|市場開放と経済の自由化]]{{進捗|00%|2022-12-31}}(新自由主義の台頭、経済のグローバル化と新たな国際経済組織) * [[高等学校歴史総合/地域統合の進展と課題|地域統合の進展と課題]]{{進捗|00%|2022-12-31}}(地域統合の拡大、地域統合の課題) * [[高等学校歴史総合/情報通信技術の発達|情報通信技術の発達]]{{進捗|00%|2022-12-30}}(情報通信技術の発達と社会の変化、情報化社会とその課題) * [[高等学校歴史総合/冷戦終結後の紛争と平和への取り組み|冷戦終結後の紛争と平和への取り組み]]{{進捗|00%|2023-01-01}}(冷戦終結後の紛争、紛争の解決と国際社会の役割) * もっと知りたい 災害と私たち{{進捗|00%|2022-11-21}}(阪神淡路大震災、東日本大震災) * もっと知りたい 中東の少数派クルド人{{進捗|00%|2022-12-27}}(国民国家の中の少数派、クルド人問題の展開) === 第4章 現代的な諸課題の形成と展望 === * 移民{{進捗|00%|2023-02-22}}(近代の移民史) == 近現代史関連用語解説・参考 == * 近現代史関連用語解説{{進捗|00%|2023-02-22}} * 途上国から見た国際関係理論{{進捗|00%|2023-03-05}}[発展講義(イマニュエル・ウォーラースティンなど)] [[カテゴリ:歴史|こうとうかつこうれきしそうこう]] [[カテゴリ:高等学校歴史総合|*]] to6jysvchescqm0jsl4kb7ln94ifz5p 264188 264180 2024-11-25T10:44:22Z Kwawe 68789 /* 第一次世界大戦と国際社会 */ 264188 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>高等学校歴史総合 {{進捗状況}} 「'''歴史総合'''」は標準単位数2単位で'''必修科目'''です。 === 注意事項 === # 目次の項目、本文内容ともに[https://www.shimizushoin.co.jp/info_kyo/rekishisougou/index.html 清水書院『私たちの歴史総合』]【歴総705】に合わせています。 # なお、古代と中世に関しては、当科目では扱っていないので、[[高等学校世界史探究|世界史探究]]と[[高等学校日本史探究|日本史探究]]の学習内容を見てください。 == 第1編 歴史の扉 == === 第1章 歴史と私たち === * [[高等学校歴史総合/日本とスポーツの歴史|日本とスポーツの歴史]]{{進捗|100%|2024-11-22}}(スポーツ史) === 第2章 歴史の特質と資料 === * 8月15日とそれぞれの「終戦」{{進捗|00%|2022-12-18}}(玉音放送) == 第2編 近代化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 結びつく世界と日本 === ==== 18世紀までの世界 ==== * [[高等学校歴史総合/近世の日本と世界|近世の日本と世界]]{{進捗|100%|2024-11-23}}(日本の「鎖国」と東アジアの交易、近世東アジアの国際秩序) * [[高等学校歴史総合/18世紀の中国とアジア貿易|18世紀の中国とアジア貿易]]{{進捗|00%|2023-02-12}}(清の繁栄、清と近隣諸国とのつながり) * [[高等学校歴史総合/18世紀のイギリス・アジア・アフリカ|18世紀のイギリス・アジア・アフリカ]]{{進捗|00%|2023-02-12}}(ヨーロッパの世界進出と大西洋三角貿易、世界経済の覇権を握ったイギリス) * もっと知りたい 海を渡った日本産陶磁器{{進捗|00%|2023-12-24}}(陶磁器の歴史) * もっと知りたい 琉球と蝦夷地{{進捗|00%|2022-12-25}}(琉球王国、蝦夷地) ==== 工業化と世界市場の形成 ==== * 産業革命による経済発展と社会の変化{{進捗|00%|2022-11-25}}(産業革命、資本主義社会) * 世界市場の形成とイギリスによるアジア進出{{進捗|00%|2023-02-25}}(イギリスによる世界市場の形成、イギリスのアジア進出 ) * 日本の開国とその影響{{進捗|00%|2022-11-21}}(日本の開国・開港、交通革命の進展と東アジア) * 歴史のなかの16歳 工女と工場法{{進捗|00%|2022-12-25}}(工場法など) * [[高等学校歴史総合/もっと知りたい 産業革命とブラスバンド|もっと知りたい 産業革命とブラスバンド]]{{進捗|100%|2024-11-23}}(金管楽器の歴史) === 第3章 国民国家と明治維新 === ==== 国民国家と立憲体制 ==== * 二つの市民革命と近代民主主義社会の成立{{進捗|00%|2022-11-22}}(アメリカ独立革命、フランス革命、ナポレオン) * 国民統合とナショナリズム{{進捗|00%|2022-11-23}}(19世紀前半のヨーロッパ諸国、ドイツ統一、南北戦争など) * 明治維新期の日本と世界{{進捗|100%|2023-02-19}}(明治新政府の成立、近代化と東アジア) * 近代国家への移行と憲法の制定{{進捗|00%|2022-11-24}}(大日本帝国憲法、条約改正の実現) * もっと知りたい 国境の過去・現在・未来{{進捗|00%|2022-12-26}}(近代国家と領土画定など) * もっと知りたい 女王と天皇 理想の家族{{進捗|00%|2022-02-12}}(近代の天皇史) ==== 帝国主義とアジア・アフリカの変容 ==== * 列強による帝国主義{{進捗|00%|2023-02-17}}(第2次産業革命と帝国主義、欧米諸国の帝国主義政策) * 帝国主義がアジア・アフリカにもたらしたもの{{進捗|00%|2023-02-18}}(列強のアフリカ分割、西アジア諸国の改革など) * 日清戦争とその影響{{進捗|00%|2023-02-15}}(日清戦争、東アジアの構造変動) * 日露戦争{{進捗|00%|2022-11-22}}(義和団事件、日露戦争、朝鮮の植民地化、辛亥革命) * もっと知りたい 近代の博覧会{{進捗|00%|2022-12-24}}(万国博覧会の歴史) * [[高等学校歴史総合/もっと知りたい ペストと感染症|もっと知りたい ペストと感染症]]{{進捗|75%|2024-11-24}}(近代におけるペストの流行ほか) === 第4章 近代化と現代的な諸課題 === * 鉄道建設{{進捗|00%|2023-03-02}} == 第3編 国際秩序の変化や大衆化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 第一次世界大戦と大衆社会 === ==== 第一次世界大戦と国際社会 ==== * [[高等学校歴史総合/第一次世界大戦|第一次世界大戦]]{{進捗|100%|2024-11-25}}(第一次世界大戦) * [[高等学校歴史総合/社会主義革命|社会主義革命]]{{進捗|00%|2022-12-30}}(ロシア革命、コミンテルン、ソビエト社会主義共和国連邦) * [[高等学校歴史総合/国際協調体制|国際協調体制]]{{進捗|100%|2024-11-23}}(ヴェルサイユ体制とワシントン体制、国際協調の高まり) * アジアの民族運動{{進捗|00%|2023-01-27}}(アジアの経済成長、東アジアの民族運動、インド・東南アジア・西アジアの民族運動) * もっと知りたい ユダヤ人のパレスチナ移住とパレスチナ分割{{進捗|00%|2022-12-30}}(パレスチナの歴史、シオニズム運動) * もっと知りたい 浅川巧 朝鮮の人々とともに生きた日本人{{進捗|00%|2022-12-30}}(浅川兄弟) ==== 1920年代の世界と大衆の時代の到来 ==== * 大衆の政治参加{{進捗|00%|2023-01-08}}(世界史上の民衆運動、大正デモクラシーと大衆の政治参加) * 女性の社会参加{{進捗|00%|2023-02-23}}(女性の社会進出、日本の大正期の女性) * [[高等学校歴史総合/大衆社会の形成|大衆社会の形成]]{{進捗|00%|2023-02-12}}(大衆社会の出現、1920年代のアメリカ、日本の大衆社会) * もっと知りたい 映画と「大衆化」{{進捗|00%|2022-12-28}}(映画の歴史) * もっと知りたい オリンピックの歩み{{進捗|00%|2022-12-28}}(オリンピックの歴史) === 第3章 経済危機と第二次世界大戦 === ==== 国際協調の挫折と2度目の世界大戦 ==== * 世界恐慌{{進捗|00%|2022-11-24}}(昭和恐慌、ブロック経済圏) * ファシズムの台頭{{進捗|00%|2022-12-31}}(ファシズム、ナチ党の政権掌握) * 日本の大陸進出{{進捗|00%|2022-12-08}}(満州事変、日中戦争) * 第二次世界大戦{{進捗|00%|2022-11-16}}(ドイツの拡大、第二次世界大戦、大量殺戮と民衆の抵抗) * もっと知りたい リンゲルブルム・アーカイヴと『アンネの日記』{{進捗|00%|2022-12-25}}(アンネ・フランク) * 歴史のなかの16歳 満蒙開拓青少年義勇軍{{進捗|100%|2022-11-21}}(満州農業移民、満蒙開拓青少年義勇軍、「鍬の戦士」) ==== 世界大戦がもたらしたもの ==== * アジア太平洋戦争{{進捗|100%|2023-01-29}}(日米交渉の挫折と開戦、日本のアジア支配、戦争の被害と加害) * 戦争が変えた人々のくらし{{進捗|00%|2023-02-19}}(マス・メディアの普及と情報や生活の画一化、国民の組織化と戦時動員ほか) * 戦後世界の新たな枠組み{{進捗|00%|2023-01-29}}(戦後構想と大戦の終結、冷戦の開始とドイツの分断、国際連合の成立) * 敗戦後の日本とアジア{{進捗|00%|2023-02-19}}(日本の戦後改革、大衆は敗戦をどう生きたか、冷戦と日本の独立) * 冷戦下の東アジア{{進捗|00%|2023-02-19}}(戦後の中国、朝鮮半島の南北分断、現代の朝鮮半島と台湾) * もっと知りたい 戦争を「記憶」するということ{{進捗|00%|2022-12-24}}(明日の神話ほか) * もっと知りたい 核と原子力エネルギー{{進捗|00%|2023-02-09}}(原子力の平和利用、原子力エネルギーの普及と課題) === 第4章 国際秩序の変化や大衆化と現代的な諸課題 === * ナショナリズム{{進捗|00%|2022-03-08}}[発展講義] == 第4編 グローバル化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 冷戦と世界経済 === ==== 冷戦と国際政治 ==== * 脱植民地化とアジア・アフリカ諸国{{進捗|00%|2023-01-25}}(アジア・アフリカ諸国の独立、第三世界の形成と連帯) * 冷戦下の地域紛争{{進捗|00%|2023-01-26}}(ベトナム戦争、中東戦争) * 先進国の政治と社会運動{{進捗|00%|2023-01-29}}(西側諸国と福祉国家政策、国境をこえる社会運動) * 核兵器の脅威と核軍縮{{進捗|00%|2023-01-29}}(核拡散と核兵器反対運動、核軍縮の取り組みと課題) ==== 世界経済の拡大と日本 ==== * 西ヨーロッパ・東南アジアの地域連携{{進捗|00%|2022-12-31}}(西ヨーロッパ統合への動き、東南アジア諸国の動き) * 戦後の日本とアジア諸国との関係{{進捗|00%|2023-01-01}}(日本の国連加盟、アジア諸国との国交回復、沖縄の本土復帰) * 高度経済成長{{進捗|00%|2023-01-01}}(日本と西ドイツの経済成長、高度経済成長と人々の生活、成長のもたらした課題) * もっと知りたい グローバリゼーションとストリートダンス{{進捗|00%|2022-12-27}}(ダンスの歴史) * 歴史のなかの16歳 集団就職 「金の卵」たちの時代{{進捗|00%|2023-02-09}}(集団就職列車など) === 第3章 世界秩序の変容と日本 === ==== 市場経済の変容と冷戦の終結 ==== * 石油危機と価値観の転換{{進捗|00%|2023-02-09}}(戦後経済の転換、石油危機と日本、価値観の転換) * アジアの成長{{進捗|00%|2023-02-13}}(アジア諸国の成長、第三世界の多様化、日本の経済大国化) * 冷戦の終結{{進捗|00%|2023-02-12}}(社会主義世界の変容、冷戦の終結とソ連の崩壊、冷戦後の地域紛争と日本) ==== 冷戦終結後の世界 ==== * 民主化の進展と冷戦終結後の日本{{進捗|00%|2022-12-31}}(民主化の進展と課題、日本の政治の展開) * [[高等学校歴史総合/市場開放と経済の自由化|市場開放と経済の自由化]]{{進捗|00%|2022-12-31}}(新自由主義の台頭、経済のグローバル化と新たな国際経済組織) * [[高等学校歴史総合/地域統合の進展と課題|地域統合の進展と課題]]{{進捗|00%|2022-12-31}}(地域統合の拡大、地域統合の課題) * [[高等学校歴史総合/情報通信技術の発達|情報通信技術の発達]]{{進捗|00%|2022-12-30}}(情報通信技術の発達と社会の変化、情報化社会とその課題) * [[高等学校歴史総合/冷戦終結後の紛争と平和への取り組み|冷戦終結後の紛争と平和への取り組み]]{{進捗|00%|2023-01-01}}(冷戦終結後の紛争、紛争の解決と国際社会の役割) * もっと知りたい 災害と私たち{{進捗|00%|2022-11-21}}(阪神淡路大震災、東日本大震災) * もっと知りたい 中東の少数派クルド人{{進捗|00%|2022-12-27}}(国民国家の中の少数派、クルド人問題の展開) === 第4章 現代的な諸課題の形成と展望 === * 移民{{進捗|00%|2023-02-22}}(近代の移民史) == 近現代史関連用語解説・参考 == * 近現代史関連用語解説{{進捗|00%|2023-02-22}} * 途上国から見た国際関係理論{{進捗|00%|2023-03-05}}[発展講義(イマニュエル・ウォーラースティンなど)] [[カテゴリ:歴史|こうとうかつこうれきしそうこう]] [[カテゴリ:高等学校歴史総合|*]] gan4bug5ixj7dik71jnbwi81dxf88sa 264193 264188 2024-11-25T11:39:08Z Kwawe 68789 /* 1920年代の世界と大衆の時代の到来 */ 264193 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>高等学校歴史総合 {{進捗状況}} 「'''歴史総合'''」は標準単位数2単位で'''必修科目'''です。 === 注意事項 === # 目次の項目、本文内容ともに[https://www.shimizushoin.co.jp/info_kyo/rekishisougou/index.html 清水書院『私たちの歴史総合』]【歴総705】に合わせています。 # なお、古代と中世に関しては、当科目では扱っていないので、[[高等学校世界史探究|世界史探究]]と[[高等学校日本史探究|日本史探究]]の学習内容を見てください。 == 第1編 歴史の扉 == === 第1章 歴史と私たち === * [[高等学校歴史総合/日本とスポーツの歴史|日本とスポーツの歴史]]{{進捗|100%|2024-11-22}}(スポーツ史) === 第2章 歴史の特質と資料 === * 8月15日とそれぞれの「終戦」{{進捗|00%|2022-12-18}}(玉音放送) == 第2編 近代化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 結びつく世界と日本 === ==== 18世紀までの世界 ==== * [[高等学校歴史総合/近世の日本と世界|近世の日本と世界]]{{進捗|100%|2024-11-23}}(日本の「鎖国」と東アジアの交易、近世東アジアの国際秩序) * [[高等学校歴史総合/18世紀の中国とアジア貿易|18世紀の中国とアジア貿易]]{{進捗|00%|2023-02-12}}(清の繁栄、清と近隣諸国とのつながり) * [[高等学校歴史総合/18世紀のイギリス・アジア・アフリカ|18世紀のイギリス・アジア・アフリカ]]{{進捗|00%|2023-02-12}}(ヨーロッパの世界進出と大西洋三角貿易、世界経済の覇権を握ったイギリス) * もっと知りたい 海を渡った日本産陶磁器{{進捗|00%|2023-12-24}}(陶磁器の歴史) * もっと知りたい 琉球と蝦夷地{{進捗|00%|2022-12-25}}(琉球王国、蝦夷地) ==== 工業化と世界市場の形成 ==== * 産業革命による経済発展と社会の変化{{進捗|00%|2022-11-25}}(産業革命、資本主義社会) * 世界市場の形成とイギリスによるアジア進出{{進捗|00%|2023-02-25}}(イギリスによる世界市場の形成、イギリスのアジア進出 ) * 日本の開国とその影響{{進捗|00%|2022-11-21}}(日本の開国・開港、交通革命の進展と東アジア) * 歴史のなかの16歳 工女と工場法{{進捗|00%|2022-12-25}}(工場法など) * [[高等学校歴史総合/もっと知りたい 産業革命とブラスバンド|もっと知りたい 産業革命とブラスバンド]]{{進捗|100%|2024-11-23}}(金管楽器の歴史) === 第3章 国民国家と明治維新 === ==== 国民国家と立憲体制 ==== * 二つの市民革命と近代民主主義社会の成立{{進捗|00%|2022-11-22}}(アメリカ独立革命、フランス革命、ナポレオン) * 国民統合とナショナリズム{{進捗|00%|2022-11-23}}(19世紀前半のヨーロッパ諸国、ドイツ統一、南北戦争など) * 明治維新期の日本と世界{{進捗|100%|2023-02-19}}(明治新政府の成立、近代化と東アジア) * 近代国家への移行と憲法の制定{{進捗|00%|2022-11-24}}(大日本帝国憲法、条約改正の実現) * もっと知りたい 国境の過去・現在・未来{{進捗|00%|2022-12-26}}(近代国家と領土画定など) * もっと知りたい 女王と天皇 理想の家族{{進捗|00%|2022-02-12}}(近代の天皇史) ==== 帝国主義とアジア・アフリカの変容 ==== * 列強による帝国主義{{進捗|00%|2023-02-17}}(第2次産業革命と帝国主義、欧米諸国の帝国主義政策) * 帝国主義がアジア・アフリカにもたらしたもの{{進捗|00%|2023-02-18}}(列強のアフリカ分割、西アジア諸国の改革など) * 日清戦争とその影響{{進捗|00%|2023-02-15}}(日清戦争、東アジアの構造変動) * 日露戦争{{進捗|00%|2022-11-22}}(義和団事件、日露戦争、朝鮮の植民地化、辛亥革命) * もっと知りたい 近代の博覧会{{進捗|00%|2022-12-24}}(万国博覧会の歴史) * [[高等学校歴史総合/もっと知りたい ペストと感染症|もっと知りたい ペストと感染症]]{{進捗|75%|2024-11-24}}(近代におけるペストの流行ほか) === 第4章 近代化と現代的な諸課題 === * 鉄道建設{{進捗|00%|2023-03-02}} == 第3編 国際秩序の変化や大衆化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 第一次世界大戦と大衆社会 === ==== 第一次世界大戦と国際社会 ==== * [[高等学校歴史総合/第一次世界大戦|第一次世界大戦]]{{進捗|100%|2024-11-25}}(第一次世界大戦) * [[高等学校歴史総合/社会主義革命|社会主義革命]]{{進捗|00%|2022-12-30}}(ロシア革命、コミンテルン、ソビエト社会主義共和国連邦) * [[高等学校歴史総合/国際協調体制|国際協調体制]]{{進捗|100%|2024-11-23}}(ヴェルサイユ体制とワシントン体制、国際協調の高まり) * アジアの民族運動{{進捗|00%|2023-01-27}}(アジアの経済成長、東アジアの民族運動、インド・東南アジア・西アジアの民族運動) * もっと知りたい ユダヤ人のパレスチナ移住とパレスチナ分割{{進捗|00%|2022-12-30}}(パレスチナの歴史、シオニズム運動) * もっと知りたい 浅川巧 朝鮮の人々とともに生きた日本人{{進捗|00%|2022-12-30}}(浅川兄弟) ==== 1920年代の世界と大衆の時代の到来 ==== * 大衆の政治参加{{進捗|00%|2023-01-08}}(世界史上の民衆運動、大正デモクラシーと大衆の政治参加) * 女性の社会参加{{進捗|00%|2023-02-23}}(女性の社会進出、日本の大正期の女性) * [[高等学校歴史総合/大衆社会の形成|大衆社会の形成]]{{進捗|25%|2024-11-25}}(大衆社会の出現、1920年代のアメリカ、日本の大衆社会) * もっと知りたい 映画と「大衆化」{{進捗|00%|2022-12-28}}(映画の歴史) * もっと知りたい オリンピックの歩み{{進捗|00%|2022-12-28}}(オリンピックの歴史) === 第3章 経済危機と第二次世界大戦 === ==== 国際協調の挫折と2度目の世界大戦 ==== * 世界恐慌{{進捗|00%|2022-11-24}}(昭和恐慌、ブロック経済圏) * ファシズムの台頭{{進捗|00%|2022-12-31}}(ファシズム、ナチ党の政権掌握) * 日本の大陸進出{{進捗|00%|2022-12-08}}(満州事変、日中戦争) * 第二次世界大戦{{進捗|00%|2022-11-16}}(ドイツの拡大、第二次世界大戦、大量殺戮と民衆の抵抗) * もっと知りたい リンゲルブルム・アーカイヴと『アンネの日記』{{進捗|00%|2022-12-25}}(アンネ・フランク) * 歴史のなかの16歳 満蒙開拓青少年義勇軍{{進捗|100%|2022-11-21}}(満州農業移民、満蒙開拓青少年義勇軍、「鍬の戦士」) ==== 世界大戦がもたらしたもの ==== * アジア太平洋戦争{{進捗|100%|2023-01-29}}(日米交渉の挫折と開戦、日本のアジア支配、戦争の被害と加害) * 戦争が変えた人々のくらし{{進捗|00%|2023-02-19}}(マス・メディアの普及と情報や生活の画一化、国民の組織化と戦時動員ほか) * 戦後世界の新たな枠組み{{進捗|00%|2023-01-29}}(戦後構想と大戦の終結、冷戦の開始とドイツの分断、国際連合の成立) * 敗戦後の日本とアジア{{進捗|00%|2023-02-19}}(日本の戦後改革、大衆は敗戦をどう生きたか、冷戦と日本の独立) * 冷戦下の東アジア{{進捗|00%|2023-02-19}}(戦後の中国、朝鮮半島の南北分断、現代の朝鮮半島と台湾) * もっと知りたい 戦争を「記憶」するということ{{進捗|00%|2022-12-24}}(明日の神話ほか) * もっと知りたい 核と原子力エネルギー{{進捗|00%|2023-02-09}}(原子力の平和利用、原子力エネルギーの普及と課題) === 第4章 国際秩序の変化や大衆化と現代的な諸課題 === * ナショナリズム{{進捗|00%|2022-03-08}}[発展講義] == 第4編 グローバル化と私たち == === 第1章 生活や社会の変化を読み取ってみよう(未記述) === === 第2章 冷戦と世界経済 === ==== 冷戦と国際政治 ==== * 脱植民地化とアジア・アフリカ諸国{{進捗|00%|2023-01-25}}(アジア・アフリカ諸国の独立、第三世界の形成と連帯) * 冷戦下の地域紛争{{進捗|00%|2023-01-26}}(ベトナム戦争、中東戦争) * 先進国の政治と社会運動{{進捗|00%|2023-01-29}}(西側諸国と福祉国家政策、国境をこえる社会運動) * 核兵器の脅威と核軍縮{{進捗|00%|2023-01-29}}(核拡散と核兵器反対運動、核軍縮の取り組みと課題) ==== 世界経済の拡大と日本 ==== * 西ヨーロッパ・東南アジアの地域連携{{進捗|00%|2022-12-31}}(西ヨーロッパ統合への動き、東南アジア諸国の動き) * 戦後の日本とアジア諸国との関係{{進捗|00%|2023-01-01}}(日本の国連加盟、アジア諸国との国交回復、沖縄の本土復帰) * 高度経済成長{{進捗|00%|2023-01-01}}(日本と西ドイツの経済成長、高度経済成長と人々の生活、成長のもたらした課題) * もっと知りたい グローバリゼーションとストリートダンス{{進捗|00%|2022-12-27}}(ダンスの歴史) * 歴史のなかの16歳 集団就職 「金の卵」たちの時代{{進捗|00%|2023-02-09}}(集団就職列車など) === 第3章 世界秩序の変容と日本 === ==== 市場経済の変容と冷戦の終結 ==== * 石油危機と価値観の転換{{進捗|00%|2023-02-09}}(戦後経済の転換、石油危機と日本、価値観の転換) * アジアの成長{{進捗|00%|2023-02-13}}(アジア諸国の成長、第三世界の多様化、日本の経済大国化) * 冷戦の終結{{進捗|00%|2023-02-12}}(社会主義世界の変容、冷戦の終結とソ連の崩壊、冷戦後の地域紛争と日本) ==== 冷戦終結後の世界 ==== * 民主化の進展と冷戦終結後の日本{{進捗|00%|2022-12-31}}(民主化の進展と課題、日本の政治の展開) * [[高等学校歴史総合/市場開放と経済の自由化|市場開放と経済の自由化]]{{進捗|00%|2022-12-31}}(新自由主義の台頭、経済のグローバル化と新たな国際経済組織) * [[高等学校歴史総合/地域統合の進展と課題|地域統合の進展と課題]]{{進捗|00%|2022-12-31}}(地域統合の拡大、地域統合の課題) * [[高等学校歴史総合/情報通信技術の発達|情報通信技術の発達]]{{進捗|00%|2022-12-30}}(情報通信技術の発達と社会の変化、情報化社会とその課題) * [[高等学校歴史総合/冷戦終結後の紛争と平和への取り組み|冷戦終結後の紛争と平和への取り組み]]{{進捗|00%|2023-01-01}}(冷戦終結後の紛争、紛争の解決と国際社会の役割) * もっと知りたい 災害と私たち{{進捗|00%|2022-11-21}}(阪神淡路大震災、東日本大震災) * もっと知りたい 中東の少数派クルド人{{進捗|00%|2022-12-27}}(国民国家の中の少数派、クルド人問題の展開) === 第4章 現代的な諸課題の形成と展望 === * 移民{{進捗|00%|2023-02-22}}(近代の移民史) == 近現代史関連用語解説・参考 == * 近現代史関連用語解説{{進捗|00%|2023-02-22}} * 途上国から見た国際関係理論{{進捗|00%|2023-03-05}}[発展講義(イマニュエル・ウォーラースティンなど)] [[カテゴリ:歴史|こうとうかつこうれきしそうこう]] [[カテゴリ:高等学校歴史総合|*]] 6ab2q7ulwj4ij3nxz098ofrc8rd1u79 C++/名前空間 0 22529 264150 248378 2024-11-25T00:01:22Z Ef3 694 校閲と推敲と加筆 264150 wikitext text/x-wiki {{Nav}} '''名前空間'''(Namespace)は、C++言語における重要な言語機能の1つです。名前空間は、関連する識別子(変数、関数、クラス、型エイリアスなど)を論理的にグループ化し、名前の衝突を防ぐためのスコープを提供します。 == 基本的な使用方法 == 名前空間は以下のような構文で定義します: :<syntaxhighlight lang=c++> namespace MyNamespace { void print() { std::cout << "Hello from MyNamespace!" << std::endl; } class MyClass { // クラスの定義 }; } </syntaxhighlight> 名前空間内の要素にアクセスするには、スコープ解決演算子(<code>::</code>)を使用します: :<syntaxhighlight lang=c++> MyNamespace::print(); // 関数の呼び出し MyNamespace::MyClass obj; // クラスのインスタンス化 </syntaxhighlight> == 名前空間の特徴 == === 入れ子の名前空間 === 名前空間は入れ子にすることができます: :<syntaxhighlight lang=c++> namespace Outer { namespace Inner { void func() { } } } // C++17以降では入れ子名前空間を以下のように簡潔に書けます namespace Outer::Inner { void another_func() { } } </syntaxhighlight> === using 宣言と using ディレクティブ === 特定の名前空間の要素を現在のスコープに導入する方法として、以下の2つがあります: :<syntaxhighlight lang=c++> // using 宣言 - 特定の要素のみを導入 using std::cout; cout << "Hello"; // std::を省略可能 // using ディレクティブ - 名前空間全体を導入 using namespace std; cout << "Hello"; // std::を省略可能 </syntaxhighlight> === 匿名名前空間 === ファイルスコープの静的変数や関数を定義する現代的な方法として、匿名名前空間があります: :<syntaxhighlight lang=c++> namespace { // この変数はこのファイル内でのみアクセス可能 int fileLocalVariable = 42; } </syntaxhighlight> == ベストプラクティス == * グローバルスコープでの <code>using namespace std;</code> の使用は避ける * 大規模なプロジェクトでは、組織やプロジェクトを表す名前空間を使用する * ヘッダーファイル内での using ディレクティブの使用を避ける * 名前空間は適切な粒度で分割し、関連する要素をグループ化する == 標準ライブラリの名前空間 == C++標準ライブラリは <code>std</code> 名前空間内で定義されています。また、特定の機能は以下のような追加の名前空間で提供されます: * <code>std::ranges</code> - レンジライブラリ (C++20) * <code>std::filesystem</code> - ファイルシステムライブラリ (C++17) * <code>std::chrono</code> - 時間関連の機能 名前空間は、大規模なプロジェクトやライブラリの開発において、コードの整理と名前の衝突防止に不可欠な機能です。適切に使用することで、コードの保守性と再利用性が向上します。 {{Nav}} {{DEFAULTSORT:なまえくうかん}} [[Category:C++]] snpsygdnd73u5nw20qcgrhlg8awz50q C++/クラスの定義や継承 0 22530 264171 263148 2024-11-25T08:54:45Z Ef3 694 Fix markup 264171 wikitext text/x-wiki {{Nav}} == オブジェクト指向 == === オブジェクト指向とクラス === オブジェクト指向プログラミングは、データと手続きを統一的に記述することで、プログラムの構造を理解しやすくする手法です。 クラスは、クラスベースのオブジェクト指向における中心的な概念であり<ref>オブジェクト指向言語には、クラスベースとプロトタイプベースの2種類があります。プロトタイプベースのオブジェクト指向言語には、[[Self]]、[[JavaScript]]、[[Lua]]などがあります。</ref>、多くのプログラミング言語でクラスを定義することができます。C++を除く代表的なクラスベースのオブジェクト指向言語には、[[Java]]、[[Python]]、[[Ruby]]、[[Swift]]、[[Scala]]、[[Kotlin]]などがあります。 クラスベースのオブジェクト指向プログラミングに興味がある場合、学習の難易度が比較的低い動的型付け言語(例えば[[Ruby]])を使って学習を始めるのも良い選択肢です。 {{See also|オブジェクト指向プログラミング}} == クラスの基本 == '''クラス'''(class)とは、データ構造であり、データと関数をメンバーとして持ち、実体(インスタンスと呼ばれる)を生成する際の雛型となります。 === クラスの宣言 === C++でクラスを宣言するには、キーワードclassを用いて次のように記述します。 ;クラス定義の構文: <syntaxhighlight lang=c++ copy> class クラス名 { // 非公開データメンバーと非公開メンバー関数 public: // 公開データメンバーと公開メンバー関数 }; </syntaxhighlight> class内の関数をメンバー関数(しばしばメソッド)と呼び、変数のことをデータメンバー(しばしばメンバー変数)と呼び、総称してメンバーと呼びます。メンバーにはオブジェクトの外からアクセスできない非公開のもの '''private''' と、アクセスできる公開のもの '''public''' があります(継承の説明まで、protected の説明は留保)。classのメンバーはデフォルトで非公開 '''private''' です。 メンバー関数がインライン化できない場合など、クラスの宣言の外にその定義を記述することができます。クラス定義はヘッダーに、メソッドの実装は通常のソースコードに記述します。その場合、メンバー関数の定義は、関数名の前に「クラス名::」を付けます。「::(コロン2文字)」のことをスコープ解決演算子(scope resolution operator)と呼びます。次のように記述します。 :<syntaxhighlight lang=c++ copy> 戻り値の型 クラス名::関数名(仮引数の並び) { // 関数の本体 }; </syntaxhighlight> ; メンバー関数の定義をクラスの宣言の中に書く例 ; Point :<syntaxhighlight lang=c++ copy> #ifndef POINT_H #define POINT_H // Point: 二次元座標上の1点 class Point { int x, y; public: inline int X() const { return x; } // 非破壊的なメソッドは const で修飾します inline int X(int x){ return this->x = x; } inline int Y() const { return y; } // 非破壊的なメソッドは const で修飾します inline int Y(int y){ return this->y = y; } }; #endif </syntaxhighlight> ; メンバー関数の定義をクラスの宣言の外に書く例 ; Point :<syntaxhighlight lang=c++ copy> #ifndef POINT_H #define POINT_H // Point: 二次元座標上の1点 class Point { int x, y; public: int X() const; int X(int); int Y() const; int Y(int); }; #endif </syntaxhighlight> ; Point.cpp :<syntaxhighlight lang=c++ copy> #include "Point" int Point::X() const { return x; } int Point::X(int x) { return this->x = x; } int Point::Y() const { return y; } int Point::Y(int y) { return this->y = y; } </syntaxhighlight> : 上の例では、メンバー関数 X(), X(int), Y() と Y(int) を持ち、x と y という int データを持つクラスを定義しています(二次元座標上の2点を表すことを意図しています)。クラスのメンバーはデフォルトで private です。X() は x の内容を取得するメソッドで、X(int) は x を設定するメソッドです。これらは、x が private であるために必要なものです。このような隠蔽されたメンバーへのアクセス手段を提供するメソッドを、アクセサー(ゲッター・セッター)と呼びます<ref>プログラミングにおいて、ミューテーターメソッドは、変数の変更を制御するために使用されるメソッドです。セッターはしばしばゲッターを伴い(共にアクセッサーとも呼ばれる)、プライベートメンバ変数の値を返す。</ref>。 X()では、メソッド呼出しを行ったオブジェクトへのポインターを表す '''this''' が使われています(X() のように単に x とすると仮引数の x にシャドーイングされます)。this はポインターなので、参照には <code>-></code> を使用します。<code>int Point::X() const { return x; }</code>を、<code>int Point::X() const { return this->x; }</code>と書くこともできます。 === オブジェクトの生成 === オブジェクトの生成(インスタンス化)は次のように記述します。 :<syntaxhighlight lang=c++ copy> クラス名 オブジェクト名; </syntaxhighlight> : 複数のオブジェクトを生成する場合は、<code>,</code>(コンマ)で区切ります。この構文は <code>型名 変数名;</code>そのもので、クラスはユーザー定義型、オブジェクトはクラス型の変数です。 ;Pointクラスのオブジェクトpt, p2を生成する例:<syntaxhighlight lang=c++ copy> Point pt, p2; </syntaxhighlight> === メンバーへのアクセス === メンバーにアクセスするには、ドット(.)演算子を用いて次のように記述します。 :<syntaxhighlight lang=c++ copy> オブジェクト名.メンバー名 </syntaxhighlight> ;ptのXメンバー関数を呼び出す例:<syntaxhighlight lang=c++ copy> pt.X(1234); </syntaxhighlight> === オブジェクトのコピー === オブジェクトのコピーは、既存のオブジェクトから新しいオブジェクトを生成するプロセスです。C++において、オブジェクトのコピーには主に二つの方法があります:コピーコンストラクタと代入演算子です。 ==== コピーコンストラクタ ==== コピーコンストラクタは、既存のオブジェクトを引数として受け取り、新しいオブジェクトを初期化する特別なコンストラクタです。コピーコンストラクタは次のように定義されます。 ; コピーコンストラクタの構文: <syntaxhighlight lang=c++ copy> クラス名(const クラス名& obj); </syntaxhighlight> 以下は、<code>Point</code> クラスのコピーコンストラクタの例です。 :<syntaxhighlight lang=c++ copy> class Point { int x, y; public: Point(int x, int y) : x(x), y(y) {} // コンストラクタ Point(const Point& p) : x(p.x), y(p.y) { // コピーコンストラクタ // xとyをコピー } }; </syntaxhighlight> この例では、<code>Point</code> クラスのコピーコンストラクタは、既存の <code>Point</code> オブジェクトの <code>x</code> と <code>y</code> の値を新しいオブジェクトにコピーします。 ==== 代入演算子 ==== 代入演算子は、既存のオブジェクトに別のオブジェクトの値を代入するための特別なメソッドです。代入演算子は次のように定義されます。 ; 代入演算子の構文: <syntaxhighlight lang=c++ copy> クラス名& operator=(const クラス名& obj); </syntaxhighlight> 以下は、<code>Point</code> クラスの代入演算子の例です。 :<syntaxhighlight lang=c++ copy> Point& Point::operator=(const Point& p) { if (this != &p) { // 自己代入のチェック x = p.x; // xをコピー y = p.y; // yをコピー } return *this; // 自分自身を返す } </syntaxhighlight> この例では、<code>Point</code> クラスの代入演算子は、自己代入をチェックした上で、既存のオブジェクトの <code>x</code> と <code>y</code> の値を引数の <code>Point</code> オブジェクトからコピーします。代入演算子は、オブジェクト自身を返すことで、連鎖代入(例:<code>a = b = c;</code>)を可能にします。 ==== 注意点 ==== コピーコンストラクタや代入演算子をカスタマイズする際は、以下の点に注意する必要があります。 # '''自己代入のチェック''': 代入演算子において、自己代入をチェックすることで、不正なメモリアクセスを防ぎます。 # '''深いコピー''': オブジェクトが動的に割り当てられたメモリを持つ場合、コピーコンストラクタや代入演算子で深いコピーを行う必要があります。単純な代入では、元のオブジェクトとコピー先オブジェクトが同じメモリを指してしまうためです。 このように、C++におけるオブジェクトのコピーは、特にクラスがリソースを管理する際に重要な概念です。適切なコピーコンストラクタと代入演算子の実装は、プログラムの安全性と安定性を向上させることができます。 == クラスの詳細 == === オブジェクト指向の基本概念 === C++のクラスは以下の主要な概念に基づいています: * '''カプセル化''': データと操作をまとめ、適切なアクセス制御を提供 * '''ポリモーフィズム''': 同じインターフェースで異なる実装を可能にする * '''継承''': 既存のクラスの機能を拡張または特化する * '''抽象化''': 実装の詳細を隠蔽し、使用者に必要なインターフェースのみを提供 === カプセル化 === '''カプセル化'''は、クラスの内部データを外部から直接操作されることを防ぎ、代わりにメソッドを通じてデータを操作する設計手法です。 ==== アクセス制御 ==== C++では、以下のアクセス指定子を提供しています: * <code>private</code>: 同じクラス内からのみアクセス可能 * <code>public</code>: どこからでもアクセス可能 * <code>protected</code>: 同じクラスおよび派生クラスからアクセス可能 ==== カプセル化の例 ==== :<syntaxhighlight lang=c++ copy> class Point { private: int x, y; // メンバー変数はprivate public: // ゲッター・セッター [[nodiscard]] int x() const { return x; } void setX(int value) { x = value; } [[nodiscard]] int y() const { return y; } void setY(int value) { y = value; } }; </syntaxhighlight> === ポリモーフィズム === C++では、以下の形式でポリモーフィズムを実現できます: * '''コンパイル時ポリモーフィズム''' ** 関数オーバーロード ** 演算子オーバーロード ** テンプレート * '''実行時ポリモーフィズム''' ** 仮想関数 ** 純粋仮想関数 ==== 関数オーバーロードの例 ==== :<syntaxhighlight lang=c++ copy> class Calculator { public: int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } int add(int a, int b, int c) { return a + b + c; } }; </syntaxhighlight> === コンストラクタとデストラクタ === ==== コンストラクタの種類 ==== * '''デフォルトコンストラクタ''': 引数を取らないコンストラクタ * '''コピーコンストラクタ''': 同じ型のオブジェクトから新しいオブジェクトを作成 * '''ムーブコンストラクタ''' (C++11以降): リソースの所有権を移動 * '''委譲コンストラクタ''' (C++11以降): 他のコンストラクタに初期化を委譲 ==== 例 ==== :<syntaxhighlight lang=c++ copy> class Point { int x, y; public: // デフォルトコンストラクタ Point() : x(0), y(0) {} // 通常のコンストラクタ Point(int x, int y) : x(x), y(y) {} // コピーコンストラクタ Point(const Point& other) : x(other.x), y(other.y) {} // ムーブコンストラクタ Point(Point&& other) noexcept : x(other.x), y(other.y) { other.x = 0; other.y = 0; } // デストラクタ ~Point() = default; }; </syntaxhighlight> === メモリー管理 === ==== スマートポインタ ==== C++11以降では、手動のメモリー管理よりもスマートポインタの使用が推奨されます: * <code>std::unique_ptr</code>: 単一の所有権を持つポインタ * <code>std::shared_ptr</code>: 共有所有権を持つポインタ * <code>std::weak_ptr</code>: <code>shared_ptr</code>への弱参照 :<syntaxhighlight lang=c++ copy> #include <memory> class Resource { // リソースの定義 }; void example() { auto ptr = std::make_unique<Resource>(); // 推奨される生成方法 auto shared = std::make_shared<Resource>(); } </syntaxhighlight> === 継承 === ==== 継承の種類 ==== * '''public継承''': インターフェースとインプリメンテーションを継承 * '''protected継承''': インプリメンテーションの継承 * '''private継承''': 実装の詳細として継承を使用 ==== final指定子 ==== C++11以降では、<code>final</code>キーワードを使用して継承やオーバーライドを禁止できます: :<syntaxhighlight lang=c++ copy> class Base { virtual void foo() = 0; }; class Derived final : public Base { // これ以上の継承を禁止 void foo() override final { } // オーバーライドを禁止 }; </syntaxhighlight> ==== 仮想関数と純粋仮想関数 ==== * '''仮想関数''': 派生クラスでオーバーライド可能な関数 * '''純粋仮想関数''': 実装を持たず、派生クラスでの実装を強制する関数 :<syntaxhighlight lang=c++ copy> class Shape { public: virtual ~Shape() = default; virtual double area() const = 0; // 純粋仮想関数 virtual void draw() { /* デフォルト実装 */ } // 通常の仮想関数 }; </syntaxhighlight> === モダンC++の機能 === ==== override指定子 ==== C++11以降では、<code>override</code>キーワードを使用して仮想関数のオーバーライドを明示できます: :<syntaxhighlight lang=c++ copy> class Derived : public Base { void foo() override { } // Base::fooをオーバーライド }; </syntaxhighlight> ==== default/delete指定子 ==== 特殊メンバ関数の自動生成を制御できます: :<syntaxhighlight lang=c++ copy> class NonCopyable { public: NonCopyable() = default; // デフォルト実装を使用 NonCopyable(const NonCopyable&) = delete; // コピーを禁止 NonCopyable& operator=(const NonCopyable&) = delete; }; </syntaxhighlight> == クラス・構造体・共用体の比較 == {{Main|C++/構造体・共用体}} === クラスと構造体の比較 === クラスと構造体の違いは、主にデフォルトのメンバーのアクセス指定子にあります。クラスでは、デフォルトのメンバーのアクセス指定子が<code>private</code>であり、外部からのアクセスが制限されます。一方、構造体では、デフォルトのメンバーのアクセス指定子が<code>public</code>であり、外部からのアクセスが可能です。 この違いは、クラスと構造体が異なる用途で使われる理由の1つです。クラスはオブジェクト指向プログラミングの概念に基づき、データとそのデータを操作するメンバー関数を一体化するために使用されます。そのため、データの隠蔽(カプセル化)が重要視され、デフォルトで<code>private</code>となるのが標準です。一方、構造体は関連するデータをグループ化するために使われ、アクセスの容易さが求められる場面で有用です。 === クラスと共用体の比較 === 共用体(<code>union</code>)には以下の制限があります。 * 継承することも、継承されることもできません。 * メンバーとして<code>static</code>を指定することはできません。 * コンストラクタやデストラクタを持つことは可能ですが、コンストラクタ・デストラクタを持つオブジェクトをメンバーに含めることはできません。 * 仮想メンバー関数を持つことはできません。 これらの制限により、共用体は主に異なる型のデータを同じメモリ領域で扱うような特殊な用途に適しています。 C++で共用体(<code>union</code>)の代替として使われる技術には、主に以下のものがあります。 ==== <code>std::variant</code> ==== <code>std::variant</code>はC++17で導入された型で、異なる型のオブジェクトを安全に格納し、動的にどの型がアクティブであるかを追跡できます。共用体とは異なり、<code>std::variant</code>は型安全で、どの型が有効かを容易に判定できるため、バグを防ぐのに役立ちます。 :<syntaxhighlight lang=c++> #include <variant> #include <iostream> auto main() -> int { std::variant<int, float, std::string> data; data = 10; std::cout << std::get<int>(data) << std::endl; data = "Hello"; std::cout << std::get<std::string>(data) << std::endl; return 0; } </syntaxhighlight> <code>std::variant</code>は共用体のように複数の型を1つのメモリ領域に格納しますが、型の追跡機能と安全なアクセスを提供します。 ==== <code>std::any</code> ==== <code>std::any</code>はC++17で追加された型で、任意の型の値を格納でき、<code>std::variant</code>よりも柔軟ですが、型情報が保持されていないため、アクセス時には型チェックが必要です。 :<syntaxhighlight lang=c++> #include <any> #include <iostream> auto main() -> int { std::any data = 5; if (data.type() == typeid(int)) { std::cout << std::any_cast<int>(data) << std::endl; } data = 3.14; if (data.type() == typeid(double)) { std::cout << std::any_cast<double>(data) << std::endl; } return 0; } </syntaxhighlight> <code>std::any</code>は、型情報を動的に保持してキャストする必要があるため、<code>std::variant</code>に比べて少し複雑です。 ==== クラス階層とポリモーフィズム ==== クラス階層とポリモーフィズムを利用して、動的に異なる型のオブジェクトを格納する方法もあります。これは、継承と仮想関数を用いた設計に基づいており、ポインタやスマートポインタを使って型を動的に扱うことができます。 :<syntaxhighlight lang=c++> #include <iostream> #include <memory> class Base { public: virtual void print() const = 0; virtual ~Base() = default; }; class Derived1 : public Base { public: void print() const override { std::cout << "Derived1" << std::endl; } }; class Derived2 : public Base { public: void print() const override { std::cout << "Derived2" << std::endl; } }; auto main() -> int { std::unique_ptr<Base> obj = std::make_unique<Derived1>(); obj->print(); // Outputs "Derived1" obj = std::make_unique<Derived2>(); obj->print(); // Outputs "Derived2" return 0; } </syntaxhighlight> この方法は、動的な型の選択と多様な動作を必要とする場合に有効です。 ==== まとめ ==== * '''<code>std::variant</code>''': 型安全で共用体の代替として非常に適している。 * '''<code>std::any</code>''': 柔軟だが、使用時の型チェックが必要。 * '''クラス階層とポリモーフィズム''': より複雑な型の使用や動的な動作を求める場合に適している。 これらの代替技術は、共用体の持つ制約を超え、型安全性や柔軟性を高めることができます。 {{Nav}} == 脚註 == <references/> [[Category:C++|くらすのていきやけいしよう]] n9sb2fjyrl3il0gwo9mat6r6pvp5agc 264172 264171 2024-11-25T09:15:20Z Ef3 694 /* default/delete指定子 */ C++のdefaultとdelete指定子はC++11から導入されました。 これらの指定子は特殊メンバ関数の自動生成を明示的に制御するために追加されました /*explicit指定子*/ explicit キーワードは、C++の規格において C++ 98 から導入されました。このバージョンから、コンストラクタや変換演算子に対して暗黙の型変換を禁止するために使用できるようになりました。 264172 wikitext text/x-wiki {{Nav}} == オブジェクト指向 == === オブジェクト指向とクラス === オブジェクト指向プログラミングは、データと手続きを統一的に記述することで、プログラムの構造を理解しやすくする手法です。 クラスは、クラスベースのオブジェクト指向における中心的な概念であり<ref>オブジェクト指向言語には、クラスベースとプロトタイプベースの2種類があります。プロトタイプベースのオブジェクト指向言語には、[[Self]]、[[JavaScript]]、[[Lua]]などがあります。</ref>、多くのプログラミング言語でクラスを定義することができます。C++を除く代表的なクラスベースのオブジェクト指向言語には、[[Java]]、[[Python]]、[[Ruby]]、[[Swift]]、[[Scala]]、[[Kotlin]]などがあります。 クラスベースのオブジェクト指向プログラミングに興味がある場合、学習の難易度が比較的低い動的型付け言語(例えば[[Ruby]])を使って学習を始めるのも良い選択肢です。 {{See also|オブジェクト指向プログラミング}} == クラスの基本 == '''クラス'''(class)とは、データ構造であり、データと関数をメンバーとして持ち、実体(インスタンスと呼ばれる)を生成する際の雛型となります。 === クラスの宣言 === C++でクラスを宣言するには、キーワードclassを用いて次のように記述します。 ;クラス定義の構文: <syntaxhighlight lang=c++ copy> class クラス名 { // 非公開データメンバーと非公開メンバー関数 public: // 公開データメンバーと公開メンバー関数 }; </syntaxhighlight> class内の関数をメンバー関数(しばしばメソッド)と呼び、変数のことをデータメンバー(しばしばメンバー変数)と呼び、総称してメンバーと呼びます。メンバーにはオブジェクトの外からアクセスできない非公開のもの '''private''' と、アクセスできる公開のもの '''public''' があります(継承の説明まで、protected の説明は留保)。classのメンバーはデフォルトで非公開 '''private''' です。 メンバー関数がインライン化できない場合など、クラスの宣言の外にその定義を記述することができます。クラス定義はヘッダーに、メソッドの実装は通常のソースコードに記述します。その場合、メンバー関数の定義は、関数名の前に「クラス名::」を付けます。「::(コロン2文字)」のことをスコープ解決演算子(scope resolution operator)と呼びます。次のように記述します。 :<syntaxhighlight lang=c++ copy> 戻り値の型 クラス名::関数名(仮引数の並び) { // 関数の本体 }; </syntaxhighlight> ; メンバー関数の定義をクラスの宣言の中に書く例 ; Point :<syntaxhighlight lang=c++ copy> #ifndef POINT_H #define POINT_H // Point: 二次元座標上の1点 class Point { int x, y; public: inline int X() const { return x; } // 非破壊的なメソッドは const で修飾します inline int X(int x){ return this->x = x; } inline int Y() const { return y; } // 非破壊的なメソッドは const で修飾します inline int Y(int y){ return this->y = y; } }; #endif </syntaxhighlight> ; メンバー関数の定義をクラスの宣言の外に書く例 ; Point :<syntaxhighlight lang=c++ copy> #ifndef POINT_H #define POINT_H // Point: 二次元座標上の1点 class Point { int x, y; public: int X() const; int X(int); int Y() const; int Y(int); }; #endif </syntaxhighlight> ; Point.cpp :<syntaxhighlight lang=c++ copy> #include "Point" int Point::X() const { return x; } int Point::X(int x) { return this->x = x; } int Point::Y() const { return y; } int Point::Y(int y) { return this->y = y; } </syntaxhighlight> : 上の例では、メンバー関数 X(), X(int), Y() と Y(int) を持ち、x と y という int データを持つクラスを定義しています(二次元座標上の2点を表すことを意図しています)。クラスのメンバーはデフォルトで private です。X() は x の内容を取得するメソッドで、X(int) は x を設定するメソッドです。これらは、x が private であるために必要なものです。このような隠蔽されたメンバーへのアクセス手段を提供するメソッドを、アクセサー(ゲッター・セッター)と呼びます<ref>プログラミングにおいて、ミューテーターメソッドは、変数の変更を制御するために使用されるメソッドです。セッターはしばしばゲッターを伴い(共にアクセッサーとも呼ばれる)、プライベートメンバ変数の値を返す。</ref>。 X()では、メソッド呼出しを行ったオブジェクトへのポインターを表す '''this''' が使われています(X() のように単に x とすると仮引数の x にシャドーイングされます)。this はポインターなので、参照には <code>-></code> を使用します。<code>int Point::X() const { return x; }</code>を、<code>int Point::X() const { return this->x; }</code>と書くこともできます。 === オブジェクトの生成 === オブジェクトの生成(インスタンス化)は次のように記述します。 :<syntaxhighlight lang=c++ copy> クラス名 オブジェクト名; </syntaxhighlight> : 複数のオブジェクトを生成する場合は、<code>,</code>(コンマ)で区切ります。この構文は <code>型名 変数名;</code>そのもので、クラスはユーザー定義型、オブジェクトはクラス型の変数です。 ;Pointクラスのオブジェクトpt, p2を生成する例:<syntaxhighlight lang=c++ copy> Point pt, p2; </syntaxhighlight> === メンバーへのアクセス === メンバーにアクセスするには、ドット(.)演算子を用いて次のように記述します。 :<syntaxhighlight lang=c++ copy> オブジェクト名.メンバー名 </syntaxhighlight> ;ptのXメンバー関数を呼び出す例:<syntaxhighlight lang=c++ copy> pt.X(1234); </syntaxhighlight> === オブジェクトのコピー === オブジェクトのコピーは、既存のオブジェクトから新しいオブジェクトを生成するプロセスです。C++において、オブジェクトのコピーには主に二つの方法があります:コピーコンストラクタと代入演算子です。 ==== コピーコンストラクタ ==== コピーコンストラクタは、既存のオブジェクトを引数として受け取り、新しいオブジェクトを初期化する特別なコンストラクタです。コピーコンストラクタは次のように定義されます。 ; コピーコンストラクタの構文: <syntaxhighlight lang=c++ copy> クラス名(const クラス名& obj); </syntaxhighlight> 以下は、<code>Point</code> クラスのコピーコンストラクタの例です。 :<syntaxhighlight lang=c++ copy> class Point { int x, y; public: Point(int x, int y) : x(x), y(y) {} // コンストラクタ Point(const Point& p) : x(p.x), y(p.y) { // コピーコンストラクタ // xとyをコピー } }; </syntaxhighlight> この例では、<code>Point</code> クラスのコピーコンストラクタは、既存の <code>Point</code> オブジェクトの <code>x</code> と <code>y</code> の値を新しいオブジェクトにコピーします。 ==== 代入演算子 ==== 代入演算子は、既存のオブジェクトに別のオブジェクトの値を代入するための特別なメソッドです。代入演算子は次のように定義されます。 ; 代入演算子の構文: <syntaxhighlight lang=c++ copy> クラス名& operator=(const クラス名& obj); </syntaxhighlight> 以下は、<code>Point</code> クラスの代入演算子の例です。 :<syntaxhighlight lang=c++ copy> Point& Point::operator=(const Point& p) { if (this != &p) { // 自己代入のチェック x = p.x; // xをコピー y = p.y; // yをコピー } return *this; // 自分自身を返す } </syntaxhighlight> この例では、<code>Point</code> クラスの代入演算子は、自己代入をチェックした上で、既存のオブジェクトの <code>x</code> と <code>y</code> の値を引数の <code>Point</code> オブジェクトからコピーします。代入演算子は、オブジェクト自身を返すことで、連鎖代入(例:<code>a = b = c;</code>)を可能にします。 ==== 注意点 ==== コピーコンストラクタや代入演算子をカスタマイズする際は、以下の点に注意する必要があります。 # '''自己代入のチェック''': 代入演算子において、自己代入をチェックすることで、不正なメモリアクセスを防ぎます。 # '''深いコピー''': オブジェクトが動的に割り当てられたメモリを持つ場合、コピーコンストラクタや代入演算子で深いコピーを行う必要があります。単純な代入では、元のオブジェクトとコピー先オブジェクトが同じメモリを指してしまうためです。 このように、C++におけるオブジェクトのコピーは、特にクラスがリソースを管理する際に重要な概念です。適切なコピーコンストラクタと代入演算子の実装は、プログラムの安全性と安定性を向上させることができます。 == クラスの詳細 == === オブジェクト指向の基本概念 === C++のクラスは以下の主要な概念に基づいています: * '''カプセル化''': データと操作をまとめ、適切なアクセス制御を提供 * '''ポリモーフィズム''': 同じインターフェースで異なる実装を可能にする * '''継承''': 既存のクラスの機能を拡張または特化する * '''抽象化''': 実装の詳細を隠蔽し、使用者に必要なインターフェースのみを提供 === カプセル化 === '''カプセル化'''は、クラスの内部データを外部から直接操作されることを防ぎ、代わりにメソッドを通じてデータを操作する設計手法です。 ==== アクセス制御 ==== C++では、以下のアクセス指定子を提供しています: * <code>private</code>: 同じクラス内からのみアクセス可能 * <code>public</code>: どこからでもアクセス可能 * <code>protected</code>: 同じクラスおよび派生クラスからアクセス可能 ==== カプセル化の例 ==== :<syntaxhighlight lang=c++ copy> class Point { private: int x, y; // メンバー変数はprivate public: // ゲッター・セッター [[nodiscard]] int x() const { return x; } void setX(int value) { x = value; } [[nodiscard]] int y() const { return y; } void setY(int value) { y = value; } }; </syntaxhighlight> === ポリモーフィズム === C++では、以下の形式でポリモーフィズムを実現できます: * '''コンパイル時ポリモーフィズム''' ** 関数オーバーロード ** 演算子オーバーロード ** テンプレート * '''実行時ポリモーフィズム''' ** 仮想関数 ** 純粋仮想関数 ==== 関数オーバーロードの例 ==== :<syntaxhighlight lang=c++ copy> class Calculator { public: int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } int add(int a, int b, int c) { return a + b + c; } }; </syntaxhighlight> === コンストラクタとデストラクタ === ==== コンストラクタの種類 ==== * '''デフォルトコンストラクタ''': 引数を取らないコンストラクタ * '''コピーコンストラクタ''': 同じ型のオブジェクトから新しいオブジェクトを作成 * '''ムーブコンストラクタ''' (C++11以降): リソースの所有権を移動 * '''委譲コンストラクタ''' (C++11以降): 他のコンストラクタに初期化を委譲 ==== 例 ==== :<syntaxhighlight lang=c++ copy> class Point { int x, y; public: // デフォルトコンストラクタ Point() : x(0), y(0) {} // 通常のコンストラクタ Point(int x, int y) : x(x), y(y) {} // コピーコンストラクタ Point(const Point& other) : x(other.x), y(other.y) {} // ムーブコンストラクタ Point(Point&& other) noexcept : x(other.x), y(other.y) { other.x = 0; other.y = 0; } // デストラクタ ~Point() = default; }; </syntaxhighlight> === メモリー管理 === ==== スマートポインタ ==== C++11以降では、手動のメモリー管理よりもスマートポインタの使用が推奨されます: * <code>std::unique_ptr</code>: 単一の所有権を持つポインタ * <code>std::shared_ptr</code>: 共有所有権を持つポインタ * <code>std::weak_ptr</code>: <code>shared_ptr</code>への弱参照 :<syntaxhighlight lang=c++ copy> #include <memory> class Resource { // リソースの定義 }; void example() { auto ptr = std::make_unique<Resource>(); // 推奨される生成方法 auto shared = std::make_shared<Resource>(); } </syntaxhighlight> === 継承 === ==== 継承の種類 ==== * '''public継承''': インターフェースとインプリメンテーションを継承 * '''protected継承''': インプリメンテーションの継承 * '''private継承''': 実装の詳細として継承を使用 ==== final指定子 ==== C++11以降では、<code>final</code>キーワードを使用して継承やオーバーライドを禁止できます: :<syntaxhighlight lang=c++ copy> class Base { virtual void foo() = 0; }; class Derived final : public Base { // これ以上の継承を禁止 void foo() override final { } // オーバーライドを禁止 }; </syntaxhighlight> ==== 仮想関数と純粋仮想関数 ==== * '''仮想関数''': 派生クラスでオーバーライド可能な関数 * '''純粋仮想関数''': 実装を持たず、派生クラスでの実装を強制する関数 :<syntaxhighlight lang=c++ copy> class Shape { public: virtual ~Shape() = default; virtual double area() const = 0; // 純粋仮想関数 virtual void draw() { /* デフォルト実装 */ } // 通常の仮想関数 }; </syntaxhighlight> === モダンC++の機能 === ==== override指定子 ==== C++11以降では、<code>override</code>キーワードを使用して仮想関数のオーバーライドを明示できます: :<syntaxhighlight lang=c++ copy> class Derived : public Base { void foo() override { } // Base::fooをオーバーライド }; </syntaxhighlight> ==== default/delete指定子 ==== C++の<code>default</code>と<code>delete</code>指定子は'''C++11'''から導入されました。 これらの指定子は特殊メンバ関数の自動生成を明示的に制御するために追加されました: :<syntaxhighlight lang=c++ copy> class Example { public: // コンパイラによる自動生成を明示的に要求 Example() = default; // コピーを禁止 Example(const Example&) = delete; Example& operator=(const Example&) = delete; // ムーブを許可 Example(Example&&) = default; Example& operator=(Example&&) = default; }; </syntaxhighlight> 導入の主な目的: * <code>=default</code>:特殊メンバ関数の自動生成を明示的に要求できる * <code>=delete</code>:関数の使用を禁止できる(コピー禁止やある型での関数オーバーロードを防ぐなど) これにより、以前は空の関数定義やprivateセクションでの宣言といった間接的な方法で行っていた制御を、より直接的に表現できるようになりました。 ==== explicit指定子 ==== <code>explicit</code> キーワードは、C++の規格において '''C++ 98''' から導入されました。このバージョンから、コンストラクタや変換演算子に対して暗黙の型変換を禁止するために使用できるようになりました。 当初のexplicitは単項コンストラクタに対してのみ使用可能でした。その後、機能が拡張され: * C++11で変換演算子(conversion operator)にも使用できるようになりました * C++20でコンストラクタに条件付きexplicitを指定できるようになりました(<code>explicit(条件式)</code>の形式) 例えば: :<syntaxhighlight lang=c++ copy> // C++98: 基本的なexplicit使用例 class String { explicit String(int n); // 暗黙の型変換を防ぐ }; // C++11: 変換演算子での使用例 class Number { explicit operator bool() const; // 暗黙のboolへの変換を防ぐ }; // C++20: 条件付きexplicit template<typename T> class Container { explicit(sizeof(T) > 4) Container(int size); // Tのサイズが4より大きい場合のみexplicit }; </syntaxhighlight> これらの機能拡張により、型の安全性をより細かく制御できるようになりました。 == クラス・構造体・共用体の比較 == {{Main|C++/構造体・共用体}} === クラスと構造体の比較 === クラスと構造体の違いは、主にデフォルトのメンバーのアクセス指定子にあります。クラスでは、デフォルトのメンバーのアクセス指定子が<code>private</code>であり、外部からのアクセスが制限されます。一方、構造体では、デフォルトのメンバーのアクセス指定子が<code>public</code>であり、外部からのアクセスが可能です。 この違いは、クラスと構造体が異なる用途で使われる理由の1つです。クラスはオブジェクト指向プログラミングの概念に基づき、データとそのデータを操作するメンバー関数を一体化するために使用されます。そのため、データの隠蔽(カプセル化)が重要視され、デフォルトで<code>private</code>となるのが標準です。一方、構造体は関連するデータをグループ化するために使われ、アクセスの容易さが求められる場面で有用です。 === クラスと共用体の比較 === 共用体(<code>union</code>)には以下の制限があります。 * 継承することも、継承されることもできません。 * メンバーとして<code>static</code>を指定することはできません。 * コンストラクタやデストラクタを持つことは可能ですが、コンストラクタ・デストラクタを持つオブジェクトをメンバーに含めることはできません。 * 仮想メンバー関数を持つことはできません。 これらの制限により、共用体は主に異なる型のデータを同じメモリ領域で扱うような特殊な用途に適しています。 C++で共用体(<code>union</code>)の代替として使われる技術には、主に以下のものがあります。 ==== <code>std::variant</code> ==== <code>std::variant</code>はC++17で導入された型で、異なる型のオブジェクトを安全に格納し、動的にどの型がアクティブであるかを追跡できます。共用体とは異なり、<code>std::variant</code>は型安全で、どの型が有効かを容易に判定できるため、バグを防ぐのに役立ちます。 :<syntaxhighlight lang=c++> #include <variant> #include <iostream> auto main() -> int { std::variant<int, float, std::string> data; data = 10; std::cout << std::get<int>(data) << std::endl; data = "Hello"; std::cout << std::get<std::string>(data) << std::endl; return 0; } </syntaxhighlight> <code>std::variant</code>は共用体のように複数の型を1つのメモリ領域に格納しますが、型の追跡機能と安全なアクセスを提供します。 ==== <code>std::any</code> ==== <code>std::any</code>はC++17で追加された型で、任意の型の値を格納でき、<code>std::variant</code>よりも柔軟ですが、型情報が保持されていないため、アクセス時には型チェックが必要です。 :<syntaxhighlight lang=c++> #include <any> #include <iostream> auto main() -> int { std::any data = 5; if (data.type() == typeid(int)) { std::cout << std::any_cast<int>(data) << std::endl; } data = 3.14; if (data.type() == typeid(double)) { std::cout << std::any_cast<double>(data) << std::endl; } return 0; } </syntaxhighlight> <code>std::any</code>は、型情報を動的に保持してキャストする必要があるため、<code>std::variant</code>に比べて少し複雑です。 ==== クラス階層とポリモーフィズム ==== クラス階層とポリモーフィズムを利用して、動的に異なる型のオブジェクトを格納する方法もあります。これは、継承と仮想関数を用いた設計に基づいており、ポインタやスマートポインタを使って型を動的に扱うことができます。 :<syntaxhighlight lang=c++> #include <iostream> #include <memory> class Base { public: virtual void print() const = 0; virtual ~Base() = default; }; class Derived1 : public Base { public: void print() const override { std::cout << "Derived1" << std::endl; } }; class Derived2 : public Base { public: void print() const override { std::cout << "Derived2" << std::endl; } }; auto main() -> int { std::unique_ptr<Base> obj = std::make_unique<Derived1>(); obj->print(); // Outputs "Derived1" obj = std::make_unique<Derived2>(); obj->print(); // Outputs "Derived2" return 0; } </syntaxhighlight> この方法は、動的な型の選択と多様な動作を必要とする場合に有効です。 ==== まとめ ==== * '''<code>std::variant</code>''': 型安全で共用体の代替として非常に適している。 * '''<code>std::any</code>''': 柔軟だが、使用時の型チェックが必要。 * '''クラス階層とポリモーフィズム''': より複雑な型の使用や動的な動作を求める場合に適している。 これらの代替技術は、共用体の持つ制約を超え、型安全性や柔軟性を高めることができます。 {{Nav}} == 脚註 == <references/> [[Category:C++|くらすのていきやけいしよう]] qpkvi991cn1v2cvgejisepspyj20ota C++/標準テンプレートライブラリ 0 22531 264152 249697 2024-11-25T01:08:04Z Ef3 694 校閲と推敲と加筆 264152 wikitext text/x-wiki {{Nav}} == はじめに == 標準テンプレートライブラリ(Standard Template Library, STL)は、C++の標準ライブラリの一部であり、データ構造やアルゴリズムを効率的に扱うためのテンプレートクラスや関数を提供します。STLは、C++言語の特長であるテンプレート機能を活用して実装されており、汎用性と再利用性を高めることができます。 STLには、主に以下の3つのコンポーネントが含まれています。 ; コンテナ(Containers) : データの集合を扱うためのテンプレートクラスが含まれています。 :; シーケンスコンテナ : vector、array、deque、list、forward_list :; 連想コンテナ : set、map、unordered_set、unordered_map :; コンテナアダプタ : stack、queue、priority_queue ; アルゴリズム(Algorithms) : 汎用的なデータ処理アルゴリズムを提供します。 :; ranges名前空間 : C++20以降で導入された、より直感的なアルゴリズムインターフェース :; 並列アルゴリズム : 並列実行ポリシーを使用した並行処理対応アルゴリズム :; constexprアルゴリズム : コンパイル時実行可能なアルゴリズム ; イテレータ(Iterators) : コンテナとアルゴリズムを橋渡しする抽象化された要素アクセス手段です。 :; 入力イテレータ : 前方向の読み取り専用アクセス :; 出力イテレータ : 前方向の書き込み専用アクセス :; 前方イテレータ : 多重パス可能な前方向アクセス :; 双方向イテレータ : 前後方向のアクセス :; ランダムアクセスイテレータ : 任意位置への直接アクセス :; 連続イテレータ : メモリ上で連続した要素へのアクセス(C++20) == STLの現代的機能 == ; コンセプト(C++20) : テンプレートの型制約を表現する機能です。 :; 標準コンセプト : ranges::iteratorやranges::rangeなど、標準ライブラリで定義された型制約 :; カスタムコンセプト : ユーザー定義の型制約を記述可能 ; レンジ(C++20) : より直感的なコンテナ操作を提供します。 :; レンジアダプタ : view::filterやview::transformなどの変換操作 :; レンジファクトリ : iota_viewやempty_viewなどの生成操作 ; スパン(C++20) : 配列やメモリ領域への安全な参照を提供します。 :; 所有権を持たない参照 : メモリ領域の境界チェック機能付き :; 静的/動的サイズ : コンパイル時/実行時のサイズ指定 == メモリ管理 == ; スマートポインタ : 現代的なメモリ管理手法を提供します。 :; <code>std::unique_ptr</code> : 排他的所有権を持つポインタ :; <code>std::shared_ptr</code> : 共有所有権を持つポインタ :; <code>std::weak_ptr</code> : 循環参照を防ぐ弱い参照 ; メモリリソース(C++17) : カスタムメモリアロケーションを実現します。 :; pmr名前空間 : 多態的メモリリソース機能 :; メモリプール : 効率的なメモリ割り当て == 並行処理サポート == ; 実行ポリシー : アルゴリズムの実行方法を制御します。 :; seq : 逐次実行 :; par : 並列実行 :; par_unseq : 並列・ベクトル化実行 ; スレッド管理 : マルチスレッドプログラミングをサポートします。 :; <code>std::jthread</code> : 自動的なスレッド終了管理(C++20) :; <code>std::stop_token</code> : 協調的なスレッド停止機能(C++20) == 特殊コンテナ(C++17以降) == ; <code>std::optional</code> : 値が存在しない可能性を表現 ; <code>std::variant</code> : 型安全な共用体 ; <code>std::any</code> : 任意の型の値を保持 ; <code>std::string_view</code> : 文字列の効率的な参照 == 新しいアルゴリズム(C++20/23) == ; 範囲ベース : ranges名前空間で提供される直感的なアルゴリズム ; 並列処理対応 : 実行ポリシーによる並列化 ; constexpr対応 : コンパイル時実行可能なアルゴリズム ; 文字列操作 : starts_with、ends_with、containsなど == STLの利用例 == :<syntaxhighlight lang=c++ copy> #include <iostream> #include <ranges> #include <vector> auto main() -> int { // モダンなSTLの使用例 std::vector<int> numbers = {1, 2, 3, 4, 5}; auto even_numbers = numbers | std::views::filter([](int n) { return n % 2 == 0; }) | std::views::transform([](int n) { return n * 2; }); for (auto x : even_numbers) { std::cout << x << " "; } std::cout << std::endl; // output: 4 8 } </syntaxhighlight> == 注意点 == ; パフォーマンス考慮 : :; 適切なコンテナ選択 :; アルゴリズムの計算量理解 :; メモリアロケーション最適化 ; 移植性 : :; コンパイラサポート確認 :; 実装依存の動作回避 :; C++バージョン互換性 {{コラム|width=stretch|現代のSTL|2=C++20以降、STLは大きな進化を遂げています。コンセプトとレンジの導入により、より型安全で直感的なプログラミングが可能になりました。また、コルーチンやモジュールなどの新機能により、より柔軟なプログラミングモデルを実現しています。 特に注目すべき点は以下の通りです: * レンジベースのアルゴリズムによる可読性の向上 * コンセプトによる型制約の明確化 * モジュールによる分割コンパイルの効率化 * コルーチンによる非同期プログラミングの簡略化 これらの機能により、STLはより強力で使いやすいライブラリとなっています。 }} {{Nav}} {{DEFAULTSORT:ひようしゆんてんふれとらいふらり}} [[Category:C++]] g8k0n63y2i5fr2b1if2zg1mzcy2vgs1 高等学校歴史総合/第一次世界大戦 0 36169 264155 264106 2024-11-25T03:17:57Z Kwawe 68789 /* 第一次世界大戦 */ 過去執筆の事後処理(見直し・大幅修正)の第2段落が完了。 264155 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>第一次世界大戦  詳しい内容は、「[[高等学校世界史探究|世界史探究]]」の「[[高等学校世界史探究/第一次世界大戦とロシア革命Ⅰ|第一次世界大戦とロシア革命Ⅰ]]」を見てください。本歴史総合では、簡単に記述します。 == 第一次世界大戦 == 19世紀に入ると、オスマン帝国が弱くなりました。その結果、バルカン半島に様々な国が次々と生まれました。様々な国が出来ると、土地争いをするようになりました。その頃、ドイツが力をつけるようになり、勢力を広げようとしました。それを見て、イギリスとフランスとロシアが手を組むようになりました。一方、ドイツもオーストリアと手を組むようになりました。1914年、バルカン半島のサライェヴォで暗殺事件がありました(サライェヴォ事件)。サライェヴォ事件は地域限定の問題だと思われていましたが、各国の同盟関係から第一次世界大戦に発展しました。 最初、ドイツ軍がフランスに攻めました。しかし、フランス軍が領土を取られないように防ぎました。結局、ドイツ軍とフランス軍は深い穴を掘って、そこから戦うようになりました。やがて、アメリカも第一次世界大戦に参加してきて、新しい武器も使われ始めるようになり、戦争はさらに激しくなりました。戦争が長引くと、多くの兵士が怪我をしたり、亡くなったりしました。また、普通の人の生活もかなり大変になりました。第一次世界大戦はロシア革命とドイツの革命をきっかけに終わりました。 == 第一次世界大戦の影響 == == 日本の第一次世界大戦 == [[カテゴリ:高等学校歴史総合|たいいちしせかいたいせん]] [[カテゴリ:第一次世界大戦|こうこうれきしそうこうたいいちしせかいたいせん]] cayjo9wii2a7a8gemdqbbxtpy5tvsle 264176 264155 2024-11-25T10:12:06Z Kwawe 68789 /* 第一次世界大戦の影響 */ 当項目過去執筆の事後処理(見直し・大幅修正)が完了。 264176 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>第一次世界大戦  詳しい内容は、「[[高等学校世界史探究|世界史探究]]」の「[[高等学校世界史探究/第一次世界大戦とロシア革命Ⅰ|第一次世界大戦とロシア革命Ⅰ]]」を見てください。本歴史総合では、簡単に記述します。 == 第一次世界大戦 == 19世紀に入ると、オスマン帝国が弱くなりました。その結果、バルカン半島に様々な国が次々と生まれました。様々な国が出来ると、土地争いをするようになりました。その頃、ドイツが力をつけるようになり、勢力を広げようとしました。それを見て、イギリスとフランスとロシアが手を組むようになりました。一方、ドイツもオーストリアと手を組むようになりました。1914年、バルカン半島のサライェヴォで暗殺事件がありました(サライェヴォ事件)。サライェヴォ事件は地域限定の問題だと思われていましたが、各国の同盟関係から第一次世界大戦に発展しました。 最初、ドイツ軍がフランスに攻めました。しかし、フランス軍が領土を取られないように防ぎました。結局、ドイツ軍とフランス軍は深い穴を掘って、そこから戦うようになりました。やがて、アメリカも第一次世界大戦に参加してきて、新しい武器も使われ始めるようになり、戦争はさらに激しくなりました。戦争が長引くと、多くの兵士が怪我をしたり、亡くなったりしました。また、普通の人の生活もかなり大変になりました。第一次世界大戦はロシア革命とドイツの革命をきっかけに終わりました。 == 第一次世界大戦の影響 == 第一次世界大戦が大きくなると、植民地の人も兵士として戦場に送られました。その時、植民地の人は「これを機会に、もっと自由に自国の政治を決められるようになるかもしれない。」と期待して、第一次世界大戦に協力しました。また、イギリスとフランスとロシアは、西アジアのオスマン帝国と仲良く出来なくなりました。特に、イギリスはアラブ人とユダヤ人をそれぞれ招いて内緒で話し合いをしました。その話し合いが分かると、アラブ人とユダヤ人の間でパレスチナ地域を争うようになりました。 == 日本の第一次世界大戦 == [[カテゴリ:高等学校歴史総合|たいいちしせかいたいせん]] [[カテゴリ:第一次世界大戦|こうこうれきしそうこうたいいちしせかいたいせん]] ixiwl28jyjj0kckrj9c8f5o1z0zorc5 264186 264176 2024-11-25T10:41:30Z Kwawe 68789 /* 日本の第一次世界大戦 */ 過去執筆の事後処理(見直し・大幅修正)。当節の事後処理が完了。 264186 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>第一次世界大戦  詳しい内容は、「[[高等学校世界史探究|世界史探究]]」の「[[高等学校世界史探究/第一次世界大戦とロシア革命Ⅰ|第一次世界大戦とロシア革命Ⅰ]]」を見てください。本歴史総合では、簡単に記述します。 == 第一次世界大戦 == 19世紀に入ると、オスマン帝国が弱くなりました。その結果、バルカン半島に様々な国が次々と生まれました。様々な国が出来ると、土地争いをするようになりました。その頃、ドイツが力をつけるようになり、勢力を広げようとしました。それを見て、イギリスとフランスとロシアが手を組むようになりました。一方、ドイツもオーストリアと手を組むようになりました。1914年、バルカン半島のサライェヴォで暗殺事件がありました(サライェヴォ事件)。サライェヴォ事件は地域限定の問題だと思われていましたが、各国の同盟関係から第一次世界大戦に発展しました。 最初、ドイツ軍がフランスに攻めました。しかし、フランス軍が領土を取られないように防ぎました。結局、ドイツ軍とフランス軍は深い穴を掘って、そこから戦うようになりました。やがて、アメリカも第一次世界大戦に参加してきて、新しい武器も使われ始めるようになり、戦争はさらに激しくなりました。戦争が長引くと、多くの兵士が怪我をしたり、亡くなったりしました。また、普通の人の生活もかなり大変になりました。第一次世界大戦はロシア革命とドイツの革命をきっかけに終わりました。 == 第一次世界大戦の影響 == 第一次世界大戦が大きくなると、植民地の人も兵士として戦場に送られました。その時、植民地の人は「これを機会に、もっと自由に自国の政治を決められるようになるかもしれない。」と期待して、第一次世界大戦に協力しました。また、イギリスとフランスとロシアは、西アジアのオスマン帝国と仲良く出来なくなりました。特に、イギリスはアラブ人とユダヤ人をそれぞれ招いて内緒で話し合いをしました。その話し合いが分かると、アラブ人とユダヤ人の間でパレスチナ地域を争うようになりました。 == 日本の第一次世界大戦 == 第一次世界大戦の時、日本はイギリスの味方としてドイツと戦いました。中国の山東半島へ日本の軍隊が行ったり、遠い地中海まで軍艦を送ったりしました。このように、日本はそんなに大きな戦いをしていません。第一次世界大戦中、ヨーロッパ諸国が日用品・武器を作れなくなったので、日本が武器・日用品を数多く作り、ヨーロッパ諸国に送りました。だから、日本経済がかなり良くなりました(大戦景気)。大戦景気の頃、富裕層も増加しました(成金)。 [[カテゴリ:高等学校歴史総合|たいいちしせかいたいせん]] [[カテゴリ:第一次世界大戦|こうこうれきしそうこうたいいちしせかいたいせん]] mnspe218tvl6y4bxkvfqcpv5hnl8q6h 264187 264186 2024-11-25T10:44:03Z Kwawe 68789 重要用語を色太字化。 264187 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>第一次世界大戦  詳しい内容は、「[[高等学校世界史探究|世界史探究]]」の「[[高等学校世界史探究/第一次世界大戦とロシア革命Ⅰ|第一次世界大戦とロシア革命Ⅰ]]」を見てください。本歴史総合では、簡単に記述します。 == 第一次世界大戦 == 19世紀に入ると、オスマン帝国が弱くなりました。その結果、<span style="color:#f29100">'''バルカン半島'''</span>に様々な国が次々と生まれました。様々な国が出来ると、土地争いをするようになりました。その頃、ドイツが力をつけるようになり、勢力を広げようとしました。それを見て、イギリスとフランスとロシアが手を組むようになりました。一方、ドイツもオーストリアと手を組むようになりました。1914年、バルカン半島のサライェヴォで暗殺事件がありました(<span style="color:#f29100">'''サライェヴォ事件'''</span>)。サライェヴォ事件は地域限定の問題だと思われていましたが、各国の同盟関係から<span style="color:#f29100">'''第一次世界大戦'''</span>に発展しました。 最初、ドイツ軍がフランスに攻めました。しかし、フランス軍が領土を取られないように防ぎました。結局、ドイツ軍とフランス軍は深い穴を掘って、そこから戦うようになりました。やがて、アメリカも第一次世界大戦に参加してきて、新しい武器も使われ始めるようになり、戦争はさらに激しくなりました。戦争が長引くと、多くの兵士が怪我をしたり、亡くなったりしました。また、普通の人の生活もかなり大変になりました。第一次世界大戦はロシア革命とドイツの革命をきっかけに終わりました。 == 第一次世界大戦の影響 == 第一次世界大戦が大きくなると、植民地の人も兵士として戦場に送られました。その時、植民地の人は「これを機会に、もっと自由に自国の政治を決められるようになるかもしれない。」と期待して、第一次世界大戦に協力しました。また、イギリスとフランスとロシアは、西アジアのオスマン帝国と仲良く出来なくなりました。特に、イギリスはアラブ人とユダヤ人をそれぞれ招いて内緒で話し合いをしました。その話し合いが分かると、アラブ人とユダヤ人の間でパレスチナ地域を争うようになりました。 == 日本の第一次世界大戦 == 第一次世界大戦の時、日本はイギリスの味方としてドイツと戦いました。中国の山東半島へ日本の軍隊が行ったり、遠い地中海まで軍艦を送ったりしました。このように、日本はそんなに大きな戦いをしていません。第一次世界大戦中、ヨーロッパ諸国が日用品・武器を作れなくなったので、日本が武器・日用品を数多く作り、ヨーロッパ諸国に送りました。だから、日本経済がかなり良くなりました(<span style="color:#f29100">'''大戦景気'''</span>)。大戦景気の頃、富裕層も増加しました(成金)。 [[カテゴリ:高等学校歴史総合|たいいちしせかいたいせん]] [[カテゴリ:第一次世界大戦|こうこうれきしそうこうたいいちしせかいたいせん]] a6ch7x5j842qi7hynjd4qt5fpun2zqm 高等学校歴史総合/情報通信技術の発達 0 36541 264157 223750 2024-11-25T03:24:37Z Kwawe 68789 過去執筆の事後処理(見直し・大幅修正)のため、本文を全て削除。 264157 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>情報通信技術の発達 == 情報通信技術の発達と社会の変化 == == 情報化社会とその課題 == [[カテゴリ:高等学校歴史総合]] [[カテゴリ:情報技術]] 2qcznsreobzujqy0hjvpcpljekdb5f6 高等学校歴史総合/地域統合の進展と課題 0 36542 264160 223741 2024-11-25T03:27:50Z Kwawe 68789 過去執筆の事後処理(見直し・大幅修正)のため、本文を全て削除。 264160 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>地域統合の進展と課題 == 地域統合の拡大 == == 地域統合の課題 == [[ファイル:Coup-d'etat-2-web-cnni.jpg|サムネイル|248x248ピクセル|バンコク中心部を占拠する反乱軍の戦車部隊]] [[カテゴリ:高等学校歴史総合|ちいきとうこうのしんてんとかたい]] [[カテゴリ:国際関係学]] [[カテゴリ:20世紀]] [[カテゴリ:21世紀]] je1h73kgb2pcqtdzdel10wd3u42477t 高等学校歴史総合/市場開放と経済の自由化 0 36543 264158 226429 2024-11-25T03:26:01Z Kwawe 68789 過去執筆の事後処理(見直し・大幅修正)のため、本文を全て削除。 264158 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>市場開放と経済の自由化 詳しい内容は、「[[高等学校世界史探究|世界史探究]]」の「」、「[[高等学校日本史探究|日本史探究]]」の「[[高等学校日本史探究/新たな世紀の日本へⅠ|新たな世紀の日本へⅠ]]」を見てください。本歴史総合では、簡単に記述します。 == 新自由主義の台頭 == == 経済のグローバル化と新たな国際経済組織 == == ここに注意!! == [[カテゴリ:高等学校歴史総合|ししようかいほうとけいさいのしゆうか]] [[カテゴリ:国際関係学]] [[カテゴリ:20世紀]] [[カテゴリ:21世紀]] [[カテゴリ:経済史]] 278lnc6a9550xguq55bic9wq5vcgpbq 高等学校歴史総合/冷戦終結後の紛争と平和への取り組み 0 36545 264161 223748 2024-11-25T03:28:53Z Kwawe 68789 過去執筆の事後処理(見直し・大幅修正)のため、本文を全て削除。 264161 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>冷戦終結後の紛争と平和への取り組み == 冷戦終結後の紛争 == == 紛争の解決と国際社会の役割 == [[カテゴリ:高等学校歴史総合|れいせんしゆうけつこのふんそうとへいわへのとりくみ]] [[カテゴリ:国際関係学]] [[カテゴリ:20世紀]] [[カテゴリ:21世紀]] mza4lluxhii6lwv8ebsi248ee5daxvp 高等学校歴史総合/18世紀の中国とアジア貿易 0 36917 264163 222768 2024-11-25T03:30:57Z Kwawe 68789 過去執筆の事後処理(見直し・大幅修正)のため、本文を全て削除。 264163 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>18世紀の中国とアジア貿易 == 清の繁栄 == == 清と近隣諸国とのつながり == [[カテゴリ:高等学校歴史総合]] [[カテゴリ:清朝]] s14ismwxvh7bldoj104wlm6hug0fnm5 高等学校歴史総合/18世紀のイギリス・アジア・アフリカ 0 36918 264164 222814 2024-11-25T03:32:05Z Kwawe 68789 過去執筆の事後処理(見直し・大幅修正)のため、本文を全て削除。 264164 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>18世紀のイギリス・アジア・アフリカ == ヨーロッパの世界進出と大西洋三角貿易 == == 世界経済の覇権を握ったイギリス == [[カテゴリ:高等学校歴史総合]] [[カテゴリ:イギリス史]] [[カテゴリ:アジア史]] [[カテゴリ:アフリカ史]] d7eyz4ird300u3sa5qmv11i1kf0vy1r 高等学校歴史総合/大衆社会の形成 0 36919 264192 264104 2024-11-25T11:37:56Z Kwawe 68789 /* 日本の大衆社会 */ 過去執筆の事後処理(見直し・本文大幅修正)。 264192 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校歴史総合]]>大衆社会の形成 == 大衆社会の出現 == == アメリカ合衆国 1920年代の光と影 == == 日本の大衆社会 == 1923年、関東大震災が起きました。その後、新しい街づくりが始まると、東京周辺も新しく生まれ変わりました。また、地方も東京周辺の都市に少しずつ近づくようになりました。1925年、東京と大阪でラジオ放送が始まりました。やがて、ラジオ放送が全国に広がりました。この時期、映画・雑誌も全国に広がったので、人々の楽しみ方が増えました。新しいメディアが増えていくにつれて、人々も「こんな暮らしが出来たらいいな」とか「世の中はこれからどのように変わっていくのかな」とわくわくするようになりました。さらに、学校が増えると、受験生も増えました。 [[カテゴリ:高等学校歴史総合|たいしゆうしやかいのけいせい]] 3bb3s1vtf1egtyty4as81behly1ltry Svelte 0 38968 264136 262363 2024-11-24T21:39:41Z Ef3 694 s/(<syntaxhighlight lang=)/$1 copy>/g 264136 wikitext text/x-wiki '''Svelte'''は、JavaScriptフレームワークの一種で、リアクティブなUIを構築するためのものです。以下は、Svelteフレームワークの基本的なチュートリアルです。 == Svelteとは == '''Svelte(スヴェルト)'''は、リアクティブなWebアプリケーションを構築するための革新的なJavaScriptフレームワークです。他のフレームワークが実行時にブラウザで動作するJavaScriptコードを生成するのに対し、Svelteはコンパイル時に最適化されたバイナリコードを生成することが大きな特徴です。このアプローチにより、実行時のオーバーヘッドが削減され、軽量で高速なWebアプリケーションの構築が実現します。 Svelteの主な特徴と利点は以下のとおりです: ;リアクティビティの組み込み: Svelteは、データの変更に応じて自動的にUIを更新するリアクティブな仕組みを提供します。変数の変更が即座にDOMに反映されるため、手動でDOMを操作する必要がなくなります。 ;コンパイル時の最適化: Svelteコンポーネントは、ビルド時に最適化されたJavaScriptコードに変換され、ブラウザにダウンロードされます。これにより、冗長な処理が削減され、アプリケーションのパフォーマンスが向上します。 ;単一ファイルコンポーネント: Svelteでは、HTML、CSS、およびJavaScriptが1つのコンポーネントファイルに統合されています。これにより、関連するコードが一箇所にまとまり、開発者がコードを理解しやすくなります。 ;シンプルな文法: Svelteは簡潔でわかりやすい文法を提供し、他のフレームワークと比較して学習コストが低いとされています。 ;成熟したエコシステム: Svelteには多くのプラグインやアドオンが存在し、開発プロセスをサポートします。これにより、より効率的な開発が可能になります。 ;仮想DOMを用いない実装: Svelteの最も重要な特徴の一つは、仮想DOMを使用せず、コンパイル時に直接DOM操作のコードを生成する点です。これにより、実行時のオーバーヘッドが排除され、アプリケーションのパフォーマンスが向上します。Svelteは、データの変更があるときに必要な部分だけを直接更新するため、仮想DOMの差分計算が不要になり、処理が迅速になります。このアプローチは、特にパフォーマンスが重視されるアプリケーションにおいて大きなメリットをもたらします。 Svelteは、[[JavaScript/Vue.js|Vue.js]]や[[React.js]]などの他のフレームワークとは異なるアプローチを取り、独自の利点を提供しています。デベロッパーが柔軟で効率的にリアクティブなWebアプリケーションを構築するために広く利用されています。 == 基本手順 == # Svelteのインストール #: まず、Svelteを使用するには[[Node.js]]が必要です。Node.jsをインストールした後、次のコマンドを実行してSvelteをグローバルにインストールします。 #: <syntaxhighlight lang=shell-session> npx degit sveltejs/template svelte-app cd svelte-app npm install </syntaxhighlight> # プロジェクトのセットアップ #: プロジェクトのセットアップが完了したら、以下のコマンドでローカルサーバーを起動します。 #: <syntaxhighlight lang=shell-session> npm run dev </syntaxhighlight> #: デフォルトでは、<nowiki>http://localhost:8080</nowiki> でアプリが起動します。 # Svelteコンポーネントの作成 #: Svelteでは、<code>.svelte</code> 拡張子のファイルがコンポーネントを表します。例えば、<code>App.svelte</code> ファイルを作成し、以下のようなコードを追加します。 #; App.svelte #: <syntaxhighlight lang=html copy> <script> let name = 'World'; </script> <main> <h1>Hello {name}!</h1> <input bind:value={name} placeholder="Enter your name" /> </main> <style> main { text-align: center; margin: 1em; } input { padding: 0.5em; margin: 0.5em; } </style> </syntaxhighlight> # コンポーネントの使用 #: <code>src/main.js</code> ファイルを開いて、以下のように変更します。 #; src/main.js #: <syntaxhighlight lang=shell-session> import App from './App.svelte'; const app = new App({ target: document.body, props: { name: 'Svelte', }, }); export default app; </syntaxhighlight> # ビルドとデプロイ #: Svelteアプリケーションをビルドし、本番環境にデプロイするには、以下のコマンドを使用します。 #: <syntaxhighlight lang=shell-session> npm run build </syntaxhighlight> #: ビルドが成功すると、<code>public</code> フォルダ内に生成されたファイルが作成されます。これを適切なホスティングサービスにデプロイしてください。 == ディレクトリツリー == Svelteアプリケーションのディレクトリ構造は以下のようになります。この例は、Svelteのデフォルトテンプレートに基づいています。 :<syntaxhighlight lang=text> svelte-app/ ├── node_modules/ ├── public/ │ ├── favicon.png │ ├── global.css │ └── index.html ├── src/ │ ├── components/ │ │ └── App.svelte │ ├── App.svelte │ ├── main.js │ └── routes.js ├── .gitignore ├── package-lock.json ├── package.json ├── rollup.config.js └── README.md </syntaxhighlight> 各ディレクトリおよびファイルの簡単な説明: ;node_modules: Node.jsパッケージの依存関係が格納されるディレクトリ。 ;public: 静的なファイルやビルドされたアプリケーションが配置されるディレクトリ。 ;favicon.png: アプリケーションのアイコンファイル。 ;global.css: グローバルなCSSスタイルが格納されるファイル。 ;index.html: アプリケーションのエントリーポイントとなるHTMLファイル。 ;src: ソースコードが格納されるディレクトリ。 ;components: Svelteコンポーネントが格納されるサブディレクトリ。 ;App.svelte: ルートコンポーネントとしての役割を果たすSvelteファイル。 ;main.js: アプリケーションのエントリーポイントで、Svelteアプリケーションを初期化してレンダリングします。 ;routes.js: アプリケーションのルーティングに関する定義が含まれるファイル。 ;.gitignore: Gitの無視設定が記述されたファイル。 ;package-lock.json: npmのパッケージの正確なバージョン情報が格納されるファイル。 ;package.json: プロジェクトのメタ情報や依存関係が記述されたファイル。 ;rollup.config.js: ビルドツールであるRollupの設定ファイル。 ;README.md: プロジェクトに関する説明やドキュメンテーションが記述されたファイル。 このディレクトリ構造は一般的なSvelteプロジェクトのものであり、プロジェクトのニーズに応じて調整が可能です。 == TypeScriptを使う == SvelteはTypeScript(TS)と統合された開発をサポートしています。Svelte 3以降、TypeScriptが公式にサポートされ、SvelteアプリケーションをTypeScriptで記述することが可能になりました。 以下は、SvelteとTypeScriptを組み合わせて使用する基本的な手順です。 # プロジェクトの作成 #: Svelteプロジェクトを作成するには、公式のテンプレートを使用します。次のコマンドでテンプレートをクローンします。 #: <syntaxhighlight lang=shell-session> npx degit sveltejs/template svelte-app cd svelte-app </syntaxhighlight> # TypeScriptの設定 #: TypeScriptを導入するために、以下のコマンドを実行します。 #: <syntaxhighlight lang=shell-session> npm install --save-dev typescript </syntaxhighlight> # TypeScriptの設定ファイル #: プロジェクトルートに<code>tsconfig.json</code>ファイルを作成し、以下の設定を追加します。 #; tsconfig.json #:<syntaxhighlight lang=json copy> { "compilerOptions": { "target": "es2017", "module": "esnext", "moduleResolution": "node", "strict": true, "jsx": "preserve", "esModuleInterop": true }, "include": ["src/**/*"], "exclude": ["node_modules", "**/*.spec.ts"] } </syntaxhighlight> # SvelteコンポーネントをTypeScriptにする #: Svelteコンポーネントファイルを<code>.svelte</code> 拡張子に加えて、スクリプト部分にTypeScriptコードを書くことができます。 #; App.svelte #:<syntaxhighlight lang=html copy> <script lang="ts"> let name: string = 'World'; </script> <main> <h1>Hello {name}!</h1> <input bind:value={name} placeholder="Enter your name" /> </main> <style> main { text-align: center; margin: 1em; } input { padding: 0.5em; margin: 0.5em; } </style> </syntaxhighlight> # ビルドと実行 #: TypeScriptの設定を行った後、以下のコマンドでアプリケーションをビルドし、実行します。 #:<syntaxhighlight lang=shell-session> npm run dev </syntaxhighlight> TypeScriptを使用することで、型安全性を高め、開発の生産性を向上させることができます。 == 参考文献 == * [https://svelte.dev/docs Svelte公式ドキュメント] * [https://github.com/sveltejs/svelte SvelteのGitHubリポジトリ] * [https://www.typescriptlang.org/ TypeScriptの公式サイト] このチュートリアルでは、Svelteの基本的な使用方法とTypeScriptの統合を説明しました。Svelteを利用してリアクティブなWebアプリケーションを構築する際の参考にしてください。 {{DEFAULTSORT:SVELTE}} [[Category:JavaScript]] [[Category:TypeScript]] [[Category:フレームワーク]] 1wjohqw22o2nolozz2kb51bdwjzam66 C++/標準ライブラリ 0 39774 264154 251788 2024-11-25T03:17:15Z Ef3 694 校閲と推敲。ライブラリの分類。 264154 wikitext text/x-wiki {{Nav}} <!-- ### 16 Library introduction [library] C++標準ライブラリは、C++プログラムをより簡潔かつ効率的に記述するための一連のクラスや関数を提供するものです。この節では、C++標準ライブラリの内容、ライブラリを使用するための適切なC++プログラムの書き方、およびライブラリのエンティティを提供するための準拠した実装方法について説明しています。 ### 16.1 General [library.general] 1. この節では、C++標準ライブラリの内容について述べ、C++プログラムがライブラリをどのように利用するのか、また準拠した実装がライブラリ内のエンティティをどのように提供するかについて説明しています。 2. 以下のサブ節では、ライブラリの記述方法(16.3節)および構成(16.4.2節)について説明しています。16.4節、および17節から33節、付録Dでは、ライブラリの内容、ライブラリの要件、および適切に形成されたC++プログラムと準拠する実装に関する制約について指定しています。 3. ライブラリ内の各コンポーネントの詳細な仕様は、17節から33節に記載されており、それらは以下の表23に示されるようにカテゴリ分けされています。 ### Table 23: Library categories [tab:library.categories] 以下は、C++標準ライブラリの各カテゴリとそれを扱う節の一覧です: - **Clause 17: Language support library** - 言語サポートライブラリ。基本的な言語機能のサポート。 - **Clause 18: Concepts library** - コンセプトライブラリ。テンプレートの制約を定義。 - **Clause 19: Diagnostics library** - 診断ライブラリ。エラーメッセージや例外処理のサポート。 - **Clause 20: Memory management library** - メモリ管理ライブラリ。メモリの動的管理のための機能。 - **Clause 21: Metaprogramming library** - メタプログラミングライブラリ。コンパイル時のプログラミング支援。 - **Clause 22: General utilities library** - 一般ユーティリティライブラリ。共通のユーティリティ関数やクラス。 - **Clause 23: Strings library** - 文字列ライブラリ。文字列操作のための機能。 - **Clause 24: Containers library** - コンテナライブラリ。データ構造(配列、リスト、マップなど)。 - **Clause 25: Iterators library** - イテレータライブラリ。コンテナを操作するためのイテレータ。 - **Clause 26: Ranges library** - レンジライブラリ。範囲ベースの操作のためのサポート。 - **Clause 27: Algorithms library** - アルゴリズムライブラリ。標準アルゴリズム(ソート、検索など)。 - **Clause 28: Numerics library** - 数値ライブラリ。数値計算のための機能。 - **Clause 29: Time library** - 時間ライブラリ。時間と日付の操作。 - **Clause 30: Localization library** - ローカライゼーションライブラリ。地域と言語特有の機能。 - **Clause 31: Input/output library** - 入出力ライブラリ。データの入力と出力のための機能。 - **Clause 32: Regular expressions library** - 正規表現ライブラリ。パターンマッチングのための正規表現機能。 - **Clause 33: Concurrency support library** - 並行処理サポートライブラリ。スレッドや並行処理のための機能。 --> = C++教科書/標準ライブラリ編 = == 標準ライブラリとは == C++標準ライブラリは、効率的なプログラミングに不可欠な包括的なツールセットです。コンテナ、アルゴリズム、入出力機能、文字列操作、並行処理など、幅広い機能を提供します。これらを活用することで、開発効率の向上、コードの品質改善、そしてクロスプラットフォームの互換性を実現できます。本書では、C++20/23の最新機能を含む標準ライブラリの各コンポーネントについて、実践的な例を交えながら解説します。 == 標準ライブラリの基本構造 == C++標準ライブラリは、以下のような機能群で構成されています: === コアライブラリ === * [[C++/標準ライブラリ/言語サポートライブラリ|言語サポートライブラリ]] - 言語機能の基礎的なサポート * [[C++/標準ライブラリ/コンセプトライブラリ|コンセプトライブラリ]] - テンプレートの制約を表現(C++20以降) * [[C++/標準ライブラリ/診断ライブラリ|診断ライブラリ]] - 例外処理と診断機能 * [[C++/標準ライブラリ/メモリ管理ライブラリ|メモリ管理ライブラリ]] - スマートポインタとメモリ割り当て === 基本ユーティリティ === * [[C++/標準ライブラリ/メタプログラミングライブラリ|メタプログラミングライブラリ]] - コンパイル時プログラミング機能 * [[C++/標準ライブラリ/一般ユーティリティライブラリ|一般ユーティリティライブラリ]] - 汎用的なツール群 * [[C++/標準ライブラリ/文字列ライブラリ|文字列ライブラリ]] - 文字列操作機能 === データ構造とアルゴリズム === * [[C++/標準ライブラリ/コンテナライブラリ|コンテナライブラリ]] - データ構造の実装 * [[C++/標準ライブラリ/イテレータライブラリ|イテレータライブラリ]] - コンテナ走査機能 * [[C++/標準ライブラリ/レンジライブラリ|レンジライブラリ]] - 範囲ベースの操作(C++20以降) * [[C++/標準ライブラリ/アルゴリズムライブラリ|アルゴリズムライブラリ]] - 汎用アルゴリズム群 === 特殊機能ライブラリ === * [[C++/標準ライブラリ/数値ライブラリ|数値ライブラリ]] - 数値計算と数学関数 * [[C++/標準ライブラリ/時間ライブラリ|時間ライブラリ]] - 時間と日付の処理 * [[C++/標準ライブラリ/ローカライゼーションライブラリ|ローカライゼーションライブラリ]] - 国際化対応 * [[C++/標準ライブラリ/入出力ライブラリ|入出力ライブラリ]] - ストリームベースのI/O * [[C++/標準ライブラリ/正規表現ライブラリ|正規表現ライブラリ]] - パターンマッチング * [[C++/標準ライブラリ/並行性サポートライブラリ|並行性サポートライブラリ]] - マルチスレッドとタスク並列処理 == ヘッダーと名前空間の利用 == === 基本的な使用方法 === C++標準ライブラリのコンポーネントは、ヘッダーファイルとして提供され、<code>std</code>名前空間内に定義されています。利用するには、適切なヘッダーをインクルードし、<code>std::</code>修飾子を使用します: :<syntaxhighlight lang=c++ copy> #include <vector> #include <string> std::vector<int> numbers; std::string text; </syntaxhighlight> === 名前空間の best practices === ==== using宣言の適切な使用 ==== * '''推奨される方法''': *: 特定の要素のみを使用する場合: *:<syntaxhighlight lang=c++ copy> using std::vector; using std::string; </syntaxhighlight> *: 関数のスコープ内での限定的な使用: *:<syntaxhighlight lang=c++ copy> void process_data() { using std::cout; cout << "Processing..." << std::endl; } </syntaxhighlight> ==== using namespace std の問題点 ==== <code>using namespace std;</code>の使用は以下の理由で非推奨です: # '''名前の衝突''':標準ライブラリの名前とユーザーコードの名前が予期せず衝突する可能性 # '''コードの明確性の低下''':どの関数や型が標準ライブラリに属するのか不明確になる # '''メンテナンス性への影響''':将来的なコードの変更や拡張時に問題を引き起こす可能性 # '''大規模プロジェクトでの管理困難''':複数の名前空間が混在する際の依存関係の把握が困難 === C++20以降の新機能 === * '''モジュール''':ヘッダーファイルの代替として、より効率的なモジュールシステムが導入(C++20) * '''レンジライブラリ''':より直感的なコレクション操作 * '''コルーチン''':非同期プログラミングの新しいパラダイム * '''コンセプト''':テンプレートの制約を明示的に表現 == 標準ライブラリヘッダー == * <[[C++/標準ライブラリ/algorithm|algorithm]]> &mdash; 多様なアルゴリズムを提供するクラスと関数。 * <[[C++/標準ライブラリ/any|any]]> &mdash; 任意の型を保持できる型安全なコンテナ。 * <[[C++/標準ライブラリ/array|array]]> &mdash; 固定サイズの配列コンテナ。 * <[[C++/標準ライブラリ/atomic|atomic]]> &mdash; 原子操作。 * <[[C++/標準ライブラリ/barrier|barrier]]> &mdash; スレッドの同期のサポートするバリア。 * <[[C++/標準ライブラリ/bit|bit]]> &mdash; ビット操作用のユーティリティ。 * <[[C++/標準ライブラリ/bitset|bitset]]> &mdash; 固定サイズのビット列コンテナ。 * <[[C++/標準ライブラリ/charconv|charconv]]> &mdash; 文字列と数値の変換。 * <[[C++/標準ライブラリ/chrono|chrono]]> &mdash; 時間の計測と操作のサポート。 * <[[C++/標準ライブラリ/codecvt|codecvt]]> &mdash; 文字コード変換を行うファセット<sup>†</sup>。 * <[[C++/標準ライブラリ/compare|compare]]> &mdash; 比較のサポート。 * <[[C++/標準ライブラリ/complex|complex]]> &mdash; 複素数型のサポート。 * <[[C++/標準ライブラリ/concepts|concepts]]> &mdash; コンセプト定義。 * <[[C++/標準ライブラリ/condition_variable|condition_variable]]> &mdash; スレッド間の待機と通知のサポート。 * <[[C++/標準ライブラリ/coroutine|coroutine]]> &mdash; コルーチンのサポート。 * <[[C++/標準ライブラリ/deque|deque]]> &mdash; 両端キューコンテナ。 * <[[C++/標準ライブラリ/exception|exception]]> &mdash; 例外処理のサポート。 * <[[C++/標準ライブラリ/execution|execution]]> &mdash; 並列アルゴリズムの実行ポリシー。 * <[[C++/標準ライブラリ/expected|expected]]> &mdash; エラーを返す可能性のある操作の結果。 * <[[C++/標準ライブラリ/filesystem|filesystem]]> &mdash; ファイルシステム操作のサポート。 * <[[C++/標準ライブラリ/flat_map|flat_map]]> &mdash; ソートされた連想コンテナ。 * <[[C++/標準ライブラリ/flat_set|flat_set]]> &mdash; ソートされたセットコンテナ。 * <[[C++/標準ライブラリ/format|format]]> &mdash; 文字列のフォーマット機能。 * <[[C++/標準ライブラリ/forward_list|forward_list]]> &mdash; 単方向リストコンテナ。 * <[[C++/標準ライブラリ/fstream|fstream]]> &mdash; ファイル入出力のサポート。 * <[[C++/標準ライブラリ/functional|functional]]> &mdash; 関数オブジェクトとユーティリティ。 * <[[C++/標準ライブラリ/future|future]]> &mdash; 非同期操作の結果を取得。 * <[[C++/標準ライブラリ/generator|generator]]> &mdash; ジェネレーターのサポート。 * <[[C++/標準ライブラリ/initializer_list|initializer_list]]> &mdash; 初期化リストのサポート。 * <[[C++/標準ライブラリ/iomanip|iomanip]]> &mdash; 入出力ストリームの操作。 * <[[C++/標準ライブラリ/ios|ios]]> &mdash; 基本的な入出力ストリームのクラス。 * <[[C++/標準ライブラリ/iosfwd|iosfwd]]> &mdash; 入出力ストリームクラスの前方宣言。 * <[[C++/標準ライブラリ/iostream|iostream]]> &mdash; 標準入出力ストリームオブジェクト。 * <[[C++/標準ライブラリ/istream|istream]]> &mdash; 入力ストリームクラス。 * <[[C++/標準ライブラリ/iterator|iterator]]> &mdash; イテレータのユーティリティと型。 * <[[C++/標準ライブラリ/latch|latch]]> &mdash; スレッド同期のためのラッチ。 * <[[C++/標準ライブラリ/limits|limits]]> &mdash; 型の限界値情報を提供。 * <[[C++/標準ライブラリ/list|list]]> &mdash; 双方向リストコンテナ。 * <[[C++/標準ライブラリ/locale|locale]]> &mdash; ロケールと国際化サポート。 * <[[C++/標準ライブラリ/map|map]]> &mdash; キーと値のペアを保持する連想コンテナ。 * <[[C++/標準ライブラリ/mdspan|mdspan]]> &mdash; 多次元配列のビュー。 * <[[C++/標準ライブラリ/memory|memory]]> &mdash; 動的メモリ管理とスマートポインタ。 * <[[C++/標準ライブラリ/memory_resource|memory_resource]]> &mdash; メモリリソースとポリシー。 * <[[C++/標準ライブラリ/mutex|mutex]]> &mdash; 相互排他制御のプリミティブ。 * <[[C++/標準ライブラリ/new|new]]> &mdash; 動的メモリ割り当ての管理。 * <[[C++/標準ライブラリ/numbers|numbers]]> &mdash; 数値定数の定義。 * <[[C++/標準ライブラリ/numeric|numeric]]> &mdash; 数値計算のユーティリティ。 * <[[C++/標準ライブラリ/optional|optional]]> &mdash; オプショナル型。 * <[[C++/標準ライブラリ/ostream|ostream]]> &mdash; 出力ストリームクラス。 * <[[C++/標準ライブラリ/print|print]]> &mdash; 標準出力への出力のサポート。 * <[[C++/標準ライブラリ/queue|queue]]> &mdash; FIFO(先入れ先出し)コンテナ。 * <[[C++/標準ライブラリ/random|random]]> &mdash; 乱数生成ライブラリ。 * <[[C++/標準ライブラリ/ranges|ranges]]> &mdash; 範囲ベースのアルゴリズム。 * <[[C++/標準ライブラリ/ratio|ratio]]> &mdash; コンパイル時の有理数演算。 * <[[C++/標準ライブラリ/regex|regex]]> &mdash; 正規表現のサポート。 * <[[C++/標準ライブラリ/scoped_allocator|scoped_allocator]]> &mdash; スコープ付きアロケータのラッパー。 * <[[C++/標準ライブラリ/semaphore|semaphore]]> &mdash; スレッド間の同期を制御。 * <[[C++/標準ライブラリ/set|set]]> &mdash; 集合コンテナ。 * <[[C++/標準ライブラリ/shared_mutex|shared_mutex]]> &mdash; 共有と独占のロック制御。 * <[[C++/標準ライブラリ/source_location|source_location]]> &mdash; ソースコード位置情報。 * <[[C++/標準ライブラリ/span|span]]> &mdash; 連続メモリのビュー。 * <[[C++/標準ライブラリ/spanstream|spanstream]]> &mdash; メモリバッファへのストリーム。 * <[[C++/標準ライブラリ/sstream|sstream]]> &mdash; 文字列ストリームクラス。 * <[[C++/標準ライブラリ/stack|stack]]> &mdash; LIFO(後入れ先出し)コンテナビュー。 * <[[C++/標準ライブラリ/stacktrace|stacktrace]]> &mdash; スタックトレースのサポート。 * <[[C++/標準ライブラリ/stdexcept|stdexcept]]> &mdash; 標準的な例外クラス。 * <[[C++/標準ライブラリ/stdfloat|stdfloat]]> &mdash; 標準浮動小数点数。 * <[[C++/標準ライブラリ/stop_token|stop_token]]> &mdash; 停止トークンのサポート。 * <[[C++/標準ライブラリ/streambuf|streambuf]]> &mdash; ストリームバッファ。 * <[[C++/標準ライブラリ/string|string]]> &mdash; 文字列クラス。 * <[[C++/標準ライブラリ/string_view|string_view]]> &mdash; 文字列の読み取りビュー。 * <[[C++/標準ライブラリ/strstream|strstream]]> &mdash; 文字列バッファストリーム。 * <[[C++/標準ライブラリ/syncstream|syncstream]]> &mdash; 同期ストリーム出力。 * <[[C++/標準ライブラリ/system_error|system_error]]> &mdash; システムエラーの報告。 * <[[C++/標準ライブラリ/thread|thread]]> &mdash; マルチスレッドのサポート。 * <[[C++/標準ライブラリ/tuple|tuple]]> &mdash; 異なる型のタプル。 * <[[C++/標準ライブラリ/type_traits|type_traits]]> &mdash; 型特性の操作。 * <[[C++/標準ライブラリ/typeindex|typeindex]]> &mdash; 型情報のインデックス。 * <[[C++/標準ライブラリ/typeinfo|typeinfo]]> &mdash; ランタイム型情報。 * <[[C++/標準ライブラリ/unordered_map|unordered_map]]> &mdash; ハッシュテーブル連想コンテナ。 * <[[C++/標準ライブラリ/unordered_set|unordered_set]]> &mdash; ハッシュテーブル集合コンテナ。 * <[[C++/標準ライブラリ/utility|utility]]> &mdash; 汎用ユーティリティ。 * <[[C++/標準ライブラリ/valarray|valarray]]> &mdash; 数値配列クラス。 * <[[C++/標準ライブラリ/variant|variant]]> &mdash; 複数の型を持つユニオン。 * <[[C++/標準ライブラリ/vector|vector]]> &mdash; 動的配列コンテナ。 * <[[C++/標準ライブラリ/version|version]]> &mdash; バージョン情報。 === C言語互換ヘッダー === C言語ヘッダーの先頭に '''c''' を補い末尾から '''.h''' を取り去る。 * <[[C++/標準ライブラリ/cassert|cassert]]> &mdash; アサーションのサポート。 * <[[C++/標準ライブラリ/cctype|cctype]]> &mdash; 文字分類と変換。 * <[[C++/標準ライブラリ/cerrno|cerrno]]> &mdash; エラーナンバー定義。 * <[[C++/標準ライブラリ/cfenv|cfenv]]> &mdash; 浮動小数点環境の制御。 * <[[C++/標準ライブラリ/cfloat|cfloat]]> &mdash; 浮動小数点数の特性。 * <[[C++/標準ライブラリ/cinttypes|cinttypes]]> &mdash; 整数型のフォーマット変換。 * <[[C++/標準ライブラリ/climits|climits]]> &mdash; 整数型の限界値。 * <[[C++/標準ライブラリ/clocale|clocale]]> &mdash; ロケールの設定と取得。 * <[[C++/標準ライブラリ/cmath|cmath]]> &mdash; 数学関数ライブラリ。 * <[[C++/標準ライブラリ/csetjmp|csetjmp]]> &mdash; 非局所ジャンプのサポート。 * <[[C++/標準ライブラリ/csignal|csignal]]> &mdash; シグナル処理のサポート。 * <[[C++/標準ライブラリ/cstdarg|cstdarg]]> &mdash; 可変引数リストの操作。 * <[[C++/標準ライブラリ/cstddef|cstddef]]> &mdash; 標準型とマクロ。 * <[[C++/標準ライブラリ/cstdint|cstdint]]> &mdash; 固定幅整数型。 * <[[C++/標準ライブラリ/cstdio|cstdio]]> &mdash; 標準入出力関数。 * <[[C++/標準ライブラリ/cstdlib|cstdlib]]> &mdash; 標準ライブラリのユーティリティ。 * <[[C++/標準ライブラリ/cstring|cstring]]> &mdash; 文字列操作関数。 * <[[C++/標準ライブラリ/ctime|ctime]]> &mdash; 時間処理関数。 * <[[C++/標準ライブラリ/cuchar|cuchar]]> &mdash; Unicode文字操作関数。 * <[[C++/標準ライブラリ/cwchar|cwchar]]> &mdash; ワイド文字操作関数。 * <[[C++/標準ライブラリ/cwctype|cwctype]]> &mdash; ワイド文字分類と変換。 === C言語ヘッダー === * <[[C言語/標準ライブラリ/assert.h|assert.h]]> * <[[C言語/標準ライブラリ/complex.h|complex.h]]> * <[[C言語/標準ライブラリ/ctype.h|ctype.h]]> * <[[C言語/標準ライブラリ/errno.h|errno.h]]> * <[[C言語/標準ライブラリ/fenv.h|fenv.h]]> * <[[C言語/標準ライブラリ/float.h|float.h]]> * <[[C言語/標準ライブラリ/inttypes.h|inttypes.h]]> * <[[C言語/標準ライブラリ/iso646.h|iso646.h]]> * <[[C言語/標準ライブラリ/limits.h|limits.h]]> * <[[C言語/標準ライブラリ/locale.h|locale.h]]> * <[[C言語/標準ライブラリ/math.h|math.h]]> * <[[C言語/標準ライブラリ/setjmp.h|setjmp.h]]> * <[[C言語/標準ライブラリ/signal.h|signal.h]]> * <[[C言語/標準ライブラリ/stdalign.h|stdalign.h]]> * <[[C言語/標準ライブラリ/stdarg.h|stdarg.h]]> * <[[C言語/標準ライブラリ/stdatomic.h|stdatomic.h]]> * <[[C言語/標準ライブラリ/stdbool.h|stdbool.h]]> * <[[C言語/標準ライブラリ/stddef.h|stddef.h]]> * <[[C言語/標準ライブラリ/stdint.h|stdint.h]]> * <[[C言語/標準ライブラリ/stdio.h|stdio.h]]> * <[[C言語/標準ライブラリ/stdlib.h|stdlib.h]]> * <[[C言語/標準ライブラリ/string.h|string.h]]> * <[[C言語/標準ライブラリ/tgmath.h|tgmath.h]]> * <[[C言語/標準ライブラリ/time.h|time.h]]> * <[[C言語/標準ライブラリ/uchar.h|uchar.h]]> * <[[C言語/標準ライブラリ/wchar.h|wchar.h]]> * <[[C言語/標準ライブラリ/wctype.h|wctype.h]]> :{| class="sortable wikitable" |+ 標準ライブラリヘッダー分類表 ! ヘッダー ||style="width:7rem"| 分類 || 初出 || 説明 |- | <[[C++/標準ライブラリ/concepts|concepts]]> &mdash; || コンセプト || C++20 || コンセプト基本ライブラリ |- | <[[C++/標準ライブラリ/coroutine|coroutine]]> &mdash; || コルーチン || C++20 || コルーチンサポートライブラリ |- | <[[C++/標準ライブラリ/any|any]]> &mdash; || ユーティリティ || C++17 || <code>std::any</code>クラス |- | <[[C++/標準ライブラリ/bitset|bitset]]> &mdash; || ユーティリティ || - || <code>std::bitset</code>クラステンプレート |- | <[[C++/標準ライブラリ/chrono|chrono]]> &mdash; || ユーティリティ || C++11 || C++時間ユーティリティ |- | <[[C++/標準ライブラリ/compare|compare]]> &mdash; || ユーティリティ || C++20 || 3方向比較演算子サポート |- | <[[C++/標準ライブラリ/csetjmp|csetjmp]]> &mdash; || ユーティリティ || - || 実行コンテキストを保存/ジャンプするマクロ(と関数) |- | <[[C++/標準ライブラリ/csignal|csignal]]> &mdash; || ユーティリティ || - || シグナル管理の関数とマクロ定数 |- | <[[C++/標準ライブラリ/cstdarg|cstdarg]]> &mdash; || ユーティリティ || - || 可変長引数リストの処理 |- | <[[C++/標準ライブラリ/cstddef|cstddef]]> &mdash; || ユーティリティ || - || 標準マクロとtypedef |- | <[[C++/標準ライブラリ/cstdlib|cstdlib]]> &mdash; || ユーティリティ || - || 一般的なユーティリティ:プログラム制御、動的メモリ割り当て、乱数、ソートと検索 |- | <[[C++/標準ライブラリ/ctime|ctime]]> &mdash; || ユーティリティ || - || C形式の時刻/日付ユーティリティ |- | <[[C++/標準ライブラリ/debugging|debugging]]> &mdash; || ユーティリティ || C++26 || デバッグライブラリ |- | <[[C++/標準ライブラリ/expected|expected]]> &mdash; || ユーティリティ || C++23 || <code>std::expected</code>クラステンプレート |- | <[[C++/標準ライブラリ/functional|functional]]> &mdash; || ユーティリティ || - || 関数オブジェクト、関数呼び出し、バインド操作、参照ラッパー |- | <[[C++/標準ライブラリ/initializer_list|initializer_list]]> &mdash; || ユーティリティ || C++11 || <code>std::initializer_list</code>クラステンプレート |- | <[[C++/標準ライブラリ/optional|optional]]> &mdash; || ユーティリティ || C++17 || <code>std::optional</code>クラステンプレート |- | <[[C++/標準ライブラリ/source_location|source_location]]> &mdash; || ユーティリティ || C++20 || ソースコード位置を取得する手段を提供 |- | <[[C++/標準ライブラリ/tuple|tuple]]> &mdash; || ユーティリティ || C++11 || <code>std::tuple</code>クラステンプレート |- | <[[C++/標準ライブラリ/type_traits|type_traits]]> &mdash; || ユーティリティ || C++11 || コンパイル時型情報 |- | <[[C++/標準ライブラリ/typeindex|typeindex]]> &mdash; || ユーティリティ || C++11 || <code>std::type_index</code> |- | <[[C++/標準ライブラリ/typeinfo|typeinfo]]> &mdash; || ユーティリティ || - || 実行時型情報ユーティリティ |- | <[[C++/標準ライブラリ/utility|utility]]> &mdash; || ユーティリティ || - || 様々なユーティリティコンポーネント |- | <[[C++/標準ライブラリ/variant|variant]]> &mdash; || ユーティリティ || C++17 || <code>std::variant</code>クラステンプレート |- | <[[C++/標準ライブラリ/version|version]]> &mdash; || ユーティリティ || C++20 || 実装依存のライブラリ情報を提供 |- | <[[C++/標準ライブラリ/memory|memory]]> &mdash; || 動的メモリ管理 || - || 高レベルメモリ管理ユーティリティ |- | <[[C++/標準ライブラリ/memory_resource|memory_resource]]> &mdash; || 動的メモリ管理 || C++17 || 多相的アロケータとメモリリソース |- | <[[C++/標準ライブラリ/new|new]]> &mdash; || 動的メモリ管理 || - || 低レベルメモリ管理ユーティリティ |- | <[[C++/標準ライブラリ/scoped_allocator|scoped_allocator]]> &mdash; || 動的メモリ管理 || C++11 || ネストされたアロケータクラス |- | <[[C++/標準ライブラリ/cfloat|cfloat]]> &mdash; || 数値限界 || - || 浮動小数点型の限界値 |- | <[[C++/標準ライブラリ/cinttypes|cinttypes]]> &mdash; || 数値限界 || C++11 || 書式マクロ、<code>intmax_t</code>と<code>uintmax_t</code>、数学と変換 |- | <[[C++/標準ライブラリ/climits|climits]]> &mdash; || 数値限界 || - || 整数型の限界値 |- | <[[C++/標準ライブラリ/cstdint|cstdint]]> &mdash; || 数値限界 || C++11 || 固定幅整数型と他の型の限界値 |- | <[[C++/標準ライブラリ/limits|limits]]> &mdash; || 数値限界 || - || 算術型のプロパティを問い合わせる統一された方法 |- | <[[C++/標準ライブラリ/stdfloat|stdfloat]]> &mdash; || 数値限界 || C++23 || オプションの拡張浮動小数点型 |- | <[[C++/標準ライブラリ/cassert|cassert]]> &mdash; || エラー処理 || - || ゼロと比較し、条件付きでマクロを定義 |- | <[[C++/標準ライブラリ/cerrno|cerrno]]> &mdash; || エラー処理 || - || 最後のエラー番号を含むマクロ |- | <[[C++/標準ライブラリ/exception|exception]]> &mdash; || エラー処理 || - || 例外処理ユーティリティ |- | <[[C++/標準ライブラリ/stacktrace|stacktrace]]> &mdash; || エラー処理 || C++23 || スタックトレースライブラリ |- | <[[C++/標準ライブラリ/stdexcept|stdexcept]]> &mdash; || エラー処理 || - || 標準例外オブジェクト |- | <[[C++/標準ライブラリ/system_error|system_error]]> &mdash; || エラー処理 || C++11 || <code>std::error_code</code>を定義(プラットフォーム依存のエラーコード) |- | <[[C++/標準ライブラリ/cctype|cctype]]> &mdash; || 文字列 || - || ナロー文字のカテゴリを判別する関数 |- | <[[C++/標準ライブラリ/charconv|charconv]]> &mdash; || 文字列 || C++17 || <code>std::to_chars</code>と<code>std::from_chars</code> |- | <[[C++/標準ライブラリ/cstring|cstring]]> &mdash; || 文字列 || - || 様々なナロー文字列処理関数 |- | <[[C++/標準ライブラリ/cuchar|cuchar]]> &mdash; || 文字列 || C++11 || C形式のUnicode文字変換関数 |- | <[[C++/標準ライブラリ/cwchar|cwchar]]> &mdash; || 文字列 || - || 様々なワイド/マルチバイト文字列処理関数 |- | <[[C++/標準ライブラリ/cwctype|cwctype]]> &mdash; || 文字列 || - || ワイド文字のカテゴリを判別する関数 |- | <[[C++/標準ライブラリ/format|format]]> &mdash; || 文字列 || C++20 || 書式化ライブラリ(<code>std::format</code>を含む) |- | <[[C++/標準ライブラリ/string|string]]> &mdash; || 文字列 || - || <code>std::basic_string</code>クラステンプレート |- | <[[C++/標準ライブラリ/string_view|string_view]]> &mdash; || 文字列 || C++17 || <code>std::basic_string_view</code>クラステンプレート |- | <[[C++/標準ライブラリ/array|array]]> &mdash; || コンテナ || C++11 || <code>std::array</code>コンテナ |- | <[[C++/標準ライブラリ/deque|deque]]> &mdash; || コンテナ || - || <code>std::deque</code>コンテナ |- | <[[C++/標準ライブラリ/flat_map|flat_map]]> &mdash; || コンテナ || C++23 || <code>std::flat_map</code>と<code>std::flat_multimap</code>コンテナアダプター |- | <[[C++/標準ライブラリ/flat_set|flat_set]]> &mdash; || コンテナ || C++23 || <code>std::flat_set</code>と<code>std::flat_multiset</code>コンテナアダプター |- | <[[C++/標準ライブラリ/forward_list|forward_list]]> &mdash; || コンテナ || C++11 || <code>std::forward_list</code>コンテナ |- | <[[C++/標準ライブラリ/list|list]]> &mdash; || コンテナ || - || <code>std::list</code>コンテナ |- | <[[C++/標準ライブラリ/map|map]]> &mdash; || コンテナ || - || <code>std::map</code>と<code>std::multimap</code>の連想コンテナ |- | <[[C++/標準ライブラリ/mdspan|mdspan]]> &mdash; || コンテナ || C++23 || <code>std::mdspan</code>ビュー |- | <[[C++/標準ライブラリ/queue|queue]]> &mdash; || コンテナ || - || <code>std::queue</code>と<code>std::priority_queue</code>のコンテナアダプター |- | <[[C++/標準ライブラリ/set|set]]> &mdash; || コンテナ || - || <code>std::set</code>と<code>std::multiset</code>の連想コンテナ |- | <[[C++/標準ライブラリ/span|span]]> &mdash; || コンテナ || C++20 || <code>std::span</code>ビュー |- | <[[C++/標準ライブラリ/stack|stack]]> &mdash; || コンテナ || - || <code>std::stack</code>コンテナアダプター |- | <[[C++/標準ライブラリ/unordered_map|unordered_map]]> &mdash; || コンテナ || C++11 || <code>std::unordered_map</code>と<code>std::unordered_multimap</code>の非順序連想コンテナ |- | <[[C++/標準ライブラリ/unordered_set|unordered_set]]> &mdash; || コンテナ || C++11 || <code>std::unordered_set</code>と<code>std::unordered_multiset</code>の非順序連想コンテナ |- | <[[C++/標準ライブラリ/vector|vector]]> &mdash; || コンテナ || - || <code>std::vector</code>コンテナ |- | <[[C++/標準ライブラリ/iterator|iterator]]> &mdash; || イテレータ || - || 範囲イテレータ |- | <[[C++/標準ライブラリ/generator|generator]]> &mdash; || 範囲 || C++23 || <code>std::generator</code>クラステンプレート |- | <[[C++/標準ライブラリ/ranges|ranges]]> &mdash; || 範囲 || C++20 || 範囲アクセス、プリミティブ、要件、ユーティリティ、アダプター |- | <[[C++/標準ライブラリ/algorithm|algorithm]]> &mdash; || アルゴリズム || - || 範囲に作用するアルゴリズム |- | <[[C++/標準ライブラリ/execution|execution]]> &mdash; || アルゴリズム || C++17 || アルゴリズムの並列バージョンに対する既定の実行ポリシー |- | <[[C++/標準ライブラリ/bit|bit]]> &mdash; || 数値 || C++20 || ビット操作関数 |- | <[[C++/標準ライブラリ/cfenv|cfenv]]> &mdash; || 数値 || C++11 || 浮動小数点環境アクセス関数 |- | <[[C++/標準ライブラリ/cmath|cmath]]> &mdash; || 数値 || - || 共通の数学関数 |- | <[[C++/標準ライブラリ/complex|complex]]> &mdash; || 数値 || - || 複素数型 |- | <[[C++/標準ライブラリ/linalg|linalg]]> &mdash; || 数値 || C++26 || 基本的な線形代数アルゴリズム |- | <[[C++/標準ライブラリ/numbers|numbers]]> &mdash; || 数値 || C++20 || 数学定数 |- | <[[C++/標準ライブラリ/numeric|numeric]]> &mdash; || 数値 || - || 範囲内の値に対する数値演算 |- | <[[C++/標準ライブラリ/random|random]]> &mdash; || 数値 || C++11 || 乱数生成器と分布 |- | <[[C++/標準ライブラリ/ratio|ratio]]> &mdash; || 数値 || C++11 || コンパイル時有理数演算 |- | <[[C++/標準ライブラリ/valarray|valarray]]> &mdash; || 数値 || - || 値の配列を表現し操作するためのクラス |- | <[[C++/標準ライブラリ/clocale|clocale]]> &mdash; || 地域化 || - || C言語の地域化ユーティリティ |- | <[[C++/標準ライブラリ/codecvt|codecvt]]> &mdash; || 地域化 || C++11 || Unicode変換機能 (C++17で非推奨、C++26で削除) |- | <[[C++/標準ライブラリ/locale|locale]]> &mdash; || 地域化 || - || 地域化ユーティリティ |- | <[[C++/標準ライブラリ/text_encoding|text_encoding]]> &mdash; || 地域化 || C++26 || テキストエンコーディングの識別 |- | <[[C++/標準ライブラリ/cstdio|cstdio]]> &mdash; || 入出力 || - || C形式の入出力関数 |- | <[[C++/標準ライブラリ/fstream|fstream]]> &mdash; || 入出力 || - || <code>std::basic_fstream</code>、<code>std::basic_ifstream</code>、<code>std::basic_ofstream</code>クラステンプレートといくつかのtypedef |- | <[[C++/標準ライブラリ/iomanip|iomanip]]> &mdash; || 入出力 || - || 入出力のフォーマットを制御するヘルパー関数 |- | <[[C++/標準ライブラリ/ios|ios]]> &mdash; || 入出力 || - || <code>std::ios_base</code>クラス、<code>std::basic_ios</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/iosfwd|iosfwd]]> &mdash; || 入出力 || - || 入出力ライブラリのすべてのクラスの前方宣言 |- | <[[C++/標準ライブラリ/iostream|iostream]]> &mdash; || 入出力 || - || 様々な標準ストリームオブジェクト |- | <[[C++/標準ライブラリ/istream|istream]]> &mdash; || 入出力 || - || <code>std::basic_istream</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/ostream|ostream]]> &mdash; || 入出力 || - || <code>std::basic_ostream</code>、<code>std::basic_iostream</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/print|print]]> &mdash; || 入出力 || C++23 || 書式付き出力ライブラリ(<code>std::print</code>を含む) |- | <[[C++/標準ライブラリ/spanstream|spanstream]]> &mdash; || 入出力 || C++23 || <code>std::basic_spanstream</code>、<code>std::basic_ispanstream</code>、<code>std::basic_ospanstream</code>クラステンプレート、typedef |- | <[[C++/標準ライブラリ/sstream|sstream]]> &mdash; || 入出力 || - || <code>std::basic_stringstream</code>、<code>std::basic_istringstream</code>、<code>std::basic_ostringstream</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/streambuf|streambuf]]> &mdash; || 入出力 || - || <code>std::basic_streambuf</code>クラステンプレート |- | <[[C++/標準ライブラリ/syncstream|syncstream]]> &mdash; || 入出力 || C++20 || <code>std::basic_osyncstream</code>、<code>std::basic_syncbuf</code>、typedef |- | <[[C++/標準ライブラリ/filesystem|filesystem]]> &mdash; || ファイルシステム || C++17 || <code>std::path</code>クラスとサポート関数 |- | <[[C++/標準ライブラリ/regex|regex]]> &mdash; || 正規表現 || C++11 || 正規表現処理のサポートするクラス、アルゴリズム、イテレータ |- | <[[C++/標準ライブラリ/atomic|atomic]]> &mdash; || 原子操作 || C++11 || 原子操作ライブラリ |- | <[[C++/標準ライブラリ/barrier|barrier]]> &mdash; || スレッドサポート || C++20 || バリア |- | <[[C++/標準ライブラリ/condition_variable|condition_variable]]> &mdash; || スレッドサポート || C++11 || スレッド待機条件 |- | <[[C++/標準ライブラリ/future|future]]> &mdash; || スレッドサポート || C++11 || 非同期コンピューティングのプリミティブ |- | <[[C++/標準ライブラリ/hazard_pointer|hazard_pointer]]> &mdash; || スレッドサポート || C++26 || ハザードポインター |- | <[[C++/標準ライブラリ/latch|latch]]> &mdash; || スレッドサポート || C++20 || ラッチ |- | <[[C++/標準ライブラリ/mutex|mutex]]> &mdash; || スレッドサポート || C++11 || 相互排除プリミティブ |- | <[[C++/標準ライブラリ/rcu|rcu]]> &mdash; || スレッドサポート || C++26 || Read-Copy Update メカニズム |- | <[[C++/標準ライブラリ/semaphore|semaphore]]> &mdash; || スレッドサポート || C++20 || セマフォ |- | <[[C++/標準ライブラリ/shared_mutex|shared_mutex]]> &mdash; || スレッドサポート || C++14 || 共有相互排除プリミティブ | |- | <[[C++/標準ライブラリ/stop_token|stop_token]]> &mdash; || スレッドサポート || C++20 || <code>std::jthread</code>の停止トークン |- | <[[C++/標準ライブラリ/thread|thread]]> &mdash; || スレッドサポート || C++11 || <code>std::thread</code>クラスとサポート関数 |- | <[[C言語/標準ライブラリ/assert.h|assert.h]]> &mdash; || C互換 || -- || <cassert>と同様の振る舞い |- | <[[C言語/標準ライブラリ/ctype.h|ctype.h]]> &mdash; || C互換 || -- || <cctype>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/errno.h|errno.h]]> &mdash; || C互換 || -- || <cerrno>と同様の振る舞い |- | <[[C言語/標準ライブラリ/fenv.h|fenv.h]]> &mdash; || C互換 || -- || <cfenv>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/float.h|float.h]]> &mdash; || C互換 || -- || <cfloat>と同様の振る舞い |- | <[[C言語/標準ライブラリ/inttypes.h|inttypes.h]]> &mdash; || C互換 || -- || <cinttypes>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/limits.h|limits.h]]> &mdash; || C互換 || -- || <climits>と同様の振る舞い |- | <[[C言語/標準ライブラリ/locale.h|locale.h]]> &mdash; || C互換 || -- || <clocale>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/math.h|math.h]]> &mdash; || C互換 || -- || <cmath>からすべての名前(数学特殊関数の名前を除く)が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/setjmp.h|setjmp.h]]> &mdash; || C互換 || -- || <csetjmp>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/signal.h|signal.h]]> &mdash; || C互換 || -- || <csignal>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdarg.h|stdarg.h]]> &mdash; || C互換 || -- || <cstdarg>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stddef.h|stddef.h]]> &mdash; || C互換 || -- || <cstddef>から<code>std::byte</code>と関連する関数の名前を除きすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdint.h|stdint.h]]> &mdash; || C互換 || -- || <cstdint>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdio.h|stdio.h]]> &mdash; || C互換 || -- || <cstdio>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdlib.h|stdlib.h]]> &mdash; || C互換 || -- || <cstdlib>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/string.h|string.h]]> &mdash; || C互換 || -- || <cstring>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/time.h|time.h]]> &mdash; || C互換 || -- || <ctime>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/uchar.h|uchar.h]]> &mdash; || C互換 || -- || <cuchar>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/wchar.h|wchar.h]]> &mdash; || C互換 || -- || <cwchar>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/wctype.h|wctype.h]]> &mdash; || C互換 || -- || <cwctype>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdatomic.h|stdatomic.h]]> &mdash; || 特殊C互換 || -- || _Atomicマクロを定義し、C標準ライブラリから対応する コンポーネントを提供する |} == コンテナ == コンテナは、データを格納するためのオブジェクトであり、C++の標準ライブラリではさまざまな種類のコンテナが提供されています。それぞれのコンテナは、異なる目的や使用方法に適しています。以下では、主要なコンテナについて詳しく説明します。 === コンテナの種類 === C++ 標準ライブラリは、以下の主要なコンテナを提供しています。 * '''配列 (std::array)''': 固定長の要素の集合を表す。ランダムアクセスが高速だが、サイズ変更ができない。 * '''ベクター (std::vector)''': 動的な要素の集合を表す。要素の挿入・削除が効率的かつ、ランダムアクセスも高速。 * '''リスト (std::list)''': 双方向連結リストを表す。要素の挿入・削除が効率的だが、ランダムアクセスは遅い。 * '''スタック (std::stack)''': LIFO (Last In First Out) 構造を表す。プッシュとポップの操作を提供。 * '''キュー (std::queue)''': FIFO (First In First Out) 構造を表す。エンキューとデキューの操作を提供。 * '''デック (std::deque)''': 両端キューを表す。先頭と末尾の両方から要素の挿入・削除が可能。 * '''セット (std::set)''': 重複のない要素の集合を表す。要素は昇順にソート済み。 * '''マップ (std::map)''': キーと値のペアの集合を表す。キーに基づいて値を検索できる。 * '''アンオーダードセット (std::unordered_set)''': ハッシュテーブルを用いて要素を格納する。重複のない要素の集合を表す。 * '''アンオーダードマップ (std::unordered_map)''': ハッシュテーブルを用いてキーと値のペアを格納する。 === 各コンテナの詳細 === それぞれのコンテナについて、以下に詳細を説明します。 ==== 配列 (std::array) ==== :<syntaxhighlight lang=c++> auto my_array = std::array{2, 3, 5, 7, 11}; </syntaxhighlight> * 要素の数と型は固定で、コンパイル時に決定される。 * ランダムアクセスが高速 (O(1))。 * 要素の挿入・削除はできない。 * メモリ消費量が事前に予測可能。 * 領域はスタックに確保される。 * コア言語の配列とは異なり、イテレータやアルゴリズムを適用できる。 === ベクター (std::vector)=== :<syntaxhighlight lang=c++> auto my_vector = std::vector{2, 3, 5, 7, 11}; my_vector.push_back(13); my_vector.push_back(17); my_vector.push_back(19); </syntaxhighlight> * 要素数は可変で、実行時に動的に変更できる。 * ランダムアクセスが高速 (O(1))。 * 要素の挿入・削除が効率的 (挿入: O(1) or O(n)、削除: O(1) or O(n))。 * メモリ消費量は動的に変化する。 * 領域はヒープに確保される。 * スコープを離れる自動的に領域開放される。 === リスト (std::list)=== :<syntaxhighlight lang=c++> auto my_list = std::list{2, 3, 5, 7, 11}; my_list.push_back(13); my_list.push_back(17); my_list.push_back(19); </syntaxhighlight> * 要素は双方向連結リストで管理される。 * ランダムアクセスは遅い (O(n))。 * 要素の挿入・削除が効率的 (O(1))。 * 隣接要素へのアクセスや挿入・削除に適している。 === スタック (std::stack)=== :<syntaxhighlight lang=c++> auto my_stack = std::stack{2, 3, 5, 7, 11}; my_stack.push(13); my_stack.push(17); my_stack.push(19); int peek = my_stack.top(); int top = my_stack.pop(); </syntaxhighlight> * LIFO 構造を実装。 * プッシュとポップの操作を提供。 * ネストされたスコープの管理などに利用される。 === キュー (std::queue)=== :<syntaxhighlight lang=c++> std::queue<int> my_queue; my_queue.push(1); my_queue.push(2); my_queue.push(3); int front = my_queue.front(); my_queue.pop(); </syntaxhighlight> * FIFO 構造を実装。 * エンキューとデキューの操作を提供。 * タスクのキューイングなどに利用される。 === デック (std::deque)=== :<syntaxhighlight lang=c++> std::deque<int> my_deque; my_deque.push_back(1); my_deque.push_front(2); my_deque.push_back(3); int front = my_deque.front(); int back = my_deque.back(); my_deque.pop_front(); my_deque.pop_back();</syntaxhighlight> * 両端キューとして動作 * 先頭と末尾の両方から要素の挿入・削除が可能。 * ランダムアクセスも可能だが、<code>std::vector</code>ほど高速ではない (O(log n))。 * <code>std::vector</code>と<code>std::list</code>の両方の特性を持つ。 === セット (std::set)=== :<syntaxhighlight lang=c++> std::set<int> my_set; my_set.insert(1); my_set.insert(2); my_set.insert(3); bool found = my_set.find(2) != my_set.end(); </syntaxhighlight> * 重複のない要素の集合を表す。 * 要素は昇順にソート済み。 * 探索、挿入、削除の操作が高速 (O(log n))。 * 順序を保持する必要がある集合の操作に適している。 === マップ (std::map)=== :<syntaxhighlight lang=c++> std::map<std::string, int> my_map; my_map["key1"] = 1; my_map["key2"] = 2; my_map["key3"] = 3; int value = my_map["key2"];</syntaxhighlight> * キーと値のペアの集合を表す。 * キーに基づいて値を効率的に検索できる (O(log n))。 * 挿入、削除、検索の操作が高速 (O(log n))。 * キーと値の対応関係を保持する必要がある場合に適している。 ==== アンオーダードセット (std::unordered_set) ==== :<syntaxhighlight lang=c++> std::unordered_set<int> my_set; my_set.insert(1); my_set.insert(2); my_set.insert(3); bool found = my_set.find(2) != my_set.end();</syntaxhighlight> * ハッシュテーブルを用いて要素を格納。 * 重複のない要素の集合を表す。 * 探索、挿入、削除の操作が非常に高速 (平均 O(1))。 * 順序を保持する必要がない集合の操作に適している。 === アンオーダードマップ (std::unordered_map)=== :<syntaxhighlight lang=c++> std::unordered_map<std::string, int> my_map; my_map["key1"] = 1; my_map["key2"] = 2; my_map["key3"] = 3; int value = my_map["key2"];</syntaxhighlight> * ハッシュテーブルを用いてキーと値のペアを格納。 * キーに基づいて値を非常に効率的に検索できる (平均 O(1))。 * 挿入、削除、検索の操作が非常に高速 (平均 O(1))。 * キーと値の対応関係を保持する必要がある場合に適しているが、順序は保持されない。 === コンテナの選択 === 適切なコンテナを選択することは、プログラムのパフォーマンスと効率に大きく影響します。 * コア言語の配列と同様に高速かつスタックにインスタンスを起きたく、イテレータやアルゴリズムを使いたい場合は <code>std::array</code>を選択します。 * 要素へのランダムアクセスが必要な場合は、<code>std::vector</code>または<code>std::deque</code>を選択します。 * 要素の挿入・削除が頻繁に行われる場合は、<code>std::vector</code>または<code>std::list</code>を選択します。 * 順序を保持する必要のない集合を扱う場合は、<code>std::unordered_set</code>または<code>std::unordered_map</code>を選択します。 * キーと値のペアを扱う場合は、<code>std::unordered_map</code>または<code>std::unordered_map</code>を選択します。 各コンテナの特性をよく理解し、状況に応じて適切なコンテナを選択することが重要です。 ; まとめ C++ 標準ライブラリは、さまざまなコンテナを提供しており、それぞれ異なる特徴と利点を持っています。プログラムの目的に合ったコンテナを選択することで、効率的で高速なコードを書くことができます。 == アルゴリズム == アルゴリズムとは、問題を解決するための手順の明確な定義です。一般的に、以下の要素で構成されます。 * '''入力''': アルゴリズムが処理するデータ * '''処理''': 入力データに対して行う操作 * '''出力''': アルゴリズムによって生成される結果 C++標準ライブラリでは、様々な種類のアルゴリズムが提供されており、それぞれ異なる入力、処理、出力を持つように設計されています。 === 標準ライブラリにおけるアルゴリズム === C++標準ライブラリのアルゴリズムは、ヘッダー <code><algorithm></code> に定義されています。このヘッダーには、以下の機能が含まれます。 {| class="wikitable" !分類 !代表的なアルゴリズム |- !検索 |<code>std::find</code>, <code>std::search</code>, <code>std::count</code>, <code>std::count_if</code> |- |ソート |<code>std::sort</code>, <code>std::stable_sort</code>, <code>std::partial_sort</code>, <code>std::nth_element</code> |- !範囲 |<code>std::copy</code>, <code>std::copy_if</code>, <code>std::swap</code>, <code>std::fill</code>, <code>std::fill_n</code>, <code>std::replace</code>, <code>std::replace_if</code>, <code>std::remove</code>, <code>std::remove_if</code> |- !変換 |<code>std::transform</code>, <code>std::for_each</code>, <code>std::generate</code>, <code>std::generate_n</code> |- !その他 |<code>std::max</code>, <code>std::min</code>, <code>std::minmax</code>, <code>std::swap_ranges</code>, <code>std::set_difference</code>, <code>std::set_intersection</code>, <code>std::set_union</code>, <code>std::adjacent_find</code>, <code>std::mismatch</code>, <code>std::copy_backward</code>, <code>std::move</code>, <code>std::move_backward</code>, <code>std::rotate</code>, <code>std::rotate_copy</code>, <code>std::shuffle</code>, <code>std::random_shuffle</code>, <code>std::partition</code>, <code>std::partition_point</code>, <code>std::stable_partition</code>, <code>std::is_sorted</code>, <code>std::is_partially_sorted</code>, <code>std::unique</code>, <code>std::unique_copy</code>, <code>std::count_elements</code>, <code>std::upper_bound</code>, <code>std::lower_bound</code>, <code>std::binary_search</code>, <code>std::merge</code>, <code>std::inplace_merge</code>, <code>std::set_union_of_ranges</code>, <code>std::lexicographical_compare</code>, <code>std::includes</code>, <code>std::adjacent_difference</code>, <code>std::search_n</code>, <code>std::copy_n</code>, <code>std::iota</code>, <code>std::iota_n</code>, <code>std::for_each_n</code>, <code>std::generate_n</code>, <code>std::gather</code>, <code>std::scatter</code>, <code>std::reduce</code>, <code>std::reduce_right</code>, <code>std::adjacent_reduce</code>, <code>std::accumulate</code>, <code>std::accumulate_right</code>, <code>std::transform_reduce</code>, <code>std::transform_reduce_right</code>, <code>std::max_element</code>, <code>std::min_element</code>, <code>std::max_element_n</code>, <code>std::min_element_n</code>, <code>std::minmax_element</code>, <code>std::minmax_element_n</code>, <code>std::any_of</code>, <code>std::all_of</code>, <code>std::none_of</code>, <code>std::count_if_n</code>, <code>std::find_if</code>, <code>std::find_if_n</code>, <code>std::find_first_of</code>, <code>std::find_first_of_n</code>, <code>std::any_of_n</code>, <code>std::all_of_n</code>, <code>std::none_of_n</code> |} === ソート (sort) === ソートは、データの要素を昇順または降順に整列するアルゴリズムです。C++の標準ライブラリでは、<code>std::sort</code>関数が提供されており、クイックソートやヒープソートなどの高速なソートアルゴリズムが実装されています。 === 検索 (search) === 検索は、与えられたデータから特定の要素を見つけるアルゴリズムです。C++の標準ライブラリでは、<code>std::find</code>関数が提供されており、線形検索やバイナリ検索などの効率的な検索アルゴリズムが実装されています。 === 二分探索 (binary_search) === 二分探索は、ソート済みのデータから特定の要素を効率的に見つけるアルゴリズムです。C++の標準ライブラリでは、<code>std::binary_search</code>関数が提供されており、対象の要素が存在するかどうかを判定することができます。 === 変更 (modify) === 変更は、データの要素を変更する操作を行うアルゴリズムです。C++の標準ライブラリでは、<code>std::transform</code>関数が提供されており、与えられた操作を各要素に適用することができます。 === パーミュテーション (permutation) === パーミュテーションは、与えられた要素の順列を生成するアルゴリズムです。C++の標準ライブラリでは、<code>std::next_permutation</code>関数が提供されており、要素の順列を効率的に生成することができます。 === 集計 (accumulate) === 集計は、与えられたデータの要素を合計する操作を行うアルゴリズムです。C++の標準ライブラリでは、<code>std::accumulate</code>関数が提供されており、要素の合計を計算することができます。 :<syntaxhighlight lang=c++> #include <iostream> #include <numeric> // std::accumulate #include <vector> auto main() -> int { auto numbers = std::vector{1, 2, 3, 4, 5}; auto const sum = std::accumulate(numbers.begin(), numbers.end(), 0); std::cout << "Sum: " << sum << std::endl; return 0; } </syntaxhighlight> === 順列生成 (next_permutation) === 順列生成は、与えられた要素の全ての順列を生成するアルゴリズムです。C++の標準ライブラリでは、<code>std::next_permutation</code>関数が提供されており、与えられた要素の順列を効率的に生成することができます。 === ヒープ操作 (heap) === ヒープ操作は、ヒープデータ構造を操作するアルゴリズムです。C++の標準ライブラリでは、<code>std::make_heap</code>、<code>std::push_heap</code>、<code>std::pop_heap</code>などの関数が提供されており、ヒープを構築したり、要素を追加・削除したりすることができます。 == イテレータとアダプタ == '''イテレータ'''(iterator)は、コンテナの要素を参照し、反復処理を実現するためのオブジェクトです。標準ライブラリでは様々なイテレータが定義されており、それらを使うことで柔軟でパフォーマンスの良いアルゴリズムを記述できます。 代表的なイテレータには以下のようなものがあります。 ; 入力イテレータ(input iterator) : 要素の読み取り専用 ; 出力イテレータ(output iterator) : 要素の書き込み専用 ; 前方イテレータ(forward iterator) : 単方向の反復が可能 ; 双方向イテレータ(bidirectional iterator) : 前方と逆方向の反復が可能 ; ランダムアクセスイテレータ(random access iterator) : 任意のインデックスにアクセス可能 :<syntaxhighlight lang=c++> auto v = std::vector{1, 2, 3, 4, 5}; for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; // 出力: 1 2 3 4 5 } </syntaxhighlight> '''アダプタ'''(adapter)は、既存のコンテナやイテレータから新しいビューを生成するための仕組みです。アダプタを使うことで、コピーを作らずに既存のコンテナの動作をカスタマイズできます。 よく使われるシーケンスアダプタには以下のようなものがあります。 ; std::reverse_iterator : 逆向きのイテレータを生成 ; std::move_iterator : ムーブ操作ができるイテレータを生成 ; std::inserter : 出力イテレータをコンテナに挿入操作するアダプタ :<syntaxhighlight lang=c++> auto lst = std::list{1, 2, 3, 4, 5}; std::vector<int> vec(lst.size()); std::copy(lst.begin(), lst.end(), std::back_inserter(vec)); // vecには{1, 2, 3, 4, 5}が代入される </syntaxhighlight> このように、イテレータとアダプタを適切に組み合わせることで、C++の標準ライブラリを活用した効率的で柔軟なコーディングが可能になります。 == 文字列、文字列操作と正規表現 == === 文字列(std::string, std::wstring) === C++では<code>std::string</code>クラスが文字列を表すために使われます。このクラスは様々なコンストラクタと、文字列の連結、検索、置換などの操作を行うメンバー関数を提供しています。 :<syntaxhighlight lang=c++> std::string s1 = "Hello"; // コンストラクタ std::string s2 = s1 + " World"; // 連結 // 部分文字列の検索 if (s2.find("llo") != std::string::npos) { /* ... */ } s2.replace(6, 5, "Universe"); // 置換 </syntaxhighlight> <code>std::wstring</code>はワイド文字列を扱うためのクラスで、多言語対応アプリケーションで使われます。 === 文字列ストリーム(std::stringstream) === <code>std::stringstream</code>クラスを使うと、stringオブジェクトと入出力ストリームの間で簡単に変換できます。 :<syntaxhighlight lang=c++> std::stringstream ss; ss << "Value = " << 3.14; std::string s = ss.str(); // s == "Value = 3.14" </syntaxhighlight> === 文字列リテラル(std::string_view, std::u8string_view) === C++17から導入された<code>std::string_view</code>はstring_literalを所有せずにビューとして参照するためのクラスです。メモリ消費を抑えられる一方で、nullターミネートを要求するので注意が必要です。 === 正規表現(std::regex, std::smatch, std::regex_replace, など) === C++11から正規表現をサポートするライブラリが導入されました。<code>std::regex</code>を使って正規表現オブジェクトを作成し、<code>std::smatch</code>でマッチング結果を扱えます。また、<code>std::regex_replace</code>で置換も行えます。 :<syntaxhighlight lang=c++> std::regex re("\\d+"); // 正規表現オブジェクト std::string s = "Sample 123 456"; std::smatch m; if (std::regex_search(s, m, re)) { // マッチング // m[0]にマッチした文字列が入る } std::string result = std::regex_replace(s, re, "NUM"); // Sample NUM NUM </syntaxhighlight> ECMAScriptの正規表現構文をサポートしており、文字列操作を行う上で非常に強力なツールとなっています。 == 入出力 == 入出力操作は、プログラミングにおいて非常に重要な要素です。C++の標準ライブラリでは、さまざまな形式のデータの読み書きを行うための豊富な機能が提供されています。以下では、主要な入出力について説明します。 === 標準入出力 (iostream) === 標準入出力は、プログラムとユーザーまたは他のプログラムの間でデータをやり取りするための機能です。C++の標準ライブラリでは、<code>std::cin</code>と<code>std::cout</code>というストリームオブジェクトを使用して標準入力と標準出力を操作することができます。これらのストリームを使用することで、データの読み取りや表示を簡単に行うことができます。 === ファイル入出力 (fstream) === ファイル入出力は、ファイルとプログラムの間でデータを読み書きするための機能です。C++の標準ライブラリでは、ファイル入出力ストリームを操作するための<code>std::ifstream</code>と<code>std::ofstream</code>クラスが提供されています。これらのクラスを使用することで、ファイルからデータを読み取ったり、ファイルにデータを書き込んだりすることができます。 === 【廃止】文字コード変換 (std::codecvt) === <code>std::codecvt</code>クラスは、C++17で非推奨となり、C++26で削除されることが決定されました。この変更の背景には、この機能がUnicodeの現在の標準をサポートしておらず、古いUCS-2エンコーディングのみをサポートしていたことがあります。 代替手段としては、次のようなオプションが考えられます。 ; <code>std::wstring_convert</code> : C++11で導入された<code>std::wstring_convert</code>クラスを使用します。このクラスは、広くサポートされているUTF-8、UTF-16、UTF-32エンコーディングをサポートしています。 :<syntaxhighlight lang=c++> std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv; std::u32string u32 = conv.from_bytes(u8"Hello"); std::string bytes = conv.to_bytes(u32); </syntaxhighlight> ; ライブラリの使用 : 外部ライブラリを使用することができます。例えば、ICUライブラリ(International Components for Unicode)は、Unicode文字列の変換や正規化など、幅広い機能を提供しています。 ; 独自の実装 : 特定のニーズに合わせて、独自の文字列変換ロジックを実装することもできます。ただし、Unicodeの扱いは複雑であるため、既存のライブラリを利用することをお勧めします。 また、文字列リテラルの導入により、ソースコード中に直接UTF-8やUTF-16、UTF-32の文字列を書くことができるようになりました。 :<syntaxhighlight lang=c++> auto u8_str = u8"UTF-8 文字列"; auto u_str = U"UTF-16 文字列"; auto U8_str = u8"UTF-8 文字列"; auto U_str = U"UTF-16 文字列"; </syntaxhighlight> さらに、C++17からは<code>std::byte</code>や<code>std::byte_traits</code>といった、バイトベースの操作を行うための機能が追加されています。文字変換の際にこれらを活用することで、<code>std::codecvt</code>に頼らずに済むケースが増えました。 <code>std::codecvt</code>クラスの廃止は、C++がUnicodeの最新の標準に対応するための変更です。代替手段を検討することで、アプリケーションのUnicode対応を改善できるでしょう。 === ファイルシステム (filesystem) === ファイルシステムは、ファイルやディレクトリの操作を行うための機能です。C++17からは、<code>std::filesystem</code>ライブラリが標準化され、ファイルやディレクトリの操作を行うためのさまざまなクラスや関数が提供されています。これにより、プログラムがファイルシステムを操作する際に、簡単にファイルやディレクトリを作成、削除、移動、検索することができます。 == 例外処理 == 例外処理は、プログラム実行中に予期しないエラーが発生した場合に、適切に対処するための仕組みです。C++の標準ライブラリでは、例外処理をサポートするためのさまざまな機能が提供されています。以下では、主要な例外処理について説明します。 === 例外の基本 (exception basics) === 例外は、プログラム実行中に予期しないエラーが発生した場合に発生します。例外は、プログラムの実行を中断し、エラーが発生した場所から例外処理のコードに制御を移します。例外処理は、例外が発生した際に適切な処理を行うための仕組みです。 === 例外の送出と捕捉 (throwing and catching exceptions) === 例外の送出は、予期しないエラーが発生した場合に、そのエラーを通知するために使用されます。C++では、<code>throw</code>キーワードを使用して例外を明示的に送出することができます。一方、例外の捕捉は、送出された例外を処理するための仕組みです。<code>try</code>ブロック内で例外が送出される可能性があるコードを記述し、その後に<code>catch</code>ブロックを使用して例外を捕捉し、適切な処理を行うことができます。 === 標準例外クラス (standard exception classes) === C++の標準ライブラリでは、さまざまな種類の例外を表すための標準例外クラスが提供されています。これらのクラスは、<code>std::exception</code>クラスを基底クラスとしており、異なる種類のエラーを表すために派生クラスとして使用されます。一般的な標準例外クラスには、<code>std::runtime_error</code>、<code>std::logic_error</code>、<code>std::invalid_argument</code>などがあります。これらのクラスは、特定の種類のエラーを表すために使用され、例外が送出された際にプログラムが適切に処理できるようにします。 == その他の重要な機能 == C++の標準ライブラリには、さまざまな追加機能が提供されています。以下では、その他の重要な機能について説明します。 === 時間と日付 (date and time) === 時間と日付の操作は、多くのアプリケーションで重要な要素です。C++の標準ライブラリでは、時間や日付を表すための<code>std::chrono</code>ライブラリが提供されています。このライブラリを使用することで、日付の取得、計算、比較などの操作を行うことができます。また、時間の測定や待機などの機能も提供されています。 === メモリ管理 (memory management) === メモリ管理は、プログラムが動作するために必要なメモリの割り当てと解放を行う重要な要素です。C++の標準ライブラリでは、メモリ管理を行うための機能が提供されており、<code>std::allocator</code>クラスや<code>std::shared_ptr</code>、<code>std::unique_ptr</code>などのスマートポインタが使用されます。これらの機能を使用することで、メモリリークや二重解放などの問題を回避することができます。 === スレッドと並行性 (threads and concurrency) === スレッドと並行性は、現代のプログラミングにおいて重要な要素です。C++の標準ライブラリでは、マルチスレッドプログラミングをサポートするための機能が提供されています。<code>std::thread</code>クラスや<code>std::mutex</code>、<code>std::condition_variable</code>などのクラスを使用することで、スレッド間の同期や通信を行うことができます。また、C++11以降では、スレッドプールや非同期タスクなどの機能も提供されています。 === 数学関数 (math functions) === 数学関数は、科学技術計算やグラフィックスプログラミングなどの領域で広く使用されます。C++の標準ライブラリでは、数学関数を提供するための数多くの関数が提供されています。これには、三角関数、指数関数、対数関数、乱数生成などが含まれます。これらの関数を使用することで、数学的な計算を効率的に行うことができます。 === ランダム数生成 (random number generation) === ランダム数生成は、シミュレーションやゲームなどの分野で広く使用されます。C++の標準ライブラリでは、ランダム数を生成するためのさまざまな機能が提供されています。これには、線形合同法やメルセンヌ・ツイスターなどのアルゴリズムを使用した乱数生成器が含まれます。また、乱数生成器を使用して特定の範囲の乱数を生成する機能も提供されています。 == 標準ライブラリの最適化 == 標準ライブラリの最適化は、プログラムのパフォーマンスを向上させるために重要なステップです。以下では、標準ライブラリを使用する際の最適化について説明します。 === 使用時の注意点 === 標準ライブラリを使用する際に注意するべきポイントがいくつかあります。まず、適切なコンテナやアルゴリズムを選択することが重要です。特定の操作に適したコンテナやアルゴリズムを選択することで、効率的なプログラムを作成することができます。また、不要なコピーの回避やムーブセマンティクスの活用など、効率的なプログラミング手法を採用することも重要です。 さらに、標準ライブラリの使用に伴うオーバーヘッドにも注意が必要です。標準ライブラリは一般的に汎用的な実装を提供していますが、特定の状況においてはカスタム実装がより効率的な場合があります。プログラムの特性や要件に応じて、標準ライブラリの使用を最適化することが重要です。 === パフォーマンスの向上方法 === 標準ライブラリのパフォーマンスを向上させるためには、いくつかの方法があります。まず、最適化フラグを使用してコンパイラに最適化を指示することが重要です。最適化フラグを適切に設定することで、コンパイル時に効率的なコードが生成される可能性が高まります。 また、コンテナやアルゴリズムの選択によってもパフォーマンスを向上させることができます。例えば、ベクターやアレイなどの連続したメモリ配置を持つコンテナは、ランダムアクセスやイテレーションが高速に行えるため、大量のデータを効率的に処理する際に適しています。さらに、アルゴリズムの選択によってもパフォーマンスを向上させることができます。例えば、ソートアルゴリズムや探索アルゴリズムの選択によって、処理速度を向上させることができます。 さらに、並列処理やメモリ管理の最適化など、他の最適化手法も検討する価値があります。並列処理を使用することで、複数のスレッドを使用して処理を並列化することができ、処理速度を向上させることができます。また、メモリ管理の最適化を行うことで、不要なメモリの割り当てや解放を減らすことができ、プログラムのパフォーマンスを向上させることができます。 == 外部リンク == {{Wikipedia|標準C++ライブラリ}} {{Nav}} [[Category:C++|ひようしゆんらいふらり]] gw3jveguj2b2dtywtgw4ere2k0lh28b 264166 264154 2024-11-25T03:48:21Z Ef3 694 /* 標準ライブラリヘッダー */ (C++20)のような規格年次を補う 264166 wikitext text/x-wiki {{Nav}} <!-- ### 16 Library introduction [library] C++標準ライブラリは、C++プログラムをより簡潔かつ効率的に記述するための一連のクラスや関数を提供するものです。この節では、C++標準ライブラリの内容、ライブラリを使用するための適切なC++プログラムの書き方、およびライブラリのエンティティを提供するための準拠した実装方法について説明しています。 ### 16.1 General [library.general] 1. この節では、C++標準ライブラリの内容について述べ、C++プログラムがライブラリをどのように利用するのか、また準拠した実装がライブラリ内のエンティティをどのように提供するかについて説明しています。 2. 以下のサブ節では、ライブラリの記述方法(16.3節)および構成(16.4.2節)について説明しています。16.4節、および17節から33節、付録Dでは、ライブラリの内容、ライブラリの要件、および適切に形成されたC++プログラムと準拠する実装に関する制約について指定しています。 3. ライブラリ内の各コンポーネントの詳細な仕様は、17節から33節に記載されており、それらは以下の表23に示されるようにカテゴリ分けされています。 ### Table 23: Library categories [tab:library.categories] 以下は、C++標準ライブラリの各カテゴリとそれを扱う節の一覧です: - **Clause 17: Language support library** - 言語サポートライブラリ。基本的な言語機能のサポート。 - **Clause 18: Concepts library** - コンセプトライブラリ。テンプレートの制約を定義。 - **Clause 19: Diagnostics library** - 診断ライブラリ。エラーメッセージや例外処理のサポート。 - **Clause 20: Memory management library** - メモリ管理ライブラリ。メモリの動的管理のための機能。 - **Clause 21: Metaprogramming library** - メタプログラミングライブラリ。コンパイル時のプログラミング支援。 - **Clause 22: General utilities library** - 一般ユーティリティライブラリ。共通のユーティリティ関数やクラス。 - **Clause 23: Strings library** - 文字列ライブラリ。文字列操作のための機能。 - **Clause 24: Containers library** - コンテナライブラリ。データ構造(配列、リスト、マップなど)。 - **Clause 25: Iterators library** - イテレータライブラリ。コンテナを操作するためのイテレータ。 - **Clause 26: Ranges library** - レンジライブラリ。範囲ベースの操作のためのサポート。 - **Clause 27: Algorithms library** - アルゴリズムライブラリ。標準アルゴリズム(ソート、検索など)。 - **Clause 28: Numerics library** - 数値ライブラリ。数値計算のための機能。 - **Clause 29: Time library** - 時間ライブラリ。時間と日付の操作。 - **Clause 30: Localization library** - ローカライゼーションライブラリ。地域と言語特有の機能。 - **Clause 31: Input/output library** - 入出力ライブラリ。データの入力と出力のための機能。 - **Clause 32: Regular expressions library** - 正規表現ライブラリ。パターンマッチングのための正規表現機能。 - **Clause 33: Concurrency support library** - 並行処理サポートライブラリ。スレッドや並行処理のための機能。 --> = C++教科書/標準ライブラリ編 = == 標準ライブラリとは == C++標準ライブラリは、効率的なプログラミングに不可欠な包括的なツールセットです。コンテナ、アルゴリズム、入出力機能、文字列操作、並行処理など、幅広い機能を提供します。これらを活用することで、開発効率の向上、コードの品質改善、そしてクロスプラットフォームの互換性を実現できます。本書では、C++20/23の最新機能を含む標準ライブラリの各コンポーネントについて、実践的な例を交えながら解説します。 == 標準ライブラリの基本構造 == C++標準ライブラリは、以下のような機能群で構成されています: === コアライブラリ === * [[C++/標準ライブラリ/言語サポートライブラリ|言語サポートライブラリ]] - 言語機能の基礎的なサポート * [[C++/標準ライブラリ/コンセプトライブラリ|コンセプトライブラリ]] - テンプレートの制約を表現(C++20以降) * [[C++/標準ライブラリ/診断ライブラリ|診断ライブラリ]] - 例外処理と診断機能 * [[C++/標準ライブラリ/メモリ管理ライブラリ|メモリ管理ライブラリ]] - スマートポインタとメモリ割り当て === 基本ユーティリティ === * [[C++/標準ライブラリ/メタプログラミングライブラリ|メタプログラミングライブラリ]] - コンパイル時プログラミング機能 * [[C++/標準ライブラリ/一般ユーティリティライブラリ|一般ユーティリティライブラリ]] - 汎用的なツール群 * [[C++/標準ライブラリ/文字列ライブラリ|文字列ライブラリ]] - 文字列操作機能 === データ構造とアルゴリズム === * [[C++/標準ライブラリ/コンテナライブラリ|コンテナライブラリ]] - データ構造の実装 * [[C++/標準ライブラリ/イテレータライブラリ|イテレータライブラリ]] - コンテナ走査機能 * [[C++/標準ライブラリ/レンジライブラリ|レンジライブラリ]] - 範囲ベースの操作(C++20以降) * [[C++/標準ライブラリ/アルゴリズムライブラリ|アルゴリズムライブラリ]] - 汎用アルゴリズム群 === 特殊機能ライブラリ === * [[C++/標準ライブラリ/数値ライブラリ|数値ライブラリ]] - 数値計算と数学関数 * [[C++/標準ライブラリ/時間ライブラリ|時間ライブラリ]] - 時間と日付の処理 * [[C++/標準ライブラリ/ローカライゼーションライブラリ|ローカライゼーションライブラリ]] - 国際化対応 * [[C++/標準ライブラリ/入出力ライブラリ|入出力ライブラリ]] - ストリームベースのI/O * [[C++/標準ライブラリ/正規表現ライブラリ|正規表現ライブラリ]] - パターンマッチング * [[C++/標準ライブラリ/並行性サポートライブラリ|並行性サポートライブラリ]] - マルチスレッドとタスク並列処理 == ヘッダーと名前空間の利用 == === 基本的な使用方法 === C++標準ライブラリのコンポーネントは、ヘッダーファイルとして提供され、<code>std</code>名前空間内に定義されています。利用するには、適切なヘッダーをインクルードし、<code>std::</code>修飾子を使用します: :<syntaxhighlight lang=c++ copy> #include <vector> #include <string> std::vector<int> numbers; std::string text; </syntaxhighlight> === 名前空間の best practices === ==== using宣言の適切な使用 ==== * '''推奨される方法''': *: 特定の要素のみを使用する場合: *:<syntaxhighlight lang=c++ copy> using std::vector; using std::string; </syntaxhighlight> *: 関数のスコープ内での限定的な使用: *:<syntaxhighlight lang=c++ copy> void process_data() { using std::cout; cout << "Processing..." << std::endl; } </syntaxhighlight> ==== using namespace std の問題点 ==== <code>using namespace std;</code>の使用は以下の理由で非推奨です: # '''名前の衝突''':標準ライブラリの名前とユーザーコードの名前が予期せず衝突する可能性 # '''コードの明確性の低下''':どの関数や型が標準ライブラリに属するのか不明確になる # '''メンテナンス性への影響''':将来的なコードの変更や拡張時に問題を引き起こす可能性 # '''大規模プロジェクトでの管理困難''':複数の名前空間が混在する際の依存関係の把握が困難 === C++20以降の新機能 === * '''モジュール''':ヘッダーファイルの代替として、より効率的なモジュールシステムが導入(C++20) * '''レンジライブラリ''':より直感的なコレクション操作 * '''コルーチン''':非同期プログラミングの新しいパラダイム * '''コンセプト''':テンプレートの制約を明示的に表現 == 標準ライブラリヘッダー == * <[[C++/標準ライブラリ/algorithm|algorithm]]> &mdash; 多様なアルゴリズムを提供するクラスと関数。(C++98) * <[[C++/標準ライブラリ/any|any]]> &mdash; 任意の型を保持できる型安全なコンテナ。(C++17) * <[[C++/標準ライブラリ/array|array]]> &mdash; 固定サイズの配列コンテナ。(C++11) * <[[C++/標準ライブラリ/atomic|atomic]]> &mdash; 原子操作。(C++11) * <[[C++/標準ライブラリ/barrier|barrier]]> &mdash; スレッドの同期のサポートするバリア。(C++20) * <[[C++/標準ライブラリ/bit|bit]]> &mdash; ビット操作用のユーティリティ。(C++20) * <[[C++/標準ライブラリ/bitset|bitset]]> &mdash; 固定サイズのビット列コンテナ。(C++98) * <[[C++/標準ライブラリ/charconv|charconv]]> &mdash; 文字列と数値の変換。(C++17) * <[[C++/標準ライブラリ/chrono|chrono]]> &mdash; 時間の計測と操作のサポート。(C++11) * <[[C++/標準ライブラリ/codecvt|codecvt]]> &mdash; 文字コード変換を行うファセット<sup>†</sup>。(C++11、C++17で非推奨) * <[[C++/標準ライブラリ/compare|compare]]> &mdash; 比較のサポート。(C++20) * <[[C++/標準ライブラリ/complex|complex]]> &mdash; 複素数型のサポート。(C++98) * <[[C++/標準ライブラリ/concepts|concepts]]> &mdash; コンセプト定義。(C++20) * <[[C++/標準ライブラリ/condition_variable|condition_variable]]> &mdash; スレッド間の待機と通知のサポート。(C++11) * <[[C++/標準ライブラリ/coroutine|coroutine]]> &mdash; コルーチンのサポート。(C++20) * <[[C++/標準ライブラリ/deque|deque]]> &mdash; 両端キューコンテナ。(C++98) * <[[C++/標準ライブラリ/exception|exception]]> &mdash; 例外処理のサポート。(C++98) * <[[C++/標準ライブラリ/execution|execution]]> &mdash; 並列アルゴリズムの実行ポリシー。(C++17) * <[[C++/標準ライブラリ/expected|expected]]> &mdash; エラーを返す可能性のある操作の結果。(C++23) * <[[C++/標準ライブラリ/filesystem|filesystem]]> &mdash; ファイルシステム操作のサポート。(C++17) * <[[C++/標準ライブラリ/flat_map|flat_map]]> &mdash; ソートされた連想コンテナ。(C++23) * <[[C++/標準ライブラリ/flat_set|flat_set]]> &mdash; ソートされたセットコンテナ。(C++23) * <[[C++/標準ライブラリ/format|format]]> &mdash; 文字列のフォーマット機能。(C++20) * <[[C++/標準ライブラリ/forward_list|forward_list]]> &mdash; 単方向リストコンテナ。(C++11) * <[[C++/標準ライブラリ/fstream|fstream]]> &mdash; ファイル入出力のサポート。(C++98) * <[[C++/標準ライブラリ/functional|functional]]> &mdash; 関数オブジェクトとユーティリティ。(C++98) * <[[C++/標準ライブラリ/future|future]]> &mdash; 非同期操作の結果を取得。(C++11) * <[[C++/標準ライブラリ/generator|generator]]> &mdash; ジェネレーターのサポート。(C++23) * <[[C++/標準ライブラリ/initializer_list|initializer_list]]> &mdash; 初期化リストのサポート。(C++11) * <[[C++/標準ライブラリ/iomanip|iomanip]]> &mdash; 入出力ストリームの操作。(C++98) * <[[C++/標準ライブラリ/ios|ios]]> &mdash; 基本的な入出力ストリームのクラス。(C++98) * <[[C++/標準ライブラリ/iosfwd|iosfwd]]> &mdash; 入出力ストリームクラスの前方宣言。(C++98) * <[[C++/標準ライブラリ/iostream|iostream]]> &mdash; 標準入出力ストリームオブジェクト。(C++98) * <[[C++/標準ライブラリ/istream|istream]]> &mdash; 入力ストリームクラス。(C++98) * <[[C++/標準ライブラリ/iterator|iterator]]> &mdash; イテレータのユーティリティと型。(C++98) * <[[C++/標準ライブラリ/latch|latch]]> &mdash; スレッド同期のためのラッチ。(C++20) * <[[C++/標準ライブラリ/limits|limits]]> &mdash; 型の限界値情報を提供。(C++98) * <[[C++/標準ライブラリ/list|list]]> &mdash; 双方向リストコンテナ。(C++98) * <[[C++/標準ライブラリ/locale|locale]]> &mdash; ロケールと国際化サポート。(C++98) * <[[C++/標準ライブラリ/map|map]]> &mdash; キーと値のペアを保持する連想コンテナ。(C++98) * <[[C++/標準ライブラリ/mdspan|mdspan]]> &mdash; 多次元配列のビュー。(C++23) * <[[C++/標準ライブラリ/memory|memory]]> &mdash; 動的メモリ管理とスマートポインタ。(C++98) * <[[C++/標準ライブラリ/memory_resource|memory_resource]]> &mdash; メモリリソースとポリシー。(C++17) * <[[C++/標準ライブラリ/mutex|mutex]]> &mdash; 相互排他制御のプリミティブ。(C++11) * <[[C++/標準ライブラリ/new|new]]> &mdash; 動的メモリ割り当ての管理。(C++98) * <[[C++/標準ライブラリ/numbers|numbers]]> &mdash; 数値定数の定義。(C++20) * <[[C++/標準ライブラリ/numeric|numeric]]> &mdash; 数値計算のユーティリティ。(C++98) * <[[C++/標準ライブラリ/optional|optional]]> &mdash; オプショナル型。(C++17) * <[[C++/標準ライブラリ/ostream|ostream]]> &mdash; 出力ストリームクラス。(C++98) * <[[C++/標準ライブラリ/print|print]]> &mdash; 標準出力への出力のサポート。(C++23) * <[[C++/標準ライブラリ/queue|queue]]> &mdash; FIFO(先入れ先出し)コンテナ。(C++98) * <[[C++/標準ライブラリ/random|random]]> &mdash; 乱数生成ライブラリ。(C++11) * <[[C++/標準ライブラリ/ranges|ranges]]> &mdash; 範囲ベースのアルゴリズム。(C++20) * <[[C++/標準ライブラリ/ratio|ratio]]> &mdash; コンパイル時の有理数演算。(C++11) * <[[C++/標準ライブラリ/regex|regex]]> &mdash; 正規表現のサポート。(C++11) * <[[C++/標準ライブラリ/scoped_allocator|scoped_allocator]]> &mdash; スコープ付きアロケータのラッパー。(C++11) * <[[C++/標準ライブラリ/semaphore|semaphore]]> &mdash; スレッド間の同期を制御。(C++20) * <[[C++/標準ライブラリ/set|set]]> &mdash; 集合コンテナ。(C++98) * <[[C++/標準ライブラリ/shared_mutex|shared_mutex]]> &mdash; 共有と独占のロック制御。(C++14) * <[[C++/標準ライブラリ/source_location|source_location]]> &mdash; ソースコード位置情報。(C++20) * <[[C++/標準ライブラリ/span|span]]> &mdash; 連続メモリのビュー。(C++20) * <[[C++/標準ライブラリ/spanstream|spanstream]]> &mdash; メモリバッファへのストリーム。(C++23) * <[[C++/標準ライブラリ/sstream|sstream]]> &mdash; 文字列ストリームクラス。(C++98) * <[[C++/標準ライブラリ/stack|stack]]> &mdash; LIFO(後入れ先出し)コンテナ。(C++98) * <[[C++/標準ライブラリ/stacktrace|stacktrace]]> &mdash; スタックトレースのサポート。(C++23) * <[[C++/標準ライブラリ/stdexcept|stdexcept]]> &mdash; 標準的な例外クラス。(C++98) * <[[C++/標準ライブラリ/stdfloat|stdfloat]]> &mdash; 標準浮動小数点数。(C++23) * <[[C++/標準ライブラリ/stop_token|stop_token]]> &mdash; 停止トークンのサポート。(C++20) * <[[C++/標準ライブラリ/streambuf|streambuf]]> &mdash; ストリームバッファ。(C++98) * <[[C++/標準ライブラリ/string|string]]> &mdash; 文字列クラス。(C++98) * <[[C++/標準ライブラリ/string_view|string_view]]> &mdash; 文字列の読み取りビュー。(C++17) * <[[C++/標準ライブラリ/strstream|strstream]]> &mdash; 文字列バッファストリーム。(C++98、C++98で非推奨) * <[[C++/標準ライブラリ/syncstream|syncstream]]> &mdash; 同期ストリーム出力。(C++20) * <[[C++/標準ライブラリ/system_error|system_error]]> &mdash; システムエラーの報告。(C++11) * <[[C++/標準ライブラリ/thread|thread]]> &mdash; マルチスレッドのサポート。(C++11) * <[[C++/標準ライブラリ/tuple|tuple]]> &mdash; 異なる型のタプル。(C++11) * <[[C++/標準ライブラリ/type_traits|type_traits]]> &mdash; 型特性の操作。(C++11) * <[[C++/標準ライブラリ/typeindex|typeindex]]> &mdash; 型情報のインデックス。(C++11) * <[[C++/標準ライブラリ/typeinfo|typeinfo]]> &mdash; ランタイム型情報。(C++98) * <[[C++/標準ライブラリ/unordered_map|unordered_map]]> &mdash; ハッシュテーブル連想コンテナ。(C++11) * <[[C++/標準ライブラリ/unordered_set|unordered_set]]> &mdash; ハッシュテーブル集合コンテナ。(C++11) * <[[C++/標準ライブラリ/utility|utility]]> &mdash; 汎用ユーティリティ。(C++98) * <[[C++/標準ライブラリ/valarray|valarray]]> &mdash; 数値配列クラス。(C++98) * <[[C++/標準ライブラリ/variant|variant]]> &mdash; 複数の型を持つユニオン。(C++17) * <[[C++/標準ライブラリ/vector|vector]]> &mdash; 動的配列コンテナ。(C++98) * <[[C++/標準ライブラリ/version|version]]> &mdash; バージョン情報。(C++20) === C言語互換ヘッダー === C言語ヘッダーの先頭に '''c''' を補い末尾から '''.h''' を取り去る。 * <[[C++/標準ライブラリ/cassert|cassert]]> — アサーションのサポート。(C++98) * <[[C++/標準ライブラリ/cctype|cctype]]> — 文字分類と変換。(C++98) * <[[C++/標準ライブラリ/cerrno|cerrno]]> — エラーナンバー定義。(C++98) * <[[C++/標準ライブラリ/cfenv|cfenv]]> — 浮動小数点環境の制御。(C++11) * <[[C++/標準ライブラリ/cfloat|cfloat]]> — 浮動小数点数の特性。(C++98) * <[[C++/標準ライブラリ/cinttypes|cinttypes]]> — 整数型のフォーマット変換。(C++11) * <[[C++/標準ライブラリ/climits|climits]]> — 整数型の限界値。(C++98) * <[[C++/標準ライブラリ/clocale|clocale]]> — ロケールの設定と取得。(C++98) * <[[C++/標準ライブラリ/cmath|cmath]]> — 数学関数ライブラリ。(C++98) * <[[C++/標準ライブラリ/csetjmp|csetjmp]]> — 非局所ジャンプのサポート。(C++98) * <[[C++/標準ライブラリ/csignal|csignal]]> — シグナル処理のサポート。(C++98) * <[[C++/標準ライブラリ/cstdarg|cstdarg]]> — 可変引数リストの操作。(C++98) * <[[C++/標準ライブラリ/cstddef|cstddef]]> — 標準型とマクロ。(C++98) * <[[C++/標準ライブラリ/cstdint|cstdint]]> — 固定幅整数型。(C++11) * <[[C++/標準ライブラリ/cstdio|cstdio]]> — 標準入出力関数。(C++98) * <[[C++/標準ライブラリ/cstdlib|cstdlib]]> — 標準ライブラリのユーティリティ。(C++98) * <[[C++/標準ライブラリ/cstring|cstring]]> — 文字列操作関数。(C++98) * <[[C++/標準ライブラリ/ctime|ctime]]> — 時間処理関数。(C++98) * <[[C++/標準ライブラリ/cuchar|cuchar]]> — Unicode文字操作関数。(C++11) * <[[C++/標準ライブラリ/cwchar|cwchar]]> — ワイド文字操作関数。(C++98) * <[[C++/標準ライブラリ/cwctype|cwctype]]> — ワイド文字分類と変換。(C++98) === C言語ヘッダー === 全て(C++98) * <[[C言語/標準ライブラリ/assert.h|assert.h]]> * <[[C言語/標準ライブラリ/complex.h|complex.h]]> * <[[C言語/標準ライブラリ/ctype.h|ctype.h]]> * <[[C言語/標準ライブラリ/errno.h|errno.h]]> * <[[C言語/標準ライブラリ/fenv.h|fenv.h]]> * <[[C言語/標準ライブラリ/float.h|float.h]]> * <[[C言語/標準ライブラリ/inttypes.h|inttypes.h]]> * <[[C言語/標準ライブラリ/iso646.h|iso646.h]]> * <[[C言語/標準ライブラリ/limits.h|limits.h]]> * <[[C言語/標準ライブラリ/locale.h|locale.h]]> * <[[C言語/標準ライブラリ/math.h|math.h]]> * <[[C言語/標準ライブラリ/setjmp.h|setjmp.h]]> * <[[C言語/標準ライブラリ/signal.h|signal.h]]> * <[[C言語/標準ライブラリ/stdalign.h|stdalign.h]]> * <[[C言語/標準ライブラリ/stdarg.h|stdarg.h]]> * <[[C言語/標準ライブラリ/stdatomic.h|stdatomic.h]]> * <[[C言語/標準ライブラリ/stdbool.h|stdbool.h]]> * <[[C言語/標準ライブラリ/stddef.h|stddef.h]]> * <[[C言語/標準ライブラリ/stdint.h|stdint.h]]> * <[[C言語/標準ライブラリ/stdio.h|stdio.h]]> * <[[C言語/標準ライブラリ/stdlib.h|stdlib.h]]> * <[[C言語/標準ライブラリ/string.h|string.h]]> * <[[C言語/標準ライブラリ/tgmath.h|tgmath.h]]> * <[[C言語/標準ライブラリ/time.h|time.h]]> * <[[C言語/標準ライブラリ/uchar.h|uchar.h]]> * <[[C言語/標準ライブラリ/wchar.h|wchar.h]]> * <[[C言語/標準ライブラリ/wctype.h|wctype.h]]> :{| class="sortable wikitable" style="width: stretch; margin: 0 auto;" |+ 標準ライブラリヘッダー分類表 ! ヘッダー ||style="width:7rem"| 分類 || 初出 || 説明 |- | <[[C++/標準ライブラリ/concepts|concepts]]> &mdash; || コンセプト || C++20 || コンセプト基本ライブラリ |- | <[[C++/標準ライブラリ/coroutine|coroutine]]> &mdash; || コルーチン || C++20 || コルーチンサポートライブラリ |- | <[[C++/標準ライブラリ/any|any]]> &mdash; || ユーティリティ || C++17 || <code>std::any</code>クラス |- | <[[C++/標準ライブラリ/bitset|bitset]]> &mdash; || ユーティリティ || - || <code>std::bitset</code>クラステンプレート |- | <[[C++/標準ライブラリ/chrono|chrono]]> &mdash; || ユーティリティ || C++11 || C++時間ユーティリティ |- | <[[C++/標準ライブラリ/compare|compare]]> &mdash; || ユーティリティ || C++20 || 3方向比較演算子サポート |- | <[[C++/標準ライブラリ/csetjmp|csetjmp]]> &mdash; || ユーティリティ || - || 実行コンテキストを保存/ジャンプするマクロ(と関数) |- | <[[C++/標準ライブラリ/csignal|csignal]]> &mdash; || ユーティリティ || - || シグナル管理の関数とマクロ定数 |- | <[[C++/標準ライブラリ/cstdarg|cstdarg]]> &mdash; || ユーティリティ || - || 可変長引数リストの処理 |- | <[[C++/標準ライブラリ/cstddef|cstddef]]> &mdash; || ユーティリティ || - || 標準マクロとtypedef |- | <[[C++/標準ライブラリ/cstdlib|cstdlib]]> &mdash; || ユーティリティ || - || 一般的なユーティリティ:プログラム制御、動的メモリ割り当て、乱数、ソートと検索 |- | <[[C++/標準ライブラリ/ctime|ctime]]> &mdash; || ユーティリティ || - || C形式の時刻/日付ユーティリティ |- | <[[C++/標準ライブラリ/debugging|debugging]]> &mdash; || ユーティリティ || C++26 || デバッグライブラリ |- | <[[C++/標準ライブラリ/expected|expected]]> &mdash; || ユーティリティ || C++23 || <code>std::expected</code>クラステンプレート |- | <[[C++/標準ライブラリ/functional|functional]]> &mdash; || ユーティリティ || - || 関数オブジェクト、関数呼び出し、バインド操作、参照ラッパー |- | <[[C++/標準ライブラリ/initializer_list|initializer_list]]> &mdash; || ユーティリティ || C++11 || <code>std::initializer_list</code>クラステンプレート |- | <[[C++/標準ライブラリ/optional|optional]]> &mdash; || ユーティリティ || C++17 || <code>std::optional</code>クラステンプレート |- | <[[C++/標準ライブラリ/source_location|source_location]]> &mdash; || ユーティリティ || C++20 || ソースコード位置を取得する手段を提供 |- | <[[C++/標準ライブラリ/tuple|tuple]]> &mdash; || ユーティリティ || C++11 || <code>std::tuple</code>クラステンプレート |- | <[[C++/標準ライブラリ/type_traits|type_traits]]> &mdash; || ユーティリティ || C++11 || コンパイル時型情報 |- | <[[C++/標準ライブラリ/typeindex|typeindex]]> &mdash; || ユーティリティ || C++11 || <code>std::type_index</code> |- | <[[C++/標準ライブラリ/typeinfo|typeinfo]]> &mdash; || ユーティリティ || - || 実行時型情報ユーティリティ |- | <[[C++/標準ライブラリ/utility|utility]]> &mdash; || ユーティリティ || - || 様々なユーティリティコンポーネント |- | <[[C++/標準ライブラリ/variant|variant]]> &mdash; || ユーティリティ || C++17 || <code>std::variant</code>クラステンプレート |- | <[[C++/標準ライブラリ/version|version]]> &mdash; || ユーティリティ || C++20 || 実装依存のライブラリ情報を提供 |- | <[[C++/標準ライブラリ/memory|memory]]> &mdash; || 動的メモリ管理 || - || 高レベルメモリ管理ユーティリティ |- | <[[C++/標準ライブラリ/memory_resource|memory_resource]]> &mdash; || 動的メモリ管理 || C++17 || 多相的アロケータとメモリリソース |- | <[[C++/標準ライブラリ/new|new]]> &mdash; || 動的メモリ管理 || - || 低レベルメモリ管理ユーティリティ |- | <[[C++/標準ライブラリ/scoped_allocator|scoped_allocator]]> &mdash; || 動的メモリ管理 || C++11 || ネストされたアロケータクラス |- | <[[C++/標準ライブラリ/cfloat|cfloat]]> &mdash; || 数値限界 || - || 浮動小数点型の限界値 |- | <[[C++/標準ライブラリ/cinttypes|cinttypes]]> &mdash; || 数値限界 || C++11 || 書式マクロ、<code>intmax_t</code>と<code>uintmax_t</code>、数学と変換 |- | <[[C++/標準ライブラリ/climits|climits]]> &mdash; || 数値限界 || - || 整数型の限界値 |- | <[[C++/標準ライブラリ/cstdint|cstdint]]> &mdash; || 数値限界 || C++11 || 固定幅整数型と他の型の限界値 |- | <[[C++/標準ライブラリ/limits|limits]]> &mdash; || 数値限界 || - || 算術型のプロパティを問い合わせる統一された方法 |- | <[[C++/標準ライブラリ/stdfloat|stdfloat]]> &mdash; || 数値限界 || C++23 || オプションの拡張浮動小数点型 |- | <[[C++/標準ライブラリ/cassert|cassert]]> &mdash; || エラー処理 || - || ゼロと比較し、条件付きでマクロを定義 |- | <[[C++/標準ライブラリ/cerrno|cerrno]]> &mdash; || エラー処理 || - || 最後のエラー番号を含むマクロ |- | <[[C++/標準ライブラリ/exception|exception]]> &mdash; || エラー処理 || - || 例外処理ユーティリティ |- | <[[C++/標準ライブラリ/stacktrace|stacktrace]]> &mdash; || エラー処理 || C++23 || スタックトレースライブラリ |- | <[[C++/標準ライブラリ/stdexcept|stdexcept]]> &mdash; || エラー処理 || - || 標準例外オブジェクト |- | <[[C++/標準ライブラリ/system_error|system_error]]> &mdash; || エラー処理 || C++11 || <code>std::error_code</code>を定義(プラットフォーム依存のエラーコード) |- | <[[C++/標準ライブラリ/cctype|cctype]]> &mdash; || 文字列 || - || ナロー文字のカテゴリを判別する関数 |- | <[[C++/標準ライブラリ/charconv|charconv]]> &mdash; || 文字列 || C++17 || <code>std::to_chars</code>と<code>std::from_chars</code> |- | <[[C++/標準ライブラリ/cstring|cstring]]> &mdash; || 文字列 || - || 様々なナロー文字列処理関数 |- | <[[C++/標準ライブラリ/cuchar|cuchar]]> &mdash; || 文字列 || C++11 || C形式のUnicode文字変換関数 |- | <[[C++/標準ライブラリ/cwchar|cwchar]]> &mdash; || 文字列 || - || 様々なワイド/マルチバイト文字列処理関数 |- | <[[C++/標準ライブラリ/cwctype|cwctype]]> &mdash; || 文字列 || - || ワイド文字のカテゴリを判別する関数 |- | <[[C++/標準ライブラリ/format|format]]> &mdash; || 文字列 || C++20 || 書式化ライブラリ(<code>std::format</code>を含む) |- | <[[C++/標準ライブラリ/string|string]]> &mdash; || 文字列 || - || <code>std::basic_string</code>クラステンプレート |- | <[[C++/標準ライブラリ/string_view|string_view]]> &mdash; || 文字列 || C++17 || <code>std::basic_string_view</code>クラステンプレート |- | <[[C++/標準ライブラリ/array|array]]> &mdash; || コンテナ || C++11 || <code>std::array</code>コンテナ |- | <[[C++/標準ライブラリ/deque|deque]]> &mdash; || コンテナ || - || <code>std::deque</code>コンテナ |- | <[[C++/標準ライブラリ/flat_map|flat_map]]> &mdash; || コンテナ || C++23 || <code>std::flat_map</code>と<code>std::flat_multimap</code>コンテナアダプター |- | <[[C++/標準ライブラリ/flat_set|flat_set]]> &mdash; || コンテナ || C++23 || <code>std::flat_set</code>と<code>std::flat_multiset</code>コンテナアダプター |- | <[[C++/標準ライブラリ/forward_list|forward_list]]> &mdash; || コンテナ || C++11 || <code>std::forward_list</code>コンテナ |- | <[[C++/標準ライブラリ/list|list]]> &mdash; || コンテナ || - || <code>std::list</code>コンテナ |- | <[[C++/標準ライブラリ/map|map]]> &mdash; || コンテナ || - || <code>std::map</code>と<code>std::multimap</code>の連想コンテナ |- | <[[C++/標準ライブラリ/mdspan|mdspan]]> &mdash; || コンテナ || C++23 || <code>std::mdspan</code>ビュー |- | <[[C++/標準ライブラリ/queue|queue]]> &mdash; || コンテナ || - || <code>std::queue</code>と<code>std::priority_queue</code>のコンテナアダプター |- | <[[C++/標準ライブラリ/set|set]]> &mdash; || コンテナ || - || <code>std::set</code>と<code>std::multiset</code>の連想コンテナ |- | <[[C++/標準ライブラリ/span|span]]> &mdash; || コンテナ || C++20 || <code>std::span</code>ビュー |- | <[[C++/標準ライブラリ/stack|stack]]> &mdash; || コンテナ || - || <code>std::stack</code>コンテナアダプター |- | <[[C++/標準ライブラリ/unordered_map|unordered_map]]> &mdash; || コンテナ || C++11 || <code>std::unordered_map</code>と<code>std::unordered_multimap</code>の非順序連想コンテナ |- | <[[C++/標準ライブラリ/unordered_set|unordered_set]]> &mdash; || コンテナ || C++11 || <code>std::unordered_set</code>と<code>std::unordered_multiset</code>の非順序連想コンテナ |- | <[[C++/標準ライブラリ/vector|vector]]> &mdash; || コンテナ || - || <code>std::vector</code>コンテナ |- | <[[C++/標準ライブラリ/iterator|iterator]]> &mdash; || イテレータ || - || 範囲イテレータ |- | <[[C++/標準ライブラリ/generator|generator]]> &mdash; || 範囲 || C++23 || <code>std::generator</code>クラステンプレート |- | <[[C++/標準ライブラリ/ranges|ranges]]> &mdash; || 範囲 || C++20 || 範囲アクセス、プリミティブ、要件、ユーティリティ、アダプター |- | <[[C++/標準ライブラリ/algorithm|algorithm]]> &mdash; || アルゴリズム || - || 範囲に作用するアルゴリズム |- | <[[C++/標準ライブラリ/execution|execution]]> &mdash; || アルゴリズム || C++17 || アルゴリズムの並列バージョンに対する既定の実行ポリシー |- | <[[C++/標準ライブラリ/bit|bit]]> &mdash; || 数値 || C++20 || ビット操作関数 |- | <[[C++/標準ライブラリ/cfenv|cfenv]]> &mdash; || 数値 || C++11 || 浮動小数点環境アクセス関数 |- | <[[C++/標準ライブラリ/cmath|cmath]]> &mdash; || 数値 || - || 共通の数学関数 |- | <[[C++/標準ライブラリ/complex|complex]]> &mdash; || 数値 || - || 複素数型 |- | <[[C++/標準ライブラリ/linalg|linalg]]> &mdash; || 数値 || C++26 || 基本的な線形代数アルゴリズム |- | <[[C++/標準ライブラリ/numbers|numbers]]> &mdash; || 数値 || C++20 || 数学定数 |- | <[[C++/標準ライブラリ/numeric|numeric]]> &mdash; || 数値 || - || 範囲内の値に対する数値演算 |- | <[[C++/標準ライブラリ/random|random]]> &mdash; || 数値 || C++11 || 乱数生成器と分布 |- | <[[C++/標準ライブラリ/ratio|ratio]]> &mdash; || 数値 || C++11 || コンパイル時有理数演算 |- | <[[C++/標準ライブラリ/valarray|valarray]]> &mdash; || 数値 || - || 値の配列を表現し操作するためのクラス |- | <[[C++/標準ライブラリ/clocale|clocale]]> &mdash; || 地域化 || - || C言語の地域化ユーティリティ |- | <[[C++/標準ライブラリ/codecvt|codecvt]]> &mdash; || 地域化 || C++11 || Unicode変換機能 (C++17で非推奨、C++26で削除) |- | <[[C++/標準ライブラリ/locale|locale]]> &mdash; || 地域化 || - || 地域化ユーティリティ |- | <[[C++/標準ライブラリ/text_encoding|text_encoding]]> &mdash; || 地域化 || C++26 || テキストエンコーディングの識別 |- | <[[C++/標準ライブラリ/cstdio|cstdio]]> &mdash; || 入出力 || - || C形式の入出力関数 |- | <[[C++/標準ライブラリ/fstream|fstream]]> &mdash; || 入出力 || - || <code>std::basic_fstream</code>、<code>std::basic_ifstream</code>、<code>std::basic_ofstream</code>クラステンプレートといくつかのtypedef |- | <[[C++/標準ライブラリ/iomanip|iomanip]]> &mdash; || 入出力 || - || 入出力のフォーマットを制御するヘルパー関数 |- | <[[C++/標準ライブラリ/ios|ios]]> &mdash; || 入出力 || - || <code>std::ios_base</code>クラス、<code>std::basic_ios</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/iosfwd|iosfwd]]> &mdash; || 入出力 || - || 入出力ライブラリのすべてのクラスの前方宣言 |- | <[[C++/標準ライブラリ/iostream|iostream]]> &mdash; || 入出力 || - || 様々な標準ストリームオブジェクト |- | <[[C++/標準ライブラリ/istream|istream]]> &mdash; || 入出力 || - || <code>std::basic_istream</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/ostream|ostream]]> &mdash; || 入出力 || - || <code>std::basic_ostream</code>、<code>std::basic_iostream</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/print|print]]> &mdash; || 入出力 || C++23 || 書式付き出力ライブラリ(<code>std::print</code>を含む) |- | <[[C++/標準ライブラリ/spanstream|spanstream]]> &mdash; || 入出力 || C++23 || <code>std::basic_spanstream</code>、<code>std::basic_ispanstream</code>、<code>std::basic_ospanstream</code>クラステンプレート、typedef |- | <[[C++/標準ライブラリ/sstream|sstream]]> &mdash; || 入出力 || - || <code>std::basic_stringstream</code>、<code>std::basic_istringstream</code>、<code>std::basic_ostringstream</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/streambuf|streambuf]]> &mdash; || 入出力 || - || <code>std::basic_streambuf</code>クラステンプレート |- | <[[C++/標準ライブラリ/syncstream|syncstream]]> &mdash; || 入出力 || C++20 || <code>std::basic_osyncstream</code>、<code>std::basic_syncbuf</code>、typedef |- | <[[C++/標準ライブラリ/filesystem|filesystem]]> &mdash; || ファイルシステム || C++17 || <code>std::path</code>クラスとサポート関数 |- | <[[C++/標準ライブラリ/regex|regex]]> &mdash; || 正規表現 || C++11 || 正規表現処理のサポートするクラス、アルゴリズム、イテレータ |- | <[[C++/標準ライブラリ/atomic|atomic]]> &mdash; || 原子操作 || C++11 || 原子操作ライブラリ |- | <[[C++/標準ライブラリ/barrier|barrier]]> &mdash; || スレッドサポート || C++20 || バリア |- | <[[C++/標準ライブラリ/condition_variable|condition_variable]]> &mdash; || スレッドサポート || C++11 || スレッド待機条件 |- | <[[C++/標準ライブラリ/future|future]]> &mdash; || スレッドサポート || C++11 || 非同期コンピューティングのプリミティブ |- | <[[C++/標準ライブラリ/hazard_pointer|hazard_pointer]]> &mdash; || スレッドサポート || C++26 || ハザードポインター |- | <[[C++/標準ライブラリ/latch|latch]]> &mdash; || スレッドサポート || C++20 || ラッチ |- | <[[C++/標準ライブラリ/mutex|mutex]]> &mdash; || スレッドサポート || C++11 || 相互排除プリミティブ |- | <[[C++/標準ライブラリ/rcu|rcu]]> &mdash; || スレッドサポート || C++26 || Read-Copy Update メカニズム |- | <[[C++/標準ライブラリ/semaphore|semaphore]]> &mdash; || スレッドサポート || C++20 || セマフォ |- | <[[C++/標準ライブラリ/shared_mutex|shared_mutex]]> &mdash; || スレッドサポート || C++14 || 共有相互排除プリミティブ | |- | <[[C++/標準ライブラリ/stop_token|stop_token]]> &mdash; || スレッドサポート || C++20 || <code>std::jthread</code>の停止トークン |- | <[[C++/標準ライブラリ/thread|thread]]> &mdash; || スレッドサポート || C++11 || <code>std::thread</code>クラスとサポート関数 |- | <[[C言語/標準ライブラリ/assert.h|assert.h]]> &mdash; || C互換 || -- || <cassert>と同様の振る舞い |- | <[[C言語/標準ライブラリ/ctype.h|ctype.h]]> &mdash; || C互換 || -- || <cctype>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/errno.h|errno.h]]> &mdash; || C互換 || -- || <cerrno>と同様の振る舞い |- | <[[C言語/標準ライブラリ/fenv.h|fenv.h]]> &mdash; || C互換 || -- || <cfenv>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/float.h|float.h]]> &mdash; || C互換 || -- || <cfloat>と同様の振る舞い |- | <[[C言語/標準ライブラリ/inttypes.h|inttypes.h]]> &mdash; || C互換 || -- || <cinttypes>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/limits.h|limits.h]]> &mdash; || C互換 || -- || <climits>と同様の振る舞い |- | <[[C言語/標準ライブラリ/locale.h|locale.h]]> &mdash; || C互換 || -- || <clocale>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/math.h|math.h]]> &mdash; || C互換 || -- || <cmath>からすべての名前(数学特殊関数の名前を除く)が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/setjmp.h|setjmp.h]]> &mdash; || C互換 || -- || <csetjmp>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/signal.h|signal.h]]> &mdash; || C互換 || -- || <csignal>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdarg.h|stdarg.h]]> &mdash; || C互換 || -- || <cstdarg>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stddef.h|stddef.h]]> &mdash; || C互換 || -- || <cstddef>から<code>std::byte</code>と関連する関数の名前を除きすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdint.h|stdint.h]]> &mdash; || C互換 || -- || <cstdint>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdio.h|stdio.h]]> &mdash; || C互換 || -- || <cstdio>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdlib.h|stdlib.h]]> &mdash; || C互換 || -- || <cstdlib>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/string.h|string.h]]> &mdash; || C互換 || -- || <cstring>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/time.h|time.h]]> &mdash; || C互換 || -- || <ctime>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/uchar.h|uchar.h]]> &mdash; || C互換 || -- || <cuchar>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/wchar.h|wchar.h]]> &mdash; || C互換 || -- || <cwchar>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/wctype.h|wctype.h]]> &mdash; || C互換 || -- || <cwctype>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdatomic.h|stdatomic.h]]> &mdash; || 特殊C互換 || -- || _Atomicマクロを定義し、C標準ライブラリから対応する コンポーネントを提供する |} == コンテナ == コンテナは、データを格納するためのオブジェクトであり、C++の標準ライブラリではさまざまな種類のコンテナが提供されています。それぞれのコンテナは、異なる目的や使用方法に適しています。以下では、主要なコンテナについて詳しく説明します。 === コンテナの種類 === C++ 標準ライブラリは、以下の主要なコンテナを提供しています。 * '''配列 (std::array)''': 固定長の要素の集合を表す。ランダムアクセスが高速だが、サイズ変更ができない。 * '''ベクター (std::vector)''': 動的な要素の集合を表す。要素の挿入・削除が効率的かつ、ランダムアクセスも高速。 * '''リスト (std::list)''': 双方向連結リストを表す。要素の挿入・削除が効率的だが、ランダムアクセスは遅い。 * '''スタック (std::stack)''': LIFO (Last In First Out) 構造を表す。プッシュとポップの操作を提供。 * '''キュー (std::queue)''': FIFO (First In First Out) 構造を表す。エンキューとデキューの操作を提供。 * '''デック (std::deque)''': 両端キューを表す。先頭と末尾の両方から要素の挿入・削除が可能。 * '''セット (std::set)''': 重複のない要素の集合を表す。要素は昇順にソート済み。 * '''マップ (std::map)''': キーと値のペアの集合を表す。キーに基づいて値を検索できる。 * '''アンオーダードセット (std::unordered_set)''': ハッシュテーブルを用いて要素を格納する。重複のない要素の集合を表す。 * '''アンオーダードマップ (std::unordered_map)''': ハッシュテーブルを用いてキーと値のペアを格納する。 === 各コンテナの詳細 === それぞれのコンテナについて、以下に詳細を説明します。 ==== 配列 (std::array) ==== :<syntaxhighlight lang=c++> auto my_array = std::array{2, 3, 5, 7, 11}; </syntaxhighlight> * 要素の数と型は固定で、コンパイル時に決定される。 * ランダムアクセスが高速 (O(1))。 * 要素の挿入・削除はできない。 * メモリ消費量が事前に予測可能。 * 領域はスタックに確保される。 * コア言語の配列とは異なり、イテレータやアルゴリズムを適用できる。 === ベクター (std::vector)=== :<syntaxhighlight lang=c++> auto my_vector = std::vector{2, 3, 5, 7, 11}; my_vector.push_back(13); my_vector.push_back(17); my_vector.push_back(19); </syntaxhighlight> * 要素数は可変で、実行時に動的に変更できる。 * ランダムアクセスが高速 (O(1))。 * 要素の挿入・削除が効率的 (挿入: O(1) or O(n)、削除: O(1) or O(n))。 * メモリ消費量は動的に変化する。 * 領域はヒープに確保される。 * スコープを離れる自動的に領域開放される。 === リスト (std::list)=== :<syntaxhighlight lang=c++> auto my_list = std::list{2, 3, 5, 7, 11}; my_list.push_back(13); my_list.push_back(17); my_list.push_back(19); </syntaxhighlight> * 要素は双方向連結リストで管理される。 * ランダムアクセスは遅い (O(n))。 * 要素の挿入・削除が効率的 (O(1))。 * 隣接要素へのアクセスや挿入・削除に適している。 === スタック (std::stack)=== :<syntaxhighlight lang=c++> auto my_stack = std::stack{2, 3, 5, 7, 11}; my_stack.push(13); my_stack.push(17); my_stack.push(19); int peek = my_stack.top(); int top = my_stack.pop(); </syntaxhighlight> * LIFO 構造を実装。 * プッシュとポップの操作を提供。 * ネストされたスコープの管理などに利用される。 === キュー (std::queue)=== :<syntaxhighlight lang=c++> std::queue<int> my_queue; my_queue.push(1); my_queue.push(2); my_queue.push(3); int front = my_queue.front(); my_queue.pop(); </syntaxhighlight> * FIFO 構造を実装。 * エンキューとデキューの操作を提供。 * タスクのキューイングなどに利用される。 === デック (std::deque)=== :<syntaxhighlight lang=c++> std::deque<int> my_deque; my_deque.push_back(1); my_deque.push_front(2); my_deque.push_back(3); int front = my_deque.front(); int back = my_deque.back(); my_deque.pop_front(); my_deque.pop_back();</syntaxhighlight> * 両端キューとして動作 * 先頭と末尾の両方から要素の挿入・削除が可能。 * ランダムアクセスも可能だが、<code>std::vector</code>ほど高速ではない (O(log n))。 * <code>std::vector</code>と<code>std::list</code>の両方の特性を持つ。 === セット (std::set)=== :<syntaxhighlight lang=c++> std::set<int> my_set; my_set.insert(1); my_set.insert(2); my_set.insert(3); bool found = my_set.find(2) != my_set.end(); </syntaxhighlight> * 重複のない要素の集合を表す。 * 要素は昇順にソート済み。 * 探索、挿入、削除の操作が高速 (O(log n))。 * 順序を保持する必要がある集合の操作に適している。 === マップ (std::map)=== :<syntaxhighlight lang=c++> std::map<std::string, int> my_map; my_map["key1"] = 1; my_map["key2"] = 2; my_map["key3"] = 3; int value = my_map["key2"];</syntaxhighlight> * キーと値のペアの集合を表す。 * キーに基づいて値を効率的に検索できる (O(log n))。 * 挿入、削除、検索の操作が高速 (O(log n))。 * キーと値の対応関係を保持する必要がある場合に適している。 ==== アンオーダードセット (std::unordered_set) ==== :<syntaxhighlight lang=c++> std::unordered_set<int> my_set; my_set.insert(1); my_set.insert(2); my_set.insert(3); bool found = my_set.find(2) != my_set.end();</syntaxhighlight> * ハッシュテーブルを用いて要素を格納。 * 重複のない要素の集合を表す。 * 探索、挿入、削除の操作が非常に高速 (平均 O(1))。 * 順序を保持する必要がない集合の操作に適している。 === アンオーダードマップ (std::unordered_map)=== :<syntaxhighlight lang=c++> std::unordered_map<std::string, int> my_map; my_map["key1"] = 1; my_map["key2"] = 2; my_map["key3"] = 3; int value = my_map["key2"];</syntaxhighlight> * ハッシュテーブルを用いてキーと値のペアを格納。 * キーに基づいて値を非常に効率的に検索できる (平均 O(1))。 * 挿入、削除、検索の操作が非常に高速 (平均 O(1))。 * キーと値の対応関係を保持する必要がある場合に適しているが、順序は保持されない。 === コンテナの選択 === 適切なコンテナを選択することは、プログラムのパフォーマンスと効率に大きく影響します。 * コア言語の配列と同様に高速かつスタックにインスタンスを起きたく、イテレータやアルゴリズムを使いたい場合は <code>std::array</code>を選択します。 * 要素へのランダムアクセスが必要な場合は、<code>std::vector</code>または<code>std::deque</code>を選択します。 * 要素の挿入・削除が頻繁に行われる場合は、<code>std::vector</code>または<code>std::list</code>を選択します。 * 順序を保持する必要のない集合を扱う場合は、<code>std::unordered_set</code>または<code>std::unordered_map</code>を選択します。 * キーと値のペアを扱う場合は、<code>std::unordered_map</code>または<code>std::unordered_map</code>を選択します。 各コンテナの特性をよく理解し、状況に応じて適切なコンテナを選択することが重要です。 ; まとめ C++ 標準ライブラリは、さまざまなコンテナを提供しており、それぞれ異なる特徴と利点を持っています。プログラムの目的に合ったコンテナを選択することで、効率的で高速なコードを書くことができます。 == アルゴリズム == アルゴリズムとは、問題を解決するための手順の明確な定義です。一般的に、以下の要素で構成されます。 * '''入力''': アルゴリズムが処理するデータ * '''処理''': 入力データに対して行う操作 * '''出力''': アルゴリズムによって生成される結果 C++標準ライブラリでは、様々な種類のアルゴリズムが提供されており、それぞれ異なる入力、処理、出力を持つように設計されています。 === 標準ライブラリにおけるアルゴリズム === C++標準ライブラリのアルゴリズムは、ヘッダー <code><algorithm></code> に定義されています。このヘッダーには、以下の機能が含まれます。 {| class="wikitable" !分類 !代表的なアルゴリズム |- !検索 |<code>std::find</code>, <code>std::search</code>, <code>std::count</code>, <code>std::count_if</code> |- |ソート |<code>std::sort</code>, <code>std::stable_sort</code>, <code>std::partial_sort</code>, <code>std::nth_element</code> |- !範囲 |<code>std::copy</code>, <code>std::copy_if</code>, <code>std::swap</code>, <code>std::fill</code>, <code>std::fill_n</code>, <code>std::replace</code>, <code>std::replace_if</code>, <code>std::remove</code>, <code>std::remove_if</code> |- !変換 |<code>std::transform</code>, <code>std::for_each</code>, <code>std::generate</code>, <code>std::generate_n</code> |- !その他 |<code>std::max</code>, <code>std::min</code>, <code>std::minmax</code>, <code>std::swap_ranges</code>, <code>std::set_difference</code>, <code>std::set_intersection</code>, <code>std::set_union</code>, <code>std::adjacent_find</code>, <code>std::mismatch</code>, <code>std::copy_backward</code>, <code>std::move</code>, <code>std::move_backward</code>, <code>std::rotate</code>, <code>std::rotate_copy</code>, <code>std::shuffle</code>, <code>std::random_shuffle</code>, <code>std::partition</code>, <code>std::partition_point</code>, <code>std::stable_partition</code>, <code>std::is_sorted</code>, <code>std::is_partially_sorted</code>, <code>std::unique</code>, <code>std::unique_copy</code>, <code>std::count_elements</code>, <code>std::upper_bound</code>, <code>std::lower_bound</code>, <code>std::binary_search</code>, <code>std::merge</code>, <code>std::inplace_merge</code>, <code>std::set_union_of_ranges</code>, <code>std::lexicographical_compare</code>, <code>std::includes</code>, <code>std::adjacent_difference</code>, <code>std::search_n</code>, <code>std::copy_n</code>, <code>std::iota</code>, <code>std::iota_n</code>, <code>std::for_each_n</code>, <code>std::generate_n</code>, <code>std::gather</code>, <code>std::scatter</code>, <code>std::reduce</code>, <code>std::reduce_right</code>, <code>std::adjacent_reduce</code>, <code>std::accumulate</code>, <code>std::accumulate_right</code>, <code>std::transform_reduce</code>, <code>std::transform_reduce_right</code>, <code>std::max_element</code>, <code>std::min_element</code>, <code>std::max_element_n</code>, <code>std::min_element_n</code>, <code>std::minmax_element</code>, <code>std::minmax_element_n</code>, <code>std::any_of</code>, <code>std::all_of</code>, <code>std::none_of</code>, <code>std::count_if_n</code>, <code>std::find_if</code>, <code>std::find_if_n</code>, <code>std::find_first_of</code>, <code>std::find_first_of_n</code>, <code>std::any_of_n</code>, <code>std::all_of_n</code>, <code>std::none_of_n</code> |} === ソート (sort) === ソートは、データの要素を昇順または降順に整列するアルゴリズムです。C++の標準ライブラリでは、<code>std::sort</code>関数が提供されており、クイックソートやヒープソートなどの高速なソートアルゴリズムが実装されています。 === 検索 (search) === 検索は、与えられたデータから特定の要素を見つけるアルゴリズムです。C++の標準ライブラリでは、<code>std::find</code>関数が提供されており、線形検索やバイナリ検索などの効率的な検索アルゴリズムが実装されています。 === 二分探索 (binary_search) === 二分探索は、ソート済みのデータから特定の要素を効率的に見つけるアルゴリズムです。C++の標準ライブラリでは、<code>std::binary_search</code>関数が提供されており、対象の要素が存在するかどうかを判定することができます。 === 変更 (modify) === 変更は、データの要素を変更する操作を行うアルゴリズムです。C++の標準ライブラリでは、<code>std::transform</code>関数が提供されており、与えられた操作を各要素に適用することができます。 === パーミュテーション (permutation) === パーミュテーションは、与えられた要素の順列を生成するアルゴリズムです。C++の標準ライブラリでは、<code>std::next_permutation</code>関数が提供されており、要素の順列を効率的に生成することができます。 === 集計 (accumulate) === 集計は、与えられたデータの要素を合計する操作を行うアルゴリズムです。C++の標準ライブラリでは、<code>std::accumulate</code>関数が提供されており、要素の合計を計算することができます。 :<syntaxhighlight lang=c++> #include <iostream> #include <numeric> // std::accumulate #include <vector> auto main() -> int { auto numbers = std::vector{1, 2, 3, 4, 5}; auto const sum = std::accumulate(numbers.begin(), numbers.end(), 0); std::cout << "Sum: " << sum << std::endl; return 0; } </syntaxhighlight> === 順列生成 (next_permutation) === 順列生成は、与えられた要素の全ての順列を生成するアルゴリズムです。C++の標準ライブラリでは、<code>std::next_permutation</code>関数が提供されており、与えられた要素の順列を効率的に生成することができます。 === ヒープ操作 (heap) === ヒープ操作は、ヒープデータ構造を操作するアルゴリズムです。C++の標準ライブラリでは、<code>std::make_heap</code>、<code>std::push_heap</code>、<code>std::pop_heap</code>などの関数が提供されており、ヒープを構築したり、要素を追加・削除したりすることができます。 == イテレータとアダプタ == '''イテレータ'''(iterator)は、コンテナの要素を参照し、反復処理を実現するためのオブジェクトです。標準ライブラリでは様々なイテレータが定義されており、それらを使うことで柔軟でパフォーマンスの良いアルゴリズムを記述できます。 代表的なイテレータには以下のようなものがあります。 ; 入力イテレータ(input iterator) : 要素の読み取り専用 ; 出力イテレータ(output iterator) : 要素の書き込み専用 ; 前方イテレータ(forward iterator) : 単方向の反復が可能 ; 双方向イテレータ(bidirectional iterator) : 前方と逆方向の反復が可能 ; ランダムアクセスイテレータ(random access iterator) : 任意のインデックスにアクセス可能 :<syntaxhighlight lang=c++> auto v = std::vector{1, 2, 3, 4, 5}; for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; // 出力: 1 2 3 4 5 } </syntaxhighlight> '''アダプタ'''(adapter)は、既存のコンテナやイテレータから新しいビューを生成するための仕組みです。アダプタを使うことで、コピーを作らずに既存のコンテナの動作をカスタマイズできます。 よく使われるシーケンスアダプタには以下のようなものがあります。 ; std::reverse_iterator : 逆向きのイテレータを生成 ; std::move_iterator : ムーブ操作ができるイテレータを生成 ; std::inserter : 出力イテレータをコンテナに挿入操作するアダプタ :<syntaxhighlight lang=c++> auto lst = std::list{1, 2, 3, 4, 5}; std::vector<int> vec(lst.size()); std::copy(lst.begin(), lst.end(), std::back_inserter(vec)); // vecには{1, 2, 3, 4, 5}が代入される </syntaxhighlight> このように、イテレータとアダプタを適切に組み合わせることで、C++の標準ライブラリを活用した効率的で柔軟なコーディングが可能になります。 == 文字列、文字列操作と正規表現 == === 文字列(std::string, std::wstring) === C++では<code>std::string</code>クラスが文字列を表すために使われます。このクラスは様々なコンストラクタと、文字列の連結、検索、置換などの操作を行うメンバー関数を提供しています。 :<syntaxhighlight lang=c++> std::string s1 = "Hello"; // コンストラクタ std::string s2 = s1 + " World"; // 連結 // 部分文字列の検索 if (s2.find("llo") != std::string::npos) { /* ... */ } s2.replace(6, 5, "Universe"); // 置換 </syntaxhighlight> <code>std::wstring</code>はワイド文字列を扱うためのクラスで、多言語対応アプリケーションで使われます。 === 文字列ストリーム(std::stringstream) === <code>std::stringstream</code>クラスを使うと、stringオブジェクトと入出力ストリームの間で簡単に変換できます。 :<syntaxhighlight lang=c++> std::stringstream ss; ss << "Value = " << 3.14; std::string s = ss.str(); // s == "Value = 3.14" </syntaxhighlight> === 文字列リテラル(std::string_view, std::u8string_view) === C++17から導入された<code>std::string_view</code>はstring_literalを所有せずにビューとして参照するためのクラスです。メモリ消費を抑えられる一方で、nullターミネートを要求するので注意が必要です。 === 正規表現(std::regex, std::smatch, std::regex_replace, など) === C++11から正規表現をサポートするライブラリが導入されました。<code>std::regex</code>を使って正規表現オブジェクトを作成し、<code>std::smatch</code>でマッチング結果を扱えます。また、<code>std::regex_replace</code>で置換も行えます。 :<syntaxhighlight lang=c++> std::regex re("\\d+"); // 正規表現オブジェクト std::string s = "Sample 123 456"; std::smatch m; if (std::regex_search(s, m, re)) { // マッチング // m[0]にマッチした文字列が入る } std::string result = std::regex_replace(s, re, "NUM"); // Sample NUM NUM </syntaxhighlight> ECMAScriptの正規表現構文をサポートしており、文字列操作を行う上で非常に強力なツールとなっています。 == 入出力 == 入出力操作は、プログラミングにおいて非常に重要な要素です。C++の標準ライブラリでは、さまざまな形式のデータの読み書きを行うための豊富な機能が提供されています。以下では、主要な入出力について説明します。 === 標準入出力 (iostream) === 標準入出力は、プログラムとユーザーまたは他のプログラムの間でデータをやり取りするための機能です。C++の標準ライブラリでは、<code>std::cin</code>と<code>std::cout</code>というストリームオブジェクトを使用して標準入力と標準出力を操作することができます。これらのストリームを使用することで、データの読み取りや表示を簡単に行うことができます。 === ファイル入出力 (fstream) === ファイル入出力は、ファイルとプログラムの間でデータを読み書きするための機能です。C++の標準ライブラリでは、ファイル入出力ストリームを操作するための<code>std::ifstream</code>と<code>std::ofstream</code>クラスが提供されています。これらのクラスを使用することで、ファイルからデータを読み取ったり、ファイルにデータを書き込んだりすることができます。 === 【廃止】文字コード変換 (std::codecvt) === <code>std::codecvt</code>クラスは、C++17で非推奨となり、C++26で削除されることが決定されました。この変更の背景には、この機能がUnicodeの現在の標準をサポートしておらず、古いUCS-2エンコーディングのみをサポートしていたことがあります。 代替手段としては、次のようなオプションが考えられます。 ; <code>std::wstring_convert</code> : C++11で導入された<code>std::wstring_convert</code>クラスを使用します。このクラスは、広くサポートされているUTF-8、UTF-16、UTF-32エンコーディングをサポートしています。 :<syntaxhighlight lang=c++> std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv; std::u32string u32 = conv.from_bytes(u8"Hello"); std::string bytes = conv.to_bytes(u32); </syntaxhighlight> ; ライブラリの使用 : 外部ライブラリを使用することができます。例えば、ICUライブラリ(International Components for Unicode)は、Unicode文字列の変換や正規化など、幅広い機能を提供しています。 ; 独自の実装 : 特定のニーズに合わせて、独自の文字列変換ロジックを実装することもできます。ただし、Unicodeの扱いは複雑であるため、既存のライブラリを利用することをお勧めします。 また、文字列リテラルの導入により、ソースコード中に直接UTF-8やUTF-16、UTF-32の文字列を書くことができるようになりました。 :<syntaxhighlight lang=c++> auto u8_str = u8"UTF-8 文字列"; auto u_str = U"UTF-16 文字列"; auto U8_str = u8"UTF-8 文字列"; auto U_str = U"UTF-16 文字列"; </syntaxhighlight> さらに、C++17からは<code>std::byte</code>や<code>std::byte_traits</code>といった、バイトベースの操作を行うための機能が追加されています。文字変換の際にこれらを活用することで、<code>std::codecvt</code>に頼らずに済むケースが増えました。 <code>std::codecvt</code>クラスの廃止は、C++がUnicodeの最新の標準に対応するための変更です。代替手段を検討することで、アプリケーションのUnicode対応を改善できるでしょう。 === ファイルシステム (filesystem) === ファイルシステムは、ファイルやディレクトリの操作を行うための機能です。C++17からは、<code>std::filesystem</code>ライブラリが標準化され、ファイルやディレクトリの操作を行うためのさまざまなクラスや関数が提供されています。これにより、プログラムがファイルシステムを操作する際に、簡単にファイルやディレクトリを作成、削除、移動、検索することができます。 == 例外処理 == 例外処理は、プログラム実行中に予期しないエラーが発生した場合に、適切に対処するための仕組みです。C++の標準ライブラリでは、例外処理をサポートするためのさまざまな機能が提供されています。以下では、主要な例外処理について説明します。 === 例外の基本 (exception basics) === 例外は、プログラム実行中に予期しないエラーが発生した場合に発生します。例外は、プログラムの実行を中断し、エラーが発生した場所から例外処理のコードに制御を移します。例外処理は、例外が発生した際に適切な処理を行うための仕組みです。 === 例外の送出と捕捉 (throwing and catching exceptions) === 例外の送出は、予期しないエラーが発生した場合に、そのエラーを通知するために使用されます。C++では、<code>throw</code>キーワードを使用して例外を明示的に送出することができます。一方、例外の捕捉は、送出された例外を処理するための仕組みです。<code>try</code>ブロック内で例外が送出される可能性があるコードを記述し、その後に<code>catch</code>ブロックを使用して例外を捕捉し、適切な処理を行うことができます。 === 標準例外クラス (standard exception classes) === C++の標準ライブラリでは、さまざまな種類の例外を表すための標準例外クラスが提供されています。これらのクラスは、<code>std::exception</code>クラスを基底クラスとしており、異なる種類のエラーを表すために派生クラスとして使用されます。一般的な標準例外クラスには、<code>std::runtime_error</code>、<code>std::logic_error</code>、<code>std::invalid_argument</code>などがあります。これらのクラスは、特定の種類のエラーを表すために使用され、例外が送出された際にプログラムが適切に処理できるようにします。 == その他の重要な機能 == C++の標準ライブラリには、さまざまな追加機能が提供されています。以下では、その他の重要な機能について説明します。 === 時間と日付 (date and time) === 時間と日付の操作は、多くのアプリケーションで重要な要素です。C++の標準ライブラリでは、時間や日付を表すための<code>std::chrono</code>ライブラリが提供されています。このライブラリを使用することで、日付の取得、計算、比較などの操作を行うことができます。また、時間の測定や待機などの機能も提供されています。 === メモリ管理 (memory management) === メモリ管理は、プログラムが動作するために必要なメモリの割り当てと解放を行う重要な要素です。C++の標準ライブラリでは、メモリ管理を行うための機能が提供されており、<code>std::allocator</code>クラスや<code>std::shared_ptr</code>、<code>std::unique_ptr</code>などのスマートポインタが使用されます。これらの機能を使用することで、メモリリークや二重解放などの問題を回避することができます。 === スレッドと並行性 (threads and concurrency) === スレッドと並行性は、現代のプログラミングにおいて重要な要素です。C++の標準ライブラリでは、マルチスレッドプログラミングをサポートするための機能が提供されています。<code>std::thread</code>クラスや<code>std::mutex</code>、<code>std::condition_variable</code>などのクラスを使用することで、スレッド間の同期や通信を行うことができます。また、C++11以降では、スレッドプールや非同期タスクなどの機能も提供されています。 === 数学関数 (math functions) === 数学関数は、科学技術計算やグラフィックスプログラミングなどの領域で広く使用されます。C++の標準ライブラリでは、数学関数を提供するための数多くの関数が提供されています。これには、三角関数、指数関数、対数関数、乱数生成などが含まれます。これらの関数を使用することで、数学的な計算を効率的に行うことができます。 === ランダム数生成 (random number generation) === ランダム数生成は、シミュレーションやゲームなどの分野で広く使用されます。C++の標準ライブラリでは、ランダム数を生成するためのさまざまな機能が提供されています。これには、線形合同法やメルセンヌ・ツイスターなどのアルゴリズムを使用した乱数生成器が含まれます。また、乱数生成器を使用して特定の範囲の乱数を生成する機能も提供されています。 == 標準ライブラリの最適化 == 標準ライブラリの最適化は、プログラムのパフォーマンスを向上させるために重要なステップです。以下では、標準ライブラリを使用する際の最適化について説明します。 === 使用時の注意点 === 標準ライブラリを使用する際に注意するべきポイントがいくつかあります。まず、適切なコンテナやアルゴリズムを選択することが重要です。特定の操作に適したコンテナやアルゴリズムを選択することで、効率的なプログラムを作成することができます。また、不要なコピーの回避やムーブセマンティクスの活用など、効率的なプログラミング手法を採用することも重要です。 さらに、標準ライブラリの使用に伴うオーバーヘッドにも注意が必要です。標準ライブラリは一般的に汎用的な実装を提供していますが、特定の状況においてはカスタム実装がより効率的な場合があります。プログラムの特性や要件に応じて、標準ライブラリの使用を最適化することが重要です。 === パフォーマンスの向上方法 === 標準ライブラリのパフォーマンスを向上させるためには、いくつかの方法があります。まず、最適化フラグを使用してコンパイラに最適化を指示することが重要です。最適化フラグを適切に設定することで、コンパイル時に効率的なコードが生成される可能性が高まります。 また、コンテナやアルゴリズムの選択によってもパフォーマンスを向上させることができます。例えば、ベクターやアレイなどの連続したメモリ配置を持つコンテナは、ランダムアクセスやイテレーションが高速に行えるため、大量のデータを効率的に処理する際に適しています。さらに、アルゴリズムの選択によってもパフォーマンスを向上させることができます。例えば、ソートアルゴリズムや探索アルゴリズムの選択によって、処理速度を向上させることができます。 さらに、並列処理やメモリ管理の最適化など、他の最適化手法も検討する価値があります。並列処理を使用することで、複数のスレッドを使用して処理を並列化することができ、処理速度を向上させることができます。また、メモリ管理の最適化を行うことで、不要なメモリの割り当てや解放を減らすことができ、プログラムのパフォーマンスを向上させることができます。 == 外部リンク == {{Wikipedia|標準C++ライブラリ}} {{Nav}} [[Category:C++|ひようしゆんらいふらり]] htvif8ckee9420nqli2el5wrja3hwzr 264168 264166 2024-11-25T08:31:01Z Ef3 694 /* 外部リンク */ {{DEFAULTSORT:ひようしゆんらいふらり}} [[Category:C++]] 264168 wikitext text/x-wiki {{Nav}} <!-- ### 16 Library introduction [library] C++標準ライブラリは、C++プログラムをより簡潔かつ効率的に記述するための一連のクラスや関数を提供するものです。この節では、C++標準ライブラリの内容、ライブラリを使用するための適切なC++プログラムの書き方、およびライブラリのエンティティを提供するための準拠した実装方法について説明しています。 ### 16.1 General [library.general] 1. この節では、C++標準ライブラリの内容について述べ、C++プログラムがライブラリをどのように利用するのか、また準拠した実装がライブラリ内のエンティティをどのように提供するかについて説明しています。 2. 以下のサブ節では、ライブラリの記述方法(16.3節)および構成(16.4.2節)について説明しています。16.4節、および17節から33節、付録Dでは、ライブラリの内容、ライブラリの要件、および適切に形成されたC++プログラムと準拠する実装に関する制約について指定しています。 3. ライブラリ内の各コンポーネントの詳細な仕様は、17節から33節に記載されており、それらは以下の表23に示されるようにカテゴリ分けされています。 ### Table 23: Library categories [tab:library.categories] 以下は、C++標準ライブラリの各カテゴリとそれを扱う節の一覧です: - **Clause 17: Language support library** - 言語サポートライブラリ。基本的な言語機能のサポート。 - **Clause 18: Concepts library** - コンセプトライブラリ。テンプレートの制約を定義。 - **Clause 19: Diagnostics library** - 診断ライブラリ。エラーメッセージや例外処理のサポート。 - **Clause 20: Memory management library** - メモリ管理ライブラリ。メモリの動的管理のための機能。 - **Clause 21: Metaprogramming library** - メタプログラミングライブラリ。コンパイル時のプログラミング支援。 - **Clause 22: General utilities library** - 一般ユーティリティライブラリ。共通のユーティリティ関数やクラス。 - **Clause 23: Strings library** - 文字列ライブラリ。文字列操作のための機能。 - **Clause 24: Containers library** - コンテナライブラリ。データ構造(配列、リスト、マップなど)。 - **Clause 25: Iterators library** - イテレータライブラリ。コンテナを操作するためのイテレータ。 - **Clause 26: Ranges library** - レンジライブラリ。範囲ベースの操作のためのサポート。 - **Clause 27: Algorithms library** - アルゴリズムライブラリ。標準アルゴリズム(ソート、検索など)。 - **Clause 28: Numerics library** - 数値ライブラリ。数値計算のための機能。 - **Clause 29: Time library** - 時間ライブラリ。時間と日付の操作。 - **Clause 30: Localization library** - ローカライゼーションライブラリ。地域と言語特有の機能。 - **Clause 31: Input/output library** - 入出力ライブラリ。データの入力と出力のための機能。 - **Clause 32: Regular expressions library** - 正規表現ライブラリ。パターンマッチングのための正規表現機能。 - **Clause 33: Concurrency support library** - 並行処理サポートライブラリ。スレッドや並行処理のための機能。 --> = C++教科書/標準ライブラリ編 = == 標準ライブラリとは == C++標準ライブラリは、効率的なプログラミングに不可欠な包括的なツールセットです。コンテナ、アルゴリズム、入出力機能、文字列操作、並行処理など、幅広い機能を提供します。これらを活用することで、開発効率の向上、コードの品質改善、そしてクロスプラットフォームの互換性を実現できます。本書では、C++20/23の最新機能を含む標準ライブラリの各コンポーネントについて、実践的な例を交えながら解説します。 == 標準ライブラリの基本構造 == C++標準ライブラリは、以下のような機能群で構成されています: === コアライブラリ === * [[C++/標準ライブラリ/言語サポートライブラリ|言語サポートライブラリ]] - 言語機能の基礎的なサポート * [[C++/標準ライブラリ/コンセプトライブラリ|コンセプトライブラリ]] - テンプレートの制約を表現(C++20以降) * [[C++/標準ライブラリ/診断ライブラリ|診断ライブラリ]] - 例外処理と診断機能 * [[C++/標準ライブラリ/メモリ管理ライブラリ|メモリ管理ライブラリ]] - スマートポインタとメモリ割り当て === 基本ユーティリティ === * [[C++/標準ライブラリ/メタプログラミングライブラリ|メタプログラミングライブラリ]] - コンパイル時プログラミング機能 * [[C++/標準ライブラリ/一般ユーティリティライブラリ|一般ユーティリティライブラリ]] - 汎用的なツール群 * [[C++/標準ライブラリ/文字列ライブラリ|文字列ライブラリ]] - 文字列操作機能 === データ構造とアルゴリズム === * [[C++/標準ライブラリ/コンテナライブラリ|コンテナライブラリ]] - データ構造の実装 * [[C++/標準ライブラリ/イテレータライブラリ|イテレータライブラリ]] - コンテナ走査機能 * [[C++/標準ライブラリ/レンジライブラリ|レンジライブラリ]] - 範囲ベースの操作(C++20以降) * [[C++/標準ライブラリ/アルゴリズムライブラリ|アルゴリズムライブラリ]] - 汎用アルゴリズム群 === 特殊機能ライブラリ === * [[C++/標準ライブラリ/数値ライブラリ|数値ライブラリ]] - 数値計算と数学関数 * [[C++/標準ライブラリ/時間ライブラリ|時間ライブラリ]] - 時間と日付の処理 * [[C++/標準ライブラリ/ローカライゼーションライブラリ|ローカライゼーションライブラリ]] - 国際化対応 * [[C++/標準ライブラリ/入出力ライブラリ|入出力ライブラリ]] - ストリームベースのI/O * [[C++/標準ライブラリ/正規表現ライブラリ|正規表現ライブラリ]] - パターンマッチング * [[C++/標準ライブラリ/並行性サポートライブラリ|並行性サポートライブラリ]] - マルチスレッドとタスク並列処理 == ヘッダーと名前空間の利用 == === 基本的な使用方法 === C++標準ライブラリのコンポーネントは、ヘッダーファイルとして提供され、<code>std</code>名前空間内に定義されています。利用するには、適切なヘッダーをインクルードし、<code>std::</code>修飾子を使用します: :<syntaxhighlight lang=c++ copy> #include <vector> #include <string> std::vector<int> numbers; std::string text; </syntaxhighlight> === 名前空間の best practices === ==== using宣言の適切な使用 ==== * '''推奨される方法''': *: 特定の要素のみを使用する場合: *:<syntaxhighlight lang=c++ copy> using std::vector; using std::string; </syntaxhighlight> *: 関数のスコープ内での限定的な使用: *:<syntaxhighlight lang=c++ copy> void process_data() { using std::cout; cout << "Processing..." << std::endl; } </syntaxhighlight> ==== using namespace std の問題点 ==== <code>using namespace std;</code>の使用は以下の理由で非推奨です: # '''名前の衝突''':標準ライブラリの名前とユーザーコードの名前が予期せず衝突する可能性 # '''コードの明確性の低下''':どの関数や型が標準ライブラリに属するのか不明確になる # '''メンテナンス性への影響''':将来的なコードの変更や拡張時に問題を引き起こす可能性 # '''大規模プロジェクトでの管理困難''':複数の名前空間が混在する際の依存関係の把握が困難 === C++20以降の新機能 === * '''モジュール''':ヘッダーファイルの代替として、より効率的なモジュールシステムが導入(C++20) * '''レンジライブラリ''':より直感的なコレクション操作 * '''コルーチン''':非同期プログラミングの新しいパラダイム * '''コンセプト''':テンプレートの制約を明示的に表現 == 標準ライブラリヘッダー == * <[[C++/標準ライブラリ/algorithm|algorithm]]> &mdash; 多様なアルゴリズムを提供するクラスと関数。(C++98) * <[[C++/標準ライブラリ/any|any]]> &mdash; 任意の型を保持できる型安全なコンテナ。(C++17) * <[[C++/標準ライブラリ/array|array]]> &mdash; 固定サイズの配列コンテナ。(C++11) * <[[C++/標準ライブラリ/atomic|atomic]]> &mdash; 原子操作。(C++11) * <[[C++/標準ライブラリ/barrier|barrier]]> &mdash; スレッドの同期のサポートするバリア。(C++20) * <[[C++/標準ライブラリ/bit|bit]]> &mdash; ビット操作用のユーティリティ。(C++20) * <[[C++/標準ライブラリ/bitset|bitset]]> &mdash; 固定サイズのビット列コンテナ。(C++98) * <[[C++/標準ライブラリ/charconv|charconv]]> &mdash; 文字列と数値の変換。(C++17) * <[[C++/標準ライブラリ/chrono|chrono]]> &mdash; 時間の計測と操作のサポート。(C++11) * <[[C++/標準ライブラリ/codecvt|codecvt]]> &mdash; 文字コード変換を行うファセット<sup>†</sup>。(C++11、C++17で非推奨) * <[[C++/標準ライブラリ/compare|compare]]> &mdash; 比較のサポート。(C++20) * <[[C++/標準ライブラリ/complex|complex]]> &mdash; 複素数型のサポート。(C++98) * <[[C++/標準ライブラリ/concepts|concepts]]> &mdash; コンセプト定義。(C++20) * <[[C++/標準ライブラリ/condition_variable|condition_variable]]> &mdash; スレッド間の待機と通知のサポート。(C++11) * <[[C++/標準ライブラリ/coroutine|coroutine]]> &mdash; コルーチンのサポート。(C++20) * <[[C++/標準ライブラリ/deque|deque]]> &mdash; 両端キューコンテナ。(C++98) * <[[C++/標準ライブラリ/exception|exception]]> &mdash; 例外処理のサポート。(C++98) * <[[C++/標準ライブラリ/execution|execution]]> &mdash; 並列アルゴリズムの実行ポリシー。(C++17) * <[[C++/標準ライブラリ/expected|expected]]> &mdash; エラーを返す可能性のある操作の結果。(C++23) * <[[C++/標準ライブラリ/filesystem|filesystem]]> &mdash; ファイルシステム操作のサポート。(C++17) * <[[C++/標準ライブラリ/flat_map|flat_map]]> &mdash; ソートされた連想コンテナ。(C++23) * <[[C++/標準ライブラリ/flat_set|flat_set]]> &mdash; ソートされたセットコンテナ。(C++23) * <[[C++/標準ライブラリ/format|format]]> &mdash; 文字列のフォーマット機能。(C++20) * <[[C++/標準ライブラリ/forward_list|forward_list]]> &mdash; 単方向リストコンテナ。(C++11) * <[[C++/標準ライブラリ/fstream|fstream]]> &mdash; ファイル入出力のサポート。(C++98) * <[[C++/標準ライブラリ/functional|functional]]> &mdash; 関数オブジェクトとユーティリティ。(C++98) * <[[C++/標準ライブラリ/future|future]]> &mdash; 非同期操作の結果を取得。(C++11) * <[[C++/標準ライブラリ/generator|generator]]> &mdash; ジェネレーターのサポート。(C++23) * <[[C++/標準ライブラリ/initializer_list|initializer_list]]> &mdash; 初期化リストのサポート。(C++11) * <[[C++/標準ライブラリ/iomanip|iomanip]]> &mdash; 入出力ストリームの操作。(C++98) * <[[C++/標準ライブラリ/ios|ios]]> &mdash; 基本的な入出力ストリームのクラス。(C++98) * <[[C++/標準ライブラリ/iosfwd|iosfwd]]> &mdash; 入出力ストリームクラスの前方宣言。(C++98) * <[[C++/標準ライブラリ/iostream|iostream]]> &mdash; 標準入出力ストリームオブジェクト。(C++98) * <[[C++/標準ライブラリ/istream|istream]]> &mdash; 入力ストリームクラス。(C++98) * <[[C++/標準ライブラリ/iterator|iterator]]> &mdash; イテレータのユーティリティと型。(C++98) * <[[C++/標準ライブラリ/latch|latch]]> &mdash; スレッド同期のためのラッチ。(C++20) * <[[C++/標準ライブラリ/limits|limits]]> &mdash; 型の限界値情報を提供。(C++98) * <[[C++/標準ライブラリ/list|list]]> &mdash; 双方向リストコンテナ。(C++98) * <[[C++/標準ライブラリ/locale|locale]]> &mdash; ロケールと国際化サポート。(C++98) * <[[C++/標準ライブラリ/map|map]]> &mdash; キーと値のペアを保持する連想コンテナ。(C++98) * <[[C++/標準ライブラリ/mdspan|mdspan]]> &mdash; 多次元配列のビュー。(C++23) * <[[C++/標準ライブラリ/memory|memory]]> &mdash; 動的メモリ管理とスマートポインタ。(C++98) * <[[C++/標準ライブラリ/memory_resource|memory_resource]]> &mdash; メモリリソースとポリシー。(C++17) * <[[C++/標準ライブラリ/mutex|mutex]]> &mdash; 相互排他制御のプリミティブ。(C++11) * <[[C++/標準ライブラリ/new|new]]> &mdash; 動的メモリ割り当ての管理。(C++98) * <[[C++/標準ライブラリ/numbers|numbers]]> &mdash; 数値定数の定義。(C++20) * <[[C++/標準ライブラリ/numeric|numeric]]> &mdash; 数値計算のユーティリティ。(C++98) * <[[C++/標準ライブラリ/optional|optional]]> &mdash; オプショナル型。(C++17) * <[[C++/標準ライブラリ/ostream|ostream]]> &mdash; 出力ストリームクラス。(C++98) * <[[C++/標準ライブラリ/print|print]]> &mdash; 標準出力への出力のサポート。(C++23) * <[[C++/標準ライブラリ/queue|queue]]> &mdash; FIFO(先入れ先出し)コンテナ。(C++98) * <[[C++/標準ライブラリ/random|random]]> &mdash; 乱数生成ライブラリ。(C++11) * <[[C++/標準ライブラリ/ranges|ranges]]> &mdash; 範囲ベースのアルゴリズム。(C++20) * <[[C++/標準ライブラリ/ratio|ratio]]> &mdash; コンパイル時の有理数演算。(C++11) * <[[C++/標準ライブラリ/regex|regex]]> &mdash; 正規表現のサポート。(C++11) * <[[C++/標準ライブラリ/scoped_allocator|scoped_allocator]]> &mdash; スコープ付きアロケータのラッパー。(C++11) * <[[C++/標準ライブラリ/semaphore|semaphore]]> &mdash; スレッド間の同期を制御。(C++20) * <[[C++/標準ライブラリ/set|set]]> &mdash; 集合コンテナ。(C++98) * <[[C++/標準ライブラリ/shared_mutex|shared_mutex]]> &mdash; 共有と独占のロック制御。(C++14) * <[[C++/標準ライブラリ/source_location|source_location]]> &mdash; ソースコード位置情報。(C++20) * <[[C++/標準ライブラリ/span|span]]> &mdash; 連続メモリのビュー。(C++20) * <[[C++/標準ライブラリ/spanstream|spanstream]]> &mdash; メモリバッファへのストリーム。(C++23) * <[[C++/標準ライブラリ/sstream|sstream]]> &mdash; 文字列ストリームクラス。(C++98) * <[[C++/標準ライブラリ/stack|stack]]> &mdash; LIFO(後入れ先出し)コンテナ。(C++98) * <[[C++/標準ライブラリ/stacktrace|stacktrace]]> &mdash; スタックトレースのサポート。(C++23) * <[[C++/標準ライブラリ/stdexcept|stdexcept]]> &mdash; 標準的な例外クラス。(C++98) * <[[C++/標準ライブラリ/stdfloat|stdfloat]]> &mdash; 標準浮動小数点数。(C++23) * <[[C++/標準ライブラリ/stop_token|stop_token]]> &mdash; 停止トークンのサポート。(C++20) * <[[C++/標準ライブラリ/streambuf|streambuf]]> &mdash; ストリームバッファ。(C++98) * <[[C++/標準ライブラリ/string|string]]> &mdash; 文字列クラス。(C++98) * <[[C++/標準ライブラリ/string_view|string_view]]> &mdash; 文字列の読み取りビュー。(C++17) * <[[C++/標準ライブラリ/strstream|strstream]]> &mdash; 文字列バッファストリーム。(C++98、C++98で非推奨) * <[[C++/標準ライブラリ/syncstream|syncstream]]> &mdash; 同期ストリーム出力。(C++20) * <[[C++/標準ライブラリ/system_error|system_error]]> &mdash; システムエラーの報告。(C++11) * <[[C++/標準ライブラリ/thread|thread]]> &mdash; マルチスレッドのサポート。(C++11) * <[[C++/標準ライブラリ/tuple|tuple]]> &mdash; 異なる型のタプル。(C++11) * <[[C++/標準ライブラリ/type_traits|type_traits]]> &mdash; 型特性の操作。(C++11) * <[[C++/標準ライブラリ/typeindex|typeindex]]> &mdash; 型情報のインデックス。(C++11) * <[[C++/標準ライブラリ/typeinfo|typeinfo]]> &mdash; ランタイム型情報。(C++98) * <[[C++/標準ライブラリ/unordered_map|unordered_map]]> &mdash; ハッシュテーブル連想コンテナ。(C++11) * <[[C++/標準ライブラリ/unordered_set|unordered_set]]> &mdash; ハッシュテーブル集合コンテナ。(C++11) * <[[C++/標準ライブラリ/utility|utility]]> &mdash; 汎用ユーティリティ。(C++98) * <[[C++/標準ライブラリ/valarray|valarray]]> &mdash; 数値配列クラス。(C++98) * <[[C++/標準ライブラリ/variant|variant]]> &mdash; 複数の型を持つユニオン。(C++17) * <[[C++/標準ライブラリ/vector|vector]]> &mdash; 動的配列コンテナ。(C++98) * <[[C++/標準ライブラリ/version|version]]> &mdash; バージョン情報。(C++20) === C言語互換ヘッダー === C言語ヘッダーの先頭に '''c''' を補い末尾から '''.h''' を取り去る。 * <[[C++/標準ライブラリ/cassert|cassert]]> — アサーションのサポート。(C++98) * <[[C++/標準ライブラリ/cctype|cctype]]> — 文字分類と変換。(C++98) * <[[C++/標準ライブラリ/cerrno|cerrno]]> — エラーナンバー定義。(C++98) * <[[C++/標準ライブラリ/cfenv|cfenv]]> — 浮動小数点環境の制御。(C++11) * <[[C++/標準ライブラリ/cfloat|cfloat]]> — 浮動小数点数の特性。(C++98) * <[[C++/標準ライブラリ/cinttypes|cinttypes]]> — 整数型のフォーマット変換。(C++11) * <[[C++/標準ライブラリ/climits|climits]]> — 整数型の限界値。(C++98) * <[[C++/標準ライブラリ/clocale|clocale]]> — ロケールの設定と取得。(C++98) * <[[C++/標準ライブラリ/cmath|cmath]]> — 数学関数ライブラリ。(C++98) * <[[C++/標準ライブラリ/csetjmp|csetjmp]]> — 非局所ジャンプのサポート。(C++98) * <[[C++/標準ライブラリ/csignal|csignal]]> — シグナル処理のサポート。(C++98) * <[[C++/標準ライブラリ/cstdarg|cstdarg]]> — 可変引数リストの操作。(C++98) * <[[C++/標準ライブラリ/cstddef|cstddef]]> — 標準型とマクロ。(C++98) * <[[C++/標準ライブラリ/cstdint|cstdint]]> — 固定幅整数型。(C++11) * <[[C++/標準ライブラリ/cstdio|cstdio]]> — 標準入出力関数。(C++98) * <[[C++/標準ライブラリ/cstdlib|cstdlib]]> — 標準ライブラリのユーティリティ。(C++98) * <[[C++/標準ライブラリ/cstring|cstring]]> — 文字列操作関数。(C++98) * <[[C++/標準ライブラリ/ctime|ctime]]> — 時間処理関数。(C++98) * <[[C++/標準ライブラリ/cuchar|cuchar]]> — Unicode文字操作関数。(C++11) * <[[C++/標準ライブラリ/cwchar|cwchar]]> — ワイド文字操作関数。(C++98) * <[[C++/標準ライブラリ/cwctype|cwctype]]> — ワイド文字分類と変換。(C++98) === C言語ヘッダー === 全て(C++98) * <[[C言語/標準ライブラリ/assert.h|assert.h]]> * <[[C言語/標準ライブラリ/complex.h|complex.h]]> * <[[C言語/標準ライブラリ/ctype.h|ctype.h]]> * <[[C言語/標準ライブラリ/errno.h|errno.h]]> * <[[C言語/標準ライブラリ/fenv.h|fenv.h]]> * <[[C言語/標準ライブラリ/float.h|float.h]]> * <[[C言語/標準ライブラリ/inttypes.h|inttypes.h]]> * <[[C言語/標準ライブラリ/iso646.h|iso646.h]]> * <[[C言語/標準ライブラリ/limits.h|limits.h]]> * <[[C言語/標準ライブラリ/locale.h|locale.h]]> * <[[C言語/標準ライブラリ/math.h|math.h]]> * <[[C言語/標準ライブラリ/setjmp.h|setjmp.h]]> * <[[C言語/標準ライブラリ/signal.h|signal.h]]> * <[[C言語/標準ライブラリ/stdalign.h|stdalign.h]]> * <[[C言語/標準ライブラリ/stdarg.h|stdarg.h]]> * <[[C言語/標準ライブラリ/stdatomic.h|stdatomic.h]]> * <[[C言語/標準ライブラリ/stdbool.h|stdbool.h]]> * <[[C言語/標準ライブラリ/stddef.h|stddef.h]]> * <[[C言語/標準ライブラリ/stdint.h|stdint.h]]> * <[[C言語/標準ライブラリ/stdio.h|stdio.h]]> * <[[C言語/標準ライブラリ/stdlib.h|stdlib.h]]> * <[[C言語/標準ライブラリ/string.h|string.h]]> * <[[C言語/標準ライブラリ/tgmath.h|tgmath.h]]> * <[[C言語/標準ライブラリ/time.h|time.h]]> * <[[C言語/標準ライブラリ/uchar.h|uchar.h]]> * <[[C言語/標準ライブラリ/wchar.h|wchar.h]]> * <[[C言語/標準ライブラリ/wctype.h|wctype.h]]> :{| class="sortable wikitable" style="width: stretch; margin: 0 auto;" |+ 標準ライブラリヘッダー分類表 ! ヘッダー ||style="width:7rem"| 分類 || 初出 || 説明 |- | <[[C++/標準ライブラリ/concepts|concepts]]> &mdash; || コンセプト || C++20 || コンセプト基本ライブラリ |- | <[[C++/標準ライブラリ/coroutine|coroutine]]> &mdash; || コルーチン || C++20 || コルーチンサポートライブラリ |- | <[[C++/標準ライブラリ/any|any]]> &mdash; || ユーティリティ || C++17 || <code>std::any</code>クラス |- | <[[C++/標準ライブラリ/bitset|bitset]]> &mdash; || ユーティリティ || - || <code>std::bitset</code>クラステンプレート |- | <[[C++/標準ライブラリ/chrono|chrono]]> &mdash; || ユーティリティ || C++11 || C++時間ユーティリティ |- | <[[C++/標準ライブラリ/compare|compare]]> &mdash; || ユーティリティ || C++20 || 3方向比較演算子サポート |- | <[[C++/標準ライブラリ/csetjmp|csetjmp]]> &mdash; || ユーティリティ || - || 実行コンテキストを保存/ジャンプするマクロ(と関数) |- | <[[C++/標準ライブラリ/csignal|csignal]]> &mdash; || ユーティリティ || - || シグナル管理の関数とマクロ定数 |- | <[[C++/標準ライブラリ/cstdarg|cstdarg]]> &mdash; || ユーティリティ || - || 可変長引数リストの処理 |- | <[[C++/標準ライブラリ/cstddef|cstddef]]> &mdash; || ユーティリティ || - || 標準マクロとtypedef |- | <[[C++/標準ライブラリ/cstdlib|cstdlib]]> &mdash; || ユーティリティ || - || 一般的なユーティリティ:プログラム制御、動的メモリ割り当て、乱数、ソートと検索 |- | <[[C++/標準ライブラリ/ctime|ctime]]> &mdash; || ユーティリティ || - || C形式の時刻/日付ユーティリティ |- | <[[C++/標準ライブラリ/debugging|debugging]]> &mdash; || ユーティリティ || C++26 || デバッグライブラリ |- | <[[C++/標準ライブラリ/expected|expected]]> &mdash; || ユーティリティ || C++23 || <code>std::expected</code>クラステンプレート |- | <[[C++/標準ライブラリ/functional|functional]]> &mdash; || ユーティリティ || - || 関数オブジェクト、関数呼び出し、バインド操作、参照ラッパー |- | <[[C++/標準ライブラリ/initializer_list|initializer_list]]> &mdash; || ユーティリティ || C++11 || <code>std::initializer_list</code>クラステンプレート |- | <[[C++/標準ライブラリ/optional|optional]]> &mdash; || ユーティリティ || C++17 || <code>std::optional</code>クラステンプレート |- | <[[C++/標準ライブラリ/source_location|source_location]]> &mdash; || ユーティリティ || C++20 || ソースコード位置を取得する手段を提供 |- | <[[C++/標準ライブラリ/tuple|tuple]]> &mdash; || ユーティリティ || C++11 || <code>std::tuple</code>クラステンプレート |- | <[[C++/標準ライブラリ/type_traits|type_traits]]> &mdash; || ユーティリティ || C++11 || コンパイル時型情報 |- | <[[C++/標準ライブラリ/typeindex|typeindex]]> &mdash; || ユーティリティ || C++11 || <code>std::type_index</code> |- | <[[C++/標準ライブラリ/typeinfo|typeinfo]]> &mdash; || ユーティリティ || - || 実行時型情報ユーティリティ |- | <[[C++/標準ライブラリ/utility|utility]]> &mdash; || ユーティリティ || - || 様々なユーティリティコンポーネント |- | <[[C++/標準ライブラリ/variant|variant]]> &mdash; || ユーティリティ || C++17 || <code>std::variant</code>クラステンプレート |- | <[[C++/標準ライブラリ/version|version]]> &mdash; || ユーティリティ || C++20 || 実装依存のライブラリ情報を提供 |- | <[[C++/標準ライブラリ/memory|memory]]> &mdash; || 動的メモリ管理 || - || 高レベルメモリ管理ユーティリティ |- | <[[C++/標準ライブラリ/memory_resource|memory_resource]]> &mdash; || 動的メモリ管理 || C++17 || 多相的アロケータとメモリリソース |- | <[[C++/標準ライブラリ/new|new]]> &mdash; || 動的メモリ管理 || - || 低レベルメモリ管理ユーティリティ |- | <[[C++/標準ライブラリ/scoped_allocator|scoped_allocator]]> &mdash; || 動的メモリ管理 || C++11 || ネストされたアロケータクラス |- | <[[C++/標準ライブラリ/cfloat|cfloat]]> &mdash; || 数値限界 || - || 浮動小数点型の限界値 |- | <[[C++/標準ライブラリ/cinttypes|cinttypes]]> &mdash; || 数値限界 || C++11 || 書式マクロ、<code>intmax_t</code>と<code>uintmax_t</code>、数学と変換 |- | <[[C++/標準ライブラリ/climits|climits]]> &mdash; || 数値限界 || - || 整数型の限界値 |- | <[[C++/標準ライブラリ/cstdint|cstdint]]> &mdash; || 数値限界 || C++11 || 固定幅整数型と他の型の限界値 |- | <[[C++/標準ライブラリ/limits|limits]]> &mdash; || 数値限界 || - || 算術型のプロパティを問い合わせる統一された方法 |- | <[[C++/標準ライブラリ/stdfloat|stdfloat]]> &mdash; || 数値限界 || C++23 || オプションの拡張浮動小数点型 |- | <[[C++/標準ライブラリ/cassert|cassert]]> &mdash; || エラー処理 || - || ゼロと比較し、条件付きでマクロを定義 |- | <[[C++/標準ライブラリ/cerrno|cerrno]]> &mdash; || エラー処理 || - || 最後のエラー番号を含むマクロ |- | <[[C++/標準ライブラリ/exception|exception]]> &mdash; || エラー処理 || - || 例外処理ユーティリティ |- | <[[C++/標準ライブラリ/stacktrace|stacktrace]]> &mdash; || エラー処理 || C++23 || スタックトレースライブラリ |- | <[[C++/標準ライブラリ/stdexcept|stdexcept]]> &mdash; || エラー処理 || - || 標準例外オブジェクト |- | <[[C++/標準ライブラリ/system_error|system_error]]> &mdash; || エラー処理 || C++11 || <code>std::error_code</code>を定義(プラットフォーム依存のエラーコード) |- | <[[C++/標準ライブラリ/cctype|cctype]]> &mdash; || 文字列 || - || ナロー文字のカテゴリを判別する関数 |- | <[[C++/標準ライブラリ/charconv|charconv]]> &mdash; || 文字列 || C++17 || <code>std::to_chars</code>と<code>std::from_chars</code> |- | <[[C++/標準ライブラリ/cstring|cstring]]> &mdash; || 文字列 || - || 様々なナロー文字列処理関数 |- | <[[C++/標準ライブラリ/cuchar|cuchar]]> &mdash; || 文字列 || C++11 || C形式のUnicode文字変換関数 |- | <[[C++/標準ライブラリ/cwchar|cwchar]]> &mdash; || 文字列 || - || 様々なワイド/マルチバイト文字列処理関数 |- | <[[C++/標準ライブラリ/cwctype|cwctype]]> &mdash; || 文字列 || - || ワイド文字のカテゴリを判別する関数 |- | <[[C++/標準ライブラリ/format|format]]> &mdash; || 文字列 || C++20 || 書式化ライブラリ(<code>std::format</code>を含む) |- | <[[C++/標準ライブラリ/string|string]]> &mdash; || 文字列 || - || <code>std::basic_string</code>クラステンプレート |- | <[[C++/標準ライブラリ/string_view|string_view]]> &mdash; || 文字列 || C++17 || <code>std::basic_string_view</code>クラステンプレート |- | <[[C++/標準ライブラリ/array|array]]> &mdash; || コンテナ || C++11 || <code>std::array</code>コンテナ |- | <[[C++/標準ライブラリ/deque|deque]]> &mdash; || コンテナ || - || <code>std::deque</code>コンテナ |- | <[[C++/標準ライブラリ/flat_map|flat_map]]> &mdash; || コンテナ || C++23 || <code>std::flat_map</code>と<code>std::flat_multimap</code>コンテナアダプター |- | <[[C++/標準ライブラリ/flat_set|flat_set]]> &mdash; || コンテナ || C++23 || <code>std::flat_set</code>と<code>std::flat_multiset</code>コンテナアダプター |- | <[[C++/標準ライブラリ/forward_list|forward_list]]> &mdash; || コンテナ || C++11 || <code>std::forward_list</code>コンテナ |- | <[[C++/標準ライブラリ/list|list]]> &mdash; || コンテナ || - || <code>std::list</code>コンテナ |- | <[[C++/標準ライブラリ/map|map]]> &mdash; || コンテナ || - || <code>std::map</code>と<code>std::multimap</code>の連想コンテナ |- | <[[C++/標準ライブラリ/mdspan|mdspan]]> &mdash; || コンテナ || C++23 || <code>std::mdspan</code>ビュー |- | <[[C++/標準ライブラリ/queue|queue]]> &mdash; || コンテナ || - || <code>std::queue</code>と<code>std::priority_queue</code>のコンテナアダプター |- | <[[C++/標準ライブラリ/set|set]]> &mdash; || コンテナ || - || <code>std::set</code>と<code>std::multiset</code>の連想コンテナ |- | <[[C++/標準ライブラリ/span|span]]> &mdash; || コンテナ || C++20 || <code>std::span</code>ビュー |- | <[[C++/標準ライブラリ/stack|stack]]> &mdash; || コンテナ || - || <code>std::stack</code>コンテナアダプター |- | <[[C++/標準ライブラリ/unordered_map|unordered_map]]> &mdash; || コンテナ || C++11 || <code>std::unordered_map</code>と<code>std::unordered_multimap</code>の非順序連想コンテナ |- | <[[C++/標準ライブラリ/unordered_set|unordered_set]]> &mdash; || コンテナ || C++11 || <code>std::unordered_set</code>と<code>std::unordered_multiset</code>の非順序連想コンテナ |- | <[[C++/標準ライブラリ/vector|vector]]> &mdash; || コンテナ || - || <code>std::vector</code>コンテナ |- | <[[C++/標準ライブラリ/iterator|iterator]]> &mdash; || イテレータ || - || 範囲イテレータ |- | <[[C++/標準ライブラリ/generator|generator]]> &mdash; || 範囲 || C++23 || <code>std::generator</code>クラステンプレート |- | <[[C++/標準ライブラリ/ranges|ranges]]> &mdash; || 範囲 || C++20 || 範囲アクセス、プリミティブ、要件、ユーティリティ、アダプター |- | <[[C++/標準ライブラリ/algorithm|algorithm]]> &mdash; || アルゴリズム || - || 範囲に作用するアルゴリズム |- | <[[C++/標準ライブラリ/execution|execution]]> &mdash; || アルゴリズム || C++17 || アルゴリズムの並列バージョンに対する既定の実行ポリシー |- | <[[C++/標準ライブラリ/bit|bit]]> &mdash; || 数値 || C++20 || ビット操作関数 |- | <[[C++/標準ライブラリ/cfenv|cfenv]]> &mdash; || 数値 || C++11 || 浮動小数点環境アクセス関数 |- | <[[C++/標準ライブラリ/cmath|cmath]]> &mdash; || 数値 || - || 共通の数学関数 |- | <[[C++/標準ライブラリ/complex|complex]]> &mdash; || 数値 || - || 複素数型 |- | <[[C++/標準ライブラリ/linalg|linalg]]> &mdash; || 数値 || C++26 || 基本的な線形代数アルゴリズム |- | <[[C++/標準ライブラリ/numbers|numbers]]> &mdash; || 数値 || C++20 || 数学定数 |- | <[[C++/標準ライブラリ/numeric|numeric]]> &mdash; || 数値 || - || 範囲内の値に対する数値演算 |- | <[[C++/標準ライブラリ/random|random]]> &mdash; || 数値 || C++11 || 乱数生成器と分布 |- | <[[C++/標準ライブラリ/ratio|ratio]]> &mdash; || 数値 || C++11 || コンパイル時有理数演算 |- | <[[C++/標準ライブラリ/valarray|valarray]]> &mdash; || 数値 || - || 値の配列を表現し操作するためのクラス |- | <[[C++/標準ライブラリ/clocale|clocale]]> &mdash; || 地域化 || - || C言語の地域化ユーティリティ |- | <[[C++/標準ライブラリ/codecvt|codecvt]]> &mdash; || 地域化 || C++11 || Unicode変換機能 (C++17で非推奨、C++26で削除) |- | <[[C++/標準ライブラリ/locale|locale]]> &mdash; || 地域化 || - || 地域化ユーティリティ |- | <[[C++/標準ライブラリ/text_encoding|text_encoding]]> &mdash; || 地域化 || C++26 || テキストエンコーディングの識別 |- | <[[C++/標準ライブラリ/cstdio|cstdio]]> &mdash; || 入出力 || - || C形式の入出力関数 |- | <[[C++/標準ライブラリ/fstream|fstream]]> &mdash; || 入出力 || - || <code>std::basic_fstream</code>、<code>std::basic_ifstream</code>、<code>std::basic_ofstream</code>クラステンプレートといくつかのtypedef |- | <[[C++/標準ライブラリ/iomanip|iomanip]]> &mdash; || 入出力 || - || 入出力のフォーマットを制御するヘルパー関数 |- | <[[C++/標準ライブラリ/ios|ios]]> &mdash; || 入出力 || - || <code>std::ios_base</code>クラス、<code>std::basic_ios</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/iosfwd|iosfwd]]> &mdash; || 入出力 || - || 入出力ライブラリのすべてのクラスの前方宣言 |- | <[[C++/標準ライブラリ/iostream|iostream]]> &mdash; || 入出力 || - || 様々な標準ストリームオブジェクト |- | <[[C++/標準ライブラリ/istream|istream]]> &mdash; || 入出力 || - || <code>std::basic_istream</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/ostream|ostream]]> &mdash; || 入出力 || - || <code>std::basic_ostream</code>、<code>std::basic_iostream</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/print|print]]> &mdash; || 入出力 || C++23 || 書式付き出力ライブラリ(<code>std::print</code>を含む) |- | <[[C++/標準ライブラリ/spanstream|spanstream]]> &mdash; || 入出力 || C++23 || <code>std::basic_spanstream</code>、<code>std::basic_ispanstream</code>、<code>std::basic_ospanstream</code>クラステンプレート、typedef |- | <[[C++/標準ライブラリ/sstream|sstream]]> &mdash; || 入出力 || - || <code>std::basic_stringstream</code>、<code>std::basic_istringstream</code>、<code>std::basic_ostringstream</code>クラステンプレート、いくつかのtypedef |- | <[[C++/標準ライブラリ/streambuf|streambuf]]> &mdash; || 入出力 || - || <code>std::basic_streambuf</code>クラステンプレート |- | <[[C++/標準ライブラリ/syncstream|syncstream]]> &mdash; || 入出力 || C++20 || <code>std::basic_osyncstream</code>、<code>std::basic_syncbuf</code>、typedef |- | <[[C++/標準ライブラリ/filesystem|filesystem]]> &mdash; || ファイルシステム || C++17 || <code>std::path</code>クラスとサポート関数 |- | <[[C++/標準ライブラリ/regex|regex]]> &mdash; || 正規表現 || C++11 || 正規表現処理のサポートするクラス、アルゴリズム、イテレータ |- | <[[C++/標準ライブラリ/atomic|atomic]]> &mdash; || 原子操作 || C++11 || 原子操作ライブラリ |- | <[[C++/標準ライブラリ/barrier|barrier]]> &mdash; || スレッドサポート || C++20 || バリア |- | <[[C++/標準ライブラリ/condition_variable|condition_variable]]> &mdash; || スレッドサポート || C++11 || スレッド待機条件 |- | <[[C++/標準ライブラリ/future|future]]> &mdash; || スレッドサポート || C++11 || 非同期コンピューティングのプリミティブ |- | <[[C++/標準ライブラリ/hazard_pointer|hazard_pointer]]> &mdash; || スレッドサポート || C++26 || ハザードポインター |- | <[[C++/標準ライブラリ/latch|latch]]> &mdash; || スレッドサポート || C++20 || ラッチ |- | <[[C++/標準ライブラリ/mutex|mutex]]> &mdash; || スレッドサポート || C++11 || 相互排除プリミティブ |- | <[[C++/標準ライブラリ/rcu|rcu]]> &mdash; || スレッドサポート || C++26 || Read-Copy Update メカニズム |- | <[[C++/標準ライブラリ/semaphore|semaphore]]> &mdash; || スレッドサポート || C++20 || セマフォ |- | <[[C++/標準ライブラリ/shared_mutex|shared_mutex]]> &mdash; || スレッドサポート || C++14 || 共有相互排除プリミティブ | |- | <[[C++/標準ライブラリ/stop_token|stop_token]]> &mdash; || スレッドサポート || C++20 || <code>std::jthread</code>の停止トークン |- | <[[C++/標準ライブラリ/thread|thread]]> &mdash; || スレッドサポート || C++11 || <code>std::thread</code>クラスとサポート関数 |- | <[[C言語/標準ライブラリ/assert.h|assert.h]]> &mdash; || C互換 || -- || <cassert>と同様の振る舞い |- | <[[C言語/標準ライブラリ/ctype.h|ctype.h]]> &mdash; || C互換 || -- || <cctype>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/errno.h|errno.h]]> &mdash; || C互換 || -- || <cerrno>と同様の振る舞い |- | <[[C言語/標準ライブラリ/fenv.h|fenv.h]]> &mdash; || C互換 || -- || <cfenv>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/float.h|float.h]]> &mdash; || C互換 || -- || <cfloat>と同様の振る舞い |- | <[[C言語/標準ライブラリ/inttypes.h|inttypes.h]]> &mdash; || C互換 || -- || <cinttypes>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/limits.h|limits.h]]> &mdash; || C互換 || -- || <climits>と同様の振る舞い |- | <[[C言語/標準ライブラリ/locale.h|locale.h]]> &mdash; || C互換 || -- || <clocale>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/math.h|math.h]]> &mdash; || C互換 || -- || <cmath>からすべての名前(数学特殊関数の名前を除く)が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/setjmp.h|setjmp.h]]> &mdash; || C互換 || -- || <csetjmp>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/signal.h|signal.h]]> &mdash; || C互換 || -- || <csignal>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdarg.h|stdarg.h]]> &mdash; || C互換 || -- || <cstdarg>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stddef.h|stddef.h]]> &mdash; || C互換 || -- || <cstddef>から<code>std::byte</code>と関連する関数の名前を除きすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdint.h|stdint.h]]> &mdash; || C互換 || -- || <cstdint>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdio.h|stdio.h]]> &mdash; || C互換 || -- || <cstdio>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdlib.h|stdlib.h]]> &mdash; || C互換 || -- || <cstdlib>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/string.h|string.h]]> &mdash; || C互換 || -- || <cstring>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/time.h|time.h]]> &mdash; || C互換 || -- || <ctime>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/uchar.h|uchar.h]]> &mdash; || C互換 || -- || <cuchar>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/wchar.h|wchar.h]]> &mdash; || C互換 || -- || <cwchar>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/wctype.h|wctype.h]]> &mdash; || C互換 || -- || <cwctype>からすべての名前が大域名前空間に配置されているかのように振る舞う |- | <[[C言語/標準ライブラリ/stdatomic.h|stdatomic.h]]> &mdash; || 特殊C互換 || -- || _Atomicマクロを定義し、C標準ライブラリから対応する コンポーネントを提供する |} == コンテナ == コンテナは、データを格納するためのオブジェクトであり、C++の標準ライブラリではさまざまな種類のコンテナが提供されています。それぞれのコンテナは、異なる目的や使用方法に適しています。以下では、主要なコンテナについて詳しく説明します。 === コンテナの種類 === C++ 標準ライブラリは、以下の主要なコンテナを提供しています。 * '''配列 (std::array)''': 固定長の要素の集合を表す。ランダムアクセスが高速だが、サイズ変更ができない。 * '''ベクター (std::vector)''': 動的な要素の集合を表す。要素の挿入・削除が効率的かつ、ランダムアクセスも高速。 * '''リスト (std::list)''': 双方向連結リストを表す。要素の挿入・削除が効率的だが、ランダムアクセスは遅い。 * '''スタック (std::stack)''': LIFO (Last In First Out) 構造を表す。プッシュとポップの操作を提供。 * '''キュー (std::queue)''': FIFO (First In First Out) 構造を表す。エンキューとデキューの操作を提供。 * '''デック (std::deque)''': 両端キューを表す。先頭と末尾の両方から要素の挿入・削除が可能。 * '''セット (std::set)''': 重複のない要素の集合を表す。要素は昇順にソート済み。 * '''マップ (std::map)''': キーと値のペアの集合を表す。キーに基づいて値を検索できる。 * '''アンオーダードセット (std::unordered_set)''': ハッシュテーブルを用いて要素を格納する。重複のない要素の集合を表す。 * '''アンオーダードマップ (std::unordered_map)''': ハッシュテーブルを用いてキーと値のペアを格納する。 === 各コンテナの詳細 === それぞれのコンテナについて、以下に詳細を説明します。 ==== 配列 (std::array) ==== :<syntaxhighlight lang=c++> auto my_array = std::array{2, 3, 5, 7, 11}; </syntaxhighlight> * 要素の数と型は固定で、コンパイル時に決定される。 * ランダムアクセスが高速 (O(1))。 * 要素の挿入・削除はできない。 * メモリ消費量が事前に予測可能。 * 領域はスタックに確保される。 * コア言語の配列とは異なり、イテレータやアルゴリズムを適用できる。 === ベクター (std::vector)=== :<syntaxhighlight lang=c++> auto my_vector = std::vector{2, 3, 5, 7, 11}; my_vector.push_back(13); my_vector.push_back(17); my_vector.push_back(19); </syntaxhighlight> * 要素数は可変で、実行時に動的に変更できる。 * ランダムアクセスが高速 (O(1))。 * 要素の挿入・削除が効率的 (挿入: O(1) or O(n)、削除: O(1) or O(n))。 * メモリ消費量は動的に変化する。 * 領域はヒープに確保される。 * スコープを離れる自動的に領域開放される。 === リスト (std::list)=== :<syntaxhighlight lang=c++> auto my_list = std::list{2, 3, 5, 7, 11}; my_list.push_back(13); my_list.push_back(17); my_list.push_back(19); </syntaxhighlight> * 要素は双方向連結リストで管理される。 * ランダムアクセスは遅い (O(n))。 * 要素の挿入・削除が効率的 (O(1))。 * 隣接要素へのアクセスや挿入・削除に適している。 === スタック (std::stack)=== :<syntaxhighlight lang=c++> auto my_stack = std::stack{2, 3, 5, 7, 11}; my_stack.push(13); my_stack.push(17); my_stack.push(19); int peek = my_stack.top(); int top = my_stack.pop(); </syntaxhighlight> * LIFO 構造を実装。 * プッシュとポップの操作を提供。 * ネストされたスコープの管理などに利用される。 === キュー (std::queue)=== :<syntaxhighlight lang=c++> std::queue<int> my_queue; my_queue.push(1); my_queue.push(2); my_queue.push(3); int front = my_queue.front(); my_queue.pop(); </syntaxhighlight> * FIFO 構造を実装。 * エンキューとデキューの操作を提供。 * タスクのキューイングなどに利用される。 === デック (std::deque)=== :<syntaxhighlight lang=c++> std::deque<int> my_deque; my_deque.push_back(1); my_deque.push_front(2); my_deque.push_back(3); int front = my_deque.front(); int back = my_deque.back(); my_deque.pop_front(); my_deque.pop_back();</syntaxhighlight> * 両端キューとして動作 * 先頭と末尾の両方から要素の挿入・削除が可能。 * ランダムアクセスも可能だが、<code>std::vector</code>ほど高速ではない (O(log n))。 * <code>std::vector</code>と<code>std::list</code>の両方の特性を持つ。 === セット (std::set)=== :<syntaxhighlight lang=c++> std::set<int> my_set; my_set.insert(1); my_set.insert(2); my_set.insert(3); bool found = my_set.find(2) != my_set.end(); </syntaxhighlight> * 重複のない要素の集合を表す。 * 要素は昇順にソート済み。 * 探索、挿入、削除の操作が高速 (O(log n))。 * 順序を保持する必要がある集合の操作に適している。 === マップ (std::map)=== :<syntaxhighlight lang=c++> std::map<std::string, int> my_map; my_map["key1"] = 1; my_map["key2"] = 2; my_map["key3"] = 3; int value = my_map["key2"];</syntaxhighlight> * キーと値のペアの集合を表す。 * キーに基づいて値を効率的に検索できる (O(log n))。 * 挿入、削除、検索の操作が高速 (O(log n))。 * キーと値の対応関係を保持する必要がある場合に適している。 ==== アンオーダードセット (std::unordered_set) ==== :<syntaxhighlight lang=c++> std::unordered_set<int> my_set; my_set.insert(1); my_set.insert(2); my_set.insert(3); bool found = my_set.find(2) != my_set.end();</syntaxhighlight> * ハッシュテーブルを用いて要素を格納。 * 重複のない要素の集合を表す。 * 探索、挿入、削除の操作が非常に高速 (平均 O(1))。 * 順序を保持する必要がない集合の操作に適している。 === アンオーダードマップ (std::unordered_map)=== :<syntaxhighlight lang=c++> std::unordered_map<std::string, int> my_map; my_map["key1"] = 1; my_map["key2"] = 2; my_map["key3"] = 3; int value = my_map["key2"];</syntaxhighlight> * ハッシュテーブルを用いてキーと値のペアを格納。 * キーに基づいて値を非常に効率的に検索できる (平均 O(1))。 * 挿入、削除、検索の操作が非常に高速 (平均 O(1))。 * キーと値の対応関係を保持する必要がある場合に適しているが、順序は保持されない。 === コンテナの選択 === 適切なコンテナを選択することは、プログラムのパフォーマンスと効率に大きく影響します。 * コア言語の配列と同様に高速かつスタックにインスタンスを起きたく、イテレータやアルゴリズムを使いたい場合は <code>std::array</code>を選択します。 * 要素へのランダムアクセスが必要な場合は、<code>std::vector</code>または<code>std::deque</code>を選択します。 * 要素の挿入・削除が頻繁に行われる場合は、<code>std::vector</code>または<code>std::list</code>を選択します。 * 順序を保持する必要のない集合を扱う場合は、<code>std::unordered_set</code>または<code>std::unordered_map</code>を選択します。 * キーと値のペアを扱う場合は、<code>std::unordered_map</code>または<code>std::unordered_map</code>を選択します。 各コンテナの特性をよく理解し、状況に応じて適切なコンテナを選択することが重要です。 ; まとめ C++ 標準ライブラリは、さまざまなコンテナを提供しており、それぞれ異なる特徴と利点を持っています。プログラムの目的に合ったコンテナを選択することで、効率的で高速なコードを書くことができます。 == アルゴリズム == アルゴリズムとは、問題を解決するための手順の明確な定義です。一般的に、以下の要素で構成されます。 * '''入力''': アルゴリズムが処理するデータ * '''処理''': 入力データに対して行う操作 * '''出力''': アルゴリズムによって生成される結果 C++標準ライブラリでは、様々な種類のアルゴリズムが提供されており、それぞれ異なる入力、処理、出力を持つように設計されています。 === 標準ライブラリにおけるアルゴリズム === C++標準ライブラリのアルゴリズムは、ヘッダー <code><algorithm></code> に定義されています。このヘッダーには、以下の機能が含まれます。 {| class="wikitable" !分類 !代表的なアルゴリズム |- !検索 |<code>std::find</code>, <code>std::search</code>, <code>std::count</code>, <code>std::count_if</code> |- |ソート |<code>std::sort</code>, <code>std::stable_sort</code>, <code>std::partial_sort</code>, <code>std::nth_element</code> |- !範囲 |<code>std::copy</code>, <code>std::copy_if</code>, <code>std::swap</code>, <code>std::fill</code>, <code>std::fill_n</code>, <code>std::replace</code>, <code>std::replace_if</code>, <code>std::remove</code>, <code>std::remove_if</code> |- !変換 |<code>std::transform</code>, <code>std::for_each</code>, <code>std::generate</code>, <code>std::generate_n</code> |- !その他 |<code>std::max</code>, <code>std::min</code>, <code>std::minmax</code>, <code>std::swap_ranges</code>, <code>std::set_difference</code>, <code>std::set_intersection</code>, <code>std::set_union</code>, <code>std::adjacent_find</code>, <code>std::mismatch</code>, <code>std::copy_backward</code>, <code>std::move</code>, <code>std::move_backward</code>, <code>std::rotate</code>, <code>std::rotate_copy</code>, <code>std::shuffle</code>, <code>std::random_shuffle</code>, <code>std::partition</code>, <code>std::partition_point</code>, <code>std::stable_partition</code>, <code>std::is_sorted</code>, <code>std::is_partially_sorted</code>, <code>std::unique</code>, <code>std::unique_copy</code>, <code>std::count_elements</code>, <code>std::upper_bound</code>, <code>std::lower_bound</code>, <code>std::binary_search</code>, <code>std::merge</code>, <code>std::inplace_merge</code>, <code>std::set_union_of_ranges</code>, <code>std::lexicographical_compare</code>, <code>std::includes</code>, <code>std::adjacent_difference</code>, <code>std::search_n</code>, <code>std::copy_n</code>, <code>std::iota</code>, <code>std::iota_n</code>, <code>std::for_each_n</code>, <code>std::generate_n</code>, <code>std::gather</code>, <code>std::scatter</code>, <code>std::reduce</code>, <code>std::reduce_right</code>, <code>std::adjacent_reduce</code>, <code>std::accumulate</code>, <code>std::accumulate_right</code>, <code>std::transform_reduce</code>, <code>std::transform_reduce_right</code>, <code>std::max_element</code>, <code>std::min_element</code>, <code>std::max_element_n</code>, <code>std::min_element_n</code>, <code>std::minmax_element</code>, <code>std::minmax_element_n</code>, <code>std::any_of</code>, <code>std::all_of</code>, <code>std::none_of</code>, <code>std::count_if_n</code>, <code>std::find_if</code>, <code>std::find_if_n</code>, <code>std::find_first_of</code>, <code>std::find_first_of_n</code>, <code>std::any_of_n</code>, <code>std::all_of_n</code>, <code>std::none_of_n</code> |} === ソート (sort) === ソートは、データの要素を昇順または降順に整列するアルゴリズムです。C++の標準ライブラリでは、<code>std::sort</code>関数が提供されており、クイックソートやヒープソートなどの高速なソートアルゴリズムが実装されています。 === 検索 (search) === 検索は、与えられたデータから特定の要素を見つけるアルゴリズムです。C++の標準ライブラリでは、<code>std::find</code>関数が提供されており、線形検索やバイナリ検索などの効率的な検索アルゴリズムが実装されています。 === 二分探索 (binary_search) === 二分探索は、ソート済みのデータから特定の要素を効率的に見つけるアルゴリズムです。C++の標準ライブラリでは、<code>std::binary_search</code>関数が提供されており、対象の要素が存在するかどうかを判定することができます。 === 変更 (modify) === 変更は、データの要素を変更する操作を行うアルゴリズムです。C++の標準ライブラリでは、<code>std::transform</code>関数が提供されており、与えられた操作を各要素に適用することができます。 === パーミュテーション (permutation) === パーミュテーションは、与えられた要素の順列を生成するアルゴリズムです。C++の標準ライブラリでは、<code>std::next_permutation</code>関数が提供されており、要素の順列を効率的に生成することができます。 === 集計 (accumulate) === 集計は、与えられたデータの要素を合計する操作を行うアルゴリズムです。C++の標準ライブラリでは、<code>std::accumulate</code>関数が提供されており、要素の合計を計算することができます。 :<syntaxhighlight lang=c++> #include <iostream> #include <numeric> // std::accumulate #include <vector> auto main() -> int { auto numbers = std::vector{1, 2, 3, 4, 5}; auto const sum = std::accumulate(numbers.begin(), numbers.end(), 0); std::cout << "Sum: " << sum << std::endl; return 0; } </syntaxhighlight> === 順列生成 (next_permutation) === 順列生成は、与えられた要素の全ての順列を生成するアルゴリズムです。C++の標準ライブラリでは、<code>std::next_permutation</code>関数が提供されており、与えられた要素の順列を効率的に生成することができます。 === ヒープ操作 (heap) === ヒープ操作は、ヒープデータ構造を操作するアルゴリズムです。C++の標準ライブラリでは、<code>std::make_heap</code>、<code>std::push_heap</code>、<code>std::pop_heap</code>などの関数が提供されており、ヒープを構築したり、要素を追加・削除したりすることができます。 == イテレータとアダプタ == '''イテレータ'''(iterator)は、コンテナの要素を参照し、反復処理を実現するためのオブジェクトです。標準ライブラリでは様々なイテレータが定義されており、それらを使うことで柔軟でパフォーマンスの良いアルゴリズムを記述できます。 代表的なイテレータには以下のようなものがあります。 ; 入力イテレータ(input iterator) : 要素の読み取り専用 ; 出力イテレータ(output iterator) : 要素の書き込み専用 ; 前方イテレータ(forward iterator) : 単方向の反復が可能 ; 双方向イテレータ(bidirectional iterator) : 前方と逆方向の反復が可能 ; ランダムアクセスイテレータ(random access iterator) : 任意のインデックスにアクセス可能 :<syntaxhighlight lang=c++> auto v = std::vector{1, 2, 3, 4, 5}; for(std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; // 出力: 1 2 3 4 5 } </syntaxhighlight> '''アダプタ'''(adapter)は、既存のコンテナやイテレータから新しいビューを生成するための仕組みです。アダプタを使うことで、コピーを作らずに既存のコンテナの動作をカスタマイズできます。 よく使われるシーケンスアダプタには以下のようなものがあります。 ; std::reverse_iterator : 逆向きのイテレータを生成 ; std::move_iterator : ムーブ操作ができるイテレータを生成 ; std::inserter : 出力イテレータをコンテナに挿入操作するアダプタ :<syntaxhighlight lang=c++> auto lst = std::list{1, 2, 3, 4, 5}; std::vector<int> vec(lst.size()); std::copy(lst.begin(), lst.end(), std::back_inserter(vec)); // vecには{1, 2, 3, 4, 5}が代入される </syntaxhighlight> このように、イテレータとアダプタを適切に組み合わせることで、C++の標準ライブラリを活用した効率的で柔軟なコーディングが可能になります。 == 文字列、文字列操作と正規表現 == === 文字列(std::string, std::wstring) === C++では<code>std::string</code>クラスが文字列を表すために使われます。このクラスは様々なコンストラクタと、文字列の連結、検索、置換などの操作を行うメンバー関数を提供しています。 :<syntaxhighlight lang=c++> std::string s1 = "Hello"; // コンストラクタ std::string s2 = s1 + " World"; // 連結 // 部分文字列の検索 if (s2.find("llo") != std::string::npos) { /* ... */ } s2.replace(6, 5, "Universe"); // 置換 </syntaxhighlight> <code>std::wstring</code>はワイド文字列を扱うためのクラスで、多言語対応アプリケーションで使われます。 === 文字列ストリーム(std::stringstream) === <code>std::stringstream</code>クラスを使うと、stringオブジェクトと入出力ストリームの間で簡単に変換できます。 :<syntaxhighlight lang=c++> std::stringstream ss; ss << "Value = " << 3.14; std::string s = ss.str(); // s == "Value = 3.14" </syntaxhighlight> === 文字列リテラル(std::string_view, std::u8string_view) === C++17から導入された<code>std::string_view</code>はstring_literalを所有せずにビューとして参照するためのクラスです。メモリ消費を抑えられる一方で、nullターミネートを要求するので注意が必要です。 === 正規表現(std::regex, std::smatch, std::regex_replace, など) === C++11から正規表現をサポートするライブラリが導入されました。<code>std::regex</code>を使って正規表現オブジェクトを作成し、<code>std::smatch</code>でマッチング結果を扱えます。また、<code>std::regex_replace</code>で置換も行えます。 :<syntaxhighlight lang=c++> std::regex re("\\d+"); // 正規表現オブジェクト std::string s = "Sample 123 456"; std::smatch m; if (std::regex_search(s, m, re)) { // マッチング // m[0]にマッチした文字列が入る } std::string result = std::regex_replace(s, re, "NUM"); // Sample NUM NUM </syntaxhighlight> ECMAScriptの正規表現構文をサポートしており、文字列操作を行う上で非常に強力なツールとなっています。 == 入出力 == 入出力操作は、プログラミングにおいて非常に重要な要素です。C++の標準ライブラリでは、さまざまな形式のデータの読み書きを行うための豊富な機能が提供されています。以下では、主要な入出力について説明します。 === 標準入出力 (iostream) === 標準入出力は、プログラムとユーザーまたは他のプログラムの間でデータをやり取りするための機能です。C++の標準ライブラリでは、<code>std::cin</code>と<code>std::cout</code>というストリームオブジェクトを使用して標準入力と標準出力を操作することができます。これらのストリームを使用することで、データの読み取りや表示を簡単に行うことができます。 === ファイル入出力 (fstream) === ファイル入出力は、ファイルとプログラムの間でデータを読み書きするための機能です。C++の標準ライブラリでは、ファイル入出力ストリームを操作するための<code>std::ifstream</code>と<code>std::ofstream</code>クラスが提供されています。これらのクラスを使用することで、ファイルからデータを読み取ったり、ファイルにデータを書き込んだりすることができます。 === 【廃止】文字コード変換 (std::codecvt) === <code>std::codecvt</code>クラスは、C++17で非推奨となり、C++26で削除されることが決定されました。この変更の背景には、この機能がUnicodeの現在の標準をサポートしておらず、古いUCS-2エンコーディングのみをサポートしていたことがあります。 代替手段としては、次のようなオプションが考えられます。 ; <code>std::wstring_convert</code> : C++11で導入された<code>std::wstring_convert</code>クラスを使用します。このクラスは、広くサポートされているUTF-8、UTF-16、UTF-32エンコーディングをサポートしています。 :<syntaxhighlight lang=c++> std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv; std::u32string u32 = conv.from_bytes(u8"Hello"); std::string bytes = conv.to_bytes(u32); </syntaxhighlight> ; ライブラリの使用 : 外部ライブラリを使用することができます。例えば、ICUライブラリ(International Components for Unicode)は、Unicode文字列の変換や正規化など、幅広い機能を提供しています。 ; 独自の実装 : 特定のニーズに合わせて、独自の文字列変換ロジックを実装することもできます。ただし、Unicodeの扱いは複雑であるため、既存のライブラリを利用することをお勧めします。 また、文字列リテラルの導入により、ソースコード中に直接UTF-8やUTF-16、UTF-32の文字列を書くことができるようになりました。 :<syntaxhighlight lang=c++> auto u8_str = u8"UTF-8 文字列"; auto u_str = U"UTF-16 文字列"; auto U8_str = u8"UTF-8 文字列"; auto U_str = U"UTF-16 文字列"; </syntaxhighlight> さらに、C++17からは<code>std::byte</code>や<code>std::byte_traits</code>といった、バイトベースの操作を行うための機能が追加されています。文字変換の際にこれらを活用することで、<code>std::codecvt</code>に頼らずに済むケースが増えました。 <code>std::codecvt</code>クラスの廃止は、C++がUnicodeの最新の標準に対応するための変更です。代替手段を検討することで、アプリケーションのUnicode対応を改善できるでしょう。 === ファイルシステム (filesystem) === ファイルシステムは、ファイルやディレクトリの操作を行うための機能です。C++17からは、<code>std::filesystem</code>ライブラリが標準化され、ファイルやディレクトリの操作を行うためのさまざまなクラスや関数が提供されています。これにより、プログラムがファイルシステムを操作する際に、簡単にファイルやディレクトリを作成、削除、移動、検索することができます。 == 例外処理 == 例外処理は、プログラム実行中に予期しないエラーが発生した場合に、適切に対処するための仕組みです。C++の標準ライブラリでは、例外処理をサポートするためのさまざまな機能が提供されています。以下では、主要な例外処理について説明します。 === 例外の基本 (exception basics) === 例外は、プログラム実行中に予期しないエラーが発生した場合に発生します。例外は、プログラムの実行を中断し、エラーが発生した場所から例外処理のコードに制御を移します。例外処理は、例外が発生した際に適切な処理を行うための仕組みです。 === 例外の送出と捕捉 (throwing and catching exceptions) === 例外の送出は、予期しないエラーが発生した場合に、そのエラーを通知するために使用されます。C++では、<code>throw</code>キーワードを使用して例外を明示的に送出することができます。一方、例外の捕捉は、送出された例外を処理するための仕組みです。<code>try</code>ブロック内で例外が送出される可能性があるコードを記述し、その後に<code>catch</code>ブロックを使用して例外を捕捉し、適切な処理を行うことができます。 === 標準例外クラス (standard exception classes) === C++の標準ライブラリでは、さまざまな種類の例外を表すための標準例外クラスが提供されています。これらのクラスは、<code>std::exception</code>クラスを基底クラスとしており、異なる種類のエラーを表すために派生クラスとして使用されます。一般的な標準例外クラスには、<code>std::runtime_error</code>、<code>std::logic_error</code>、<code>std::invalid_argument</code>などがあります。これらのクラスは、特定の種類のエラーを表すために使用され、例外が送出された際にプログラムが適切に処理できるようにします。 == その他の重要な機能 == C++の標準ライブラリには、さまざまな追加機能が提供されています。以下では、その他の重要な機能について説明します。 === 時間と日付 (date and time) === 時間と日付の操作は、多くのアプリケーションで重要な要素です。C++の標準ライブラリでは、時間や日付を表すための<code>std::chrono</code>ライブラリが提供されています。このライブラリを使用することで、日付の取得、計算、比較などの操作を行うことができます。また、時間の測定や待機などの機能も提供されています。 === メモリ管理 (memory management) === メモリ管理は、プログラムが動作するために必要なメモリの割り当てと解放を行う重要な要素です。C++の標準ライブラリでは、メモリ管理を行うための機能が提供されており、<code>std::allocator</code>クラスや<code>std::shared_ptr</code>、<code>std::unique_ptr</code>などのスマートポインタが使用されます。これらの機能を使用することで、メモリリークや二重解放などの問題を回避することができます。 === スレッドと並行性 (threads and concurrency) === スレッドと並行性は、現代のプログラミングにおいて重要な要素です。C++の標準ライブラリでは、マルチスレッドプログラミングをサポートするための機能が提供されています。<code>std::thread</code>クラスや<code>std::mutex</code>、<code>std::condition_variable</code>などのクラスを使用することで、スレッド間の同期や通信を行うことができます。また、C++11以降では、スレッドプールや非同期タスクなどの機能も提供されています。 === 数学関数 (math functions) === 数学関数は、科学技術計算やグラフィックスプログラミングなどの領域で広く使用されます。C++の標準ライブラリでは、数学関数を提供するための数多くの関数が提供されています。これには、三角関数、指数関数、対数関数、乱数生成などが含まれます。これらの関数を使用することで、数学的な計算を効率的に行うことができます。 === ランダム数生成 (random number generation) === ランダム数生成は、シミュレーションやゲームなどの分野で広く使用されます。C++の標準ライブラリでは、ランダム数を生成するためのさまざまな機能が提供されています。これには、線形合同法やメルセンヌ・ツイスターなどのアルゴリズムを使用した乱数生成器が含まれます。また、乱数生成器を使用して特定の範囲の乱数を生成する機能も提供されています。 == 標準ライブラリの最適化 == 標準ライブラリの最適化は、プログラムのパフォーマンスを向上させるために重要なステップです。以下では、標準ライブラリを使用する際の最適化について説明します。 === 使用時の注意点 === 標準ライブラリを使用する際に注意するべきポイントがいくつかあります。まず、適切なコンテナやアルゴリズムを選択することが重要です。特定の操作に適したコンテナやアルゴリズムを選択することで、効率的なプログラムを作成することができます。また、不要なコピーの回避やムーブセマンティクスの活用など、効率的なプログラミング手法を採用することも重要です。 さらに、標準ライブラリの使用に伴うオーバーヘッドにも注意が必要です。標準ライブラリは一般的に汎用的な実装を提供していますが、特定の状況においてはカスタム実装がより効率的な場合があります。プログラムの特性や要件に応じて、標準ライブラリの使用を最適化することが重要です。 === パフォーマンスの向上方法 === 標準ライブラリのパフォーマンスを向上させるためには、いくつかの方法があります。まず、最適化フラグを使用してコンパイラに最適化を指示することが重要です。最適化フラグを適切に設定することで、コンパイル時に効率的なコードが生成される可能性が高まります。 また、コンテナやアルゴリズムの選択によってもパフォーマンスを向上させることができます。例えば、ベクターやアレイなどの連続したメモリ配置を持つコンテナは、ランダムアクセスやイテレーションが高速に行えるため、大量のデータを効率的に処理する際に適しています。さらに、アルゴリズムの選択によってもパフォーマンスを向上させることができます。例えば、ソートアルゴリズムや探索アルゴリズムの選択によって、処理速度を向上させることができます。 さらに、並列処理やメモリ管理の最適化など、他の最適化手法も検討する価値があります。並列処理を使用することで、複数のスレッドを使用して処理を並列化することができ、処理速度を向上させることができます。また、メモリ管理の最適化を行うことで、不要なメモリの割り当てや解放を減らすことができ、プログラムのパフォーマンスを向上させることができます。 == 外部リンク == {{Wikipedia|標準C++ライブラリ}} {{Nav}} {{DEFAULTSORT:ひようしゆんらいふらり}} [[Category:C++]] n51j4id3sj8y61abclkluop3pnl1sga C++/標準ライブラリ/ranges 0 39837 264153 249103 2024-11-25T02:35:17Z Ef3 694 /* 附録 */ 従来のコードとRanges以後の比較 264153 wikitext text/x-wiki {{Nav}} == はじめに == C++20から導入されたrangesライブラリは、コード記述の簡潔さと表現力を格段に向上させる新機能です。rangesライブラリでは、コンテナやイテレータなどの更に抽象化された概念として「範囲(range)」が導入されています。 範囲とは、始点と終点によって定義される任意の要素の集合を表すものです。 <code>std::vector</code>や <code>std::list</code>などの標準コンテナはもちろん、C言語スタイルの配列、独自に定義した反復可能な型など、あらゆる集合を範囲として扱うことができます。 従来のイテレータベースのアルゴリズムと比べ、rangesライブラリの利点は以下のようなものがあります: * 簡潔な記述が可能 * 安全性が高い(範囲チェックなど) * 合成性が高い(独自の範囲の作成が容易) * 遅延実行によるパフォーマンス向上 例えば、ベクトル配列内の偶数要素のみに2を乗じる処理は、従来のイテレータ記法では以下のようになります: :<syntaxhighlight lang=c++> std::vector<int> v = ...; std::vector<int> result; result.reserve(v.size()/2); for (auto it = v.begin(); it != v.end(); ++it) { if (*it % 2 == 0) { result.push_back(*it * 2); } } </syntaxhighlight> 一方、rangesライブラリを使えば、こう書けます: :<syntaxhighlight lang=c++> std::vector<int> v = ...; auto result = v | std::views::filter(&[](int x) { return x % 2 == 0; }) | std::views::transform(&[](int x) { return x * 2; }); </syntaxhighlight> このように、範囲とビュー(view)を使うと、ロジックをシンプルに記述できます。 == 範囲とビュー == rangesライブラリの核心概念が「範囲(range)」と「ビュー(view)」です。 '''範囲(range)'''とは、始点と終点によって定義される任意の要素の集合を表すものです。C++20では、この範囲を表すための共通の概念的要件が定義されています。 rangeの種類には主に2つあります。 ; 生範囲(borrowed range) : 別の所有権下にあるデータから範囲を借用するもの(例 : <code>std::vector<T></code>) ; 所有範囲(owned range) : 範囲自身がデータを所有するもの(例 : <code>std::string_view</code>) 生範囲の例として、<code>std::vector</code>を見てみましょう。 :<syntaxhighlight lang=c++> std::vector<int> v = {1, 2, 3, 4, 5}; auto r = std::ranges::subrange(v.begin()+1, v.end()-1); // r = {2, 3, 4} </syntaxhighlight> <code>std::vector</code>オブジェクト <code>v</code>から部分範囲 <code>r</code>を作成しました。 <code>r</code>は元の <code>vector</code>データを範囲参照しています。 一方、所有範囲の例は <code>std::string_view</code>です。 :<syntaxhighlight lang=c++> std::string_view sv = "Hello, World!"; auto r = sv.substr(7); // r = "World!" </syntaxhighlight> string_viewオブジェクトsvから部分範囲rを作成しましたが、rは元のsvデータをコピーして所有しています。 '''ビュー(view)''' は、別の範囲に基づく新しい「ビュー範囲」を生成するものです。ビューは範囲に様々な操作を適用し、パイプライン処理を実現します。 :<syntaxhighlight lang=c++> std::vector<int> v = {1, 2, 3, 4, 5, 6}; auto r1 = v | std::views::filter(&[](int i) { return i % 2 == 0; }); // r1 = {2, 4, 6} auto r2 = r1 | std::views::transform(&[](int i) { return i * i; }); // r2 = {4, 16, 36} </syntaxhighlight> 最初のビュー <code>r1</code>は、元の範囲vから偶数の要素のみを抽出(filter)したビューです。次のビュー <code>r2</code>は、 <code>r1</code>に基づき、更にそれぞれの要素を2乗する変換(transform)を適用しています。このように、ビューはパイプライン処理を実現する強力なツールとなります。 このように、rangesライブラリでは範囲とビューの概念を組み合わせることで、イテレーションや変換処理を合成的に記述できるようになりました。 == 範囲アダプター == rangesライブラリには、様々な範囲アダプターが用意されています。範囲アダプターは、範囲に対して何らかの操作を適用し、新しいビュー範囲を生成するものです。 代表的な範囲アダプターには以下のようなものがあります。 ; <code>filter</code> : 条件に合う要素のみを抽出 ; <code>transform</code> : 各要素に変換関数を適用 ; <code>join</code> : 範囲の範囲を1つの範囲にフラット化 ; <code>split</code> : 範囲を条件に従って分割 ; <code>chunk</code> : 範囲を均等なチャンクに分割 これらの範囲アダプターを使うと、イテレーション処理をパイプライン形式で記述できます。 :<syntaxhighlight lang=c++> std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 偶数を2乗し、9以下の値のみ残す auto r = v | std::views::filter(&[](int i) { return i % 2 == 0; }) | std::views::transform(&[](int i) { return i * i; }) | std::views::filter(&[](int i) { return i <= 81; }); for (auto i : r) { std::cout << i << " "; // 出力: 4 16 64 } </syntaxhighlight> このように、 <code>filter</code>、 <code>transform</code>、 <code>filter</code>を合成して適用しています。 さらに、rangesライブラリではラムダ式を使った範囲アダプターの合成も可能です。 :<syntaxhighlight lang=c++> auto square_odds = [](std::ranges::view auto r) { return r | std::views::filter(&[](int i) { return i % 2 != 0; }) | std::views::transform(&[](int i) { return i * i; }); }; std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (auto i : square_odds(v)) { std::cout << i << " "; // 出力: 1 9 25 49 81 } </syntaxhighlight> このように、rangesライブラリの範囲アダプターを利用することで、関数型プログラミングスタイルのコード記述が可能になります。 == 範囲アルゴリズム == rangesライブラリには、範囲を引数として取る様々なアルゴリズムが用意されています。 === for_each === <code>ranges::for_each</code>は、範囲の全要素に対して操作を適用するアルゴリズムです。 :<syntaxhighlight lang=c++> std::vector<int> v{1, 2, 3, 4, 5}; ranges::for_each(v, [](int i) { std::cout << i*i << " "; }); // 出力: 1 4 9 16 25 </syntaxhighlight> === 要素へのアクセス === 範囲の先頭や末尾、任意の位置の要素にアクセスするには、ranges::begin、ranges::endなどが使えます。 :<syntaxhighlight lang=c++> std::vector<int> v{1, 2, 3, 4, 5}; auto r = std::views::reverse(v); std::cout << *ranges::begin(r); // 出力: 5 std::cout << *ranges::next(ranges::begin(r), 2); // 出力: 3 </syntaxhighlight> === 変換と射影 === <code>ranges::transform</code>は、範囲の各要素に関数を適用し、その結果を新しい範囲として返します。 :<syntaxhighlight lang=c++> std::vector<int> v{1, 2, 3, 4, 5}; auto r = ranges::transform(v, [](int i) { return i * i; }); // r = {1, 4, 9, 16, 25} </syntaxhighlight> == 範囲と従来のアルゴリズム == 従来のアルゴリズム( <code>std::copy</code>、 <code>std::sort</code>、 <code>std::find</code> など)も、rangesライブラリによって範囲に対応しました。rangeアダプターと組み合わせることで、より表現力の高いコードが書けます。 :<syntaxhighlight lang=c++> std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8}; std::vector<int> result; auto r = v | std::views::filter(&[](int i) { return i % 2 == 0; }); std::ranges::copy(r, std::back_inserter(result)); // result = {2, 4, 6, 8} </syntaxhighlight> また、従来のコンテナと範囲を相互運用することも可能です。例えば、範囲からコンテナを構築できます。 :<syntaxhighlight lang=c++> std::vector v{1, 2, 3, 4, 5}; std::list l(std::ranges::begin(v), std::ranges::end(v)); </syntaxhighlight> このように、rangesは従来のアルゴリズムやコンテナともスムーズに連携できるよう設計されています。 == ビューの詳細 == ここまでビュー(view)の概念と基本的な使い方を説明してきました。ここからは、よく使われるビューの詳細について見ていきましょう。 === filter_view === <code>filter_view</code>は、指定された条件を満たす要素のみを抽出するビューです。前述の例でも使用しました。 :<syntaxhighlight lang=c++> std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; auto r = v | std::views::filter(&[](int i) { return i % 2 == 0; }); // r = {2, 4, 6, 8, 10} </syntaxhighlight> <code>filter_view</code>はイテレータの間を進む際に、条件を評価して該当する要素のみを返します。 === transform_view === <code>transform_view</code>は、範囲の各要素に指定された関数を適用し、その結果を新しい範囲として返すビューです。 :<syntaxhighlight lang=c++> std::vector<int> v = {1, 2, 3, 4, 5}; auto r = v | std::views::transform(&[](int i) { return i * i; }); // r = {1, 4, 9, 16, 25} </syntaxhighlight> 関数はラムダ式、関数ポインタ、関数オブジェクトなどで渡せます。 === join_view === <code>join_view</code>は、範囲の範囲(範囲の集合)を1つのフラットな範囲に展開するビューです。 :<syntaxhighlight lang=c++> std::vector<std::string> v = {"apple", "banana", "cherry"}; auto r = v | std::views::join; for (char c : r) { std::cout << c; // 出力: applebananacherry } </syntaxhighlight> このようにjoin_viewは、ネストされたコンテナをフラット化するのに便利です。 === 独自のビューの作成 === C++20のrangesライブラリでは、独自のビューを作成することもできます。ビュー・インタフェースを実装するだけで、範囲の合成に独自のビューを組み込めます。 :<syntaxhighlight lang=c++> template<typename R> class odd_view : public std::ranges::view_interface<odd_view<R>> { private: R base; public: odd_view() = default; constexpr explicit odd_view(R r) : base(std::move(r)) {} constexpr auto begin() { auto start = std::ranges::begin(base); return std::ranges::find_if(start, std::ranges::end(base), &[](int i) { return i % 2 != 0; }); } constexpr auto end() { return std::ranges::end(base); } }; template<typename R> inline constexpr odd_view<std::views::all_t<R>> operator|(R&& r, odd_view<std::views::all_t<R>> v) { return odd_view(std::forward<R>(r)); } int main() { std::vector<int> v = {1, 2, 3, 4, 5, 6}; for (auto i : v | odd_view()) { std::cout << i << " "; // 出力: 1 3 5 } } </syntaxhighlight> このodd_viewは、範囲から奇数のみを取り出すビューです。rangesの見かけ上の仕組みを利用して、独自のビューをシームレスに作成できます。 === enumerate_view === <code>enumerate_view</code>は、範囲の各要素にインデックス値を付与したビューを生成します。つまり、(index, value)のペアを範囲の要素として返します。 :<syntaxhighlight lang=c++> std::vector<std::string> names = {"Alice", "Bob", "Charlie", "Dave"}; for (auto [idx, name] : std::views::enumerate(names)) { std::cout << idx << ": " << name << std::endl; } // 出力: // 0: Alice // 1: Bob // 2: Charlie // 3: Dave </syntaxhighlight> ここではstructuredなbindingを使って、ペアのindex、valueをそれぞれ受け取っています。 インデックス値の型は <code>std::ranges::range_difference_t<R></code>で決まります。rangeのサイズの型と同じ型が使われます。 <code>enumerate_view</code>は、コンテナのインデックスにアクセスする場合に便利です。例えば、リストをインデックス付きで出力する場合などです。 また、enumerate_viewを介さずに直接enumerate関数を使うこともできます。 :<syntaxhighlight lang=c++> std::vector<int> nums = {3, 1, 4}; for (auto [idx, num] : std::ranges::enumerate(nums)) { std::cout << idx << ": " << num << std::endl; } // 出力: // 0: 3 // 1: 1 // 2: 4 </syntaxhighlight> このように <code>enumerate</code>関数を使えば、ビューを介さずにインデックスとペアにアクセスできます。 <code>enumerate_view</code>や <code>enumerate</code>関数は、rangesライブラリでよく使われる便利な機能の1つです。コンテナの要素とインデックスを同時に扱う場合に役立ちます。 == その他の機能 == rangesにはほかにも様々な機能があります。ここでは、いくつかの重要な機能を紹介します。 === 範囲とコンストラクタ === rangesではコンテナのコンストラクタに範囲を渡せます。 :<syntaxhighlight lang=c++> std::vector data{1, 2, 3, 4, 5}; std::vector squares(data | std::views::transform(&[](int x) { return x * x; })); // squares = {1, 4, 9, 16, 25} </syntaxhighlight> === 範囲の分割 === <code>chunk</code>や <code>chunk_by</code>を使えば、範囲を分割できます。 :<syntaxhighlight lang=c++> std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (auto subrange : std::views::chunk(v, 3)) { for (auto x : subrange) { std::cout << x << " "; // 出力: 1 2 3 4 5 6 7 8 9 10 } std::cout << "| "; // 出力: | | | } </syntaxhighlight> <code>chunk_by</code>を使えば、指定された条件に従って範囲を分割できます。 === 範囲の消費 === <code>std::ranges::elements_view</code>を使うと、範囲全体の要素をリテラルとして取得できます。 :<syntaxhighlight lang=c++> std::vector v = {1, 2, 3, 4, 5}; auto r = std::ranges::elements_view(v); // r = {1, 2, 3, 4, 5} </syntaxhighlight> また、範囲をコンテナに格納するには <code>std::ranges::to</code>が使えます。 :<syntaxhighlight lang=c++> std::vector v = {1, 2, 3, 4, 5}; std::list l = std::ranges::to<std::list>(v); // l = {1, 2, 3, 4, 5} </syntaxhighlight> == 最適化とパフォーマンス == rangesの優れた点の1つが、遅延実行によるパフォーマンス向上です。ビュー操作はイテレーション時に実際に適用されるため、無駄な中間コピーが発生しません。また、ビューを永続化して再利用することもできます。 === 遅延実行 === 以下のようなコードを考えましょう。 :<syntaxhighlight lang=c++> std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; auto r = v | std::views::filter(&[](int i) { return i % 2 == 0; }) | std::views::transform(&[](int i) { return i * i; }); std::vector<int> squares(r.begin(), r.end()); </syntaxhighlight> ここで、filterとtransformによる処理は、実際にrの要素をイテレートする際に行われます。つまり、無駄な中間コピーが発生しません。この「遅延実行」が、rangesの重要なメリットです。 === 範囲の永続化 === ビューは一時的なものですが、 <code>std::ranges::subrange</code>でビューを永続化できます。 :<syntaxhighlight lang=c++> std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; auto r = std::ranges::subrange( v | std::views::filter(...) | std::views::transform(...)); // 後でこのrを使う </syntaxhighlight> <code>subrange</code>で永続化したビュー範囲rは、後で使い回せます。 === パフォーマンスの考慮事項 === ranges機能を使う上で、いくつかのパフォーマンスの考慮事項があります。 * ビューの合成にはオーバーヘッドがあるため、無駄な合成は避ける * filterやtransformなどでは、関数オブジェクトの代入コピーが発生するため注意 * 範囲アダプターの中にはO(N)の操作が含まれる場合があり、大きな入力では遅くなる * ビューは一時的なので、再利用が必要な場合は永続化(subrange)する 例えば、以下のようなコードでは無駄な合成が行われています。 :<syntaxhighlight lang=c++> auto r = v | std::views::transform(&square) | std::views::filter(&is_even) | std::views::transform(&square_root); </syntaxhighlight> この場合、最初のtransform後にfilterを適用すればよいため、2つ目のtransformは不要です。 このように、ranges機能を適切に使うことで、パフォーマンスの最適化が図れます。 {{コラム|C++のrangeと関数型プログラミング|2=C++20のrangesライブラリは、関数型プログラミングのコンセプトをネイティブでサポートしています。この点が、rangesの大きな特徴の1つです。 関数型プログラミングでは、状態を持たない純粋な関数を組み合わせることで、プログラムを記述します。rangesライブラリの範囲アダプターやビューは、この関数合成のための仕組みを提供しています。 例えば、以下のようなコードを見てみましょう。 :<syntaxhighlight lang=c++> std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 偶数を2乗し、9以下の値のみ残す auto r = v | std::views::filter(&[](int i) { return i % 2 == 0; }) | std::views::transform(&[](int i) { return i * i; }) | std::views::filter(&[](int i) { return i <= 81; }); for (int i : r) { std::cout << i << " "; // 出力: 4 16 64 } </syntaxhighlight> ここでは、filterとtransformという2つの関数が合成されています。1つ目のfilterで偶数を抽出し、transformで2乗し、2つ目のfilterで81以下の値を残しています。 このように、rangesではパイプライン記法を使って、関数を合成することができます。各関数は状態を持たず、ただ与えられた引数から結果を計算するだけです。これは関数型プログラミングの典型的なスタイルです。 さらに、rangesではラムダ式を使った高階関数の記述も可能です。 :<syntaxhighlight lang=c++> auto square_odds = [](std::ranges::view auto r) { return r | std::views::filter(&[](int i) { return i % 2 != 0; }) | std::views::transform(&[](int i) { return i * i; }); }; std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; for (int i : square_odds(v)) { std::cout << i << " "; // 出力: 1 9 25 49 81 } </syntaxhighlight> ここでは、square_oddsという高階関数を定義しています。この関数は、与えられた範囲に対し、奇数を抽出し2乗するロジックを適用します。関数合成とラムダ式によって、ロジックを関数オブジェクトとしてカプセル化できます。 また、rangesによってC++にジェネレータが実質的に導入されました。ビューは遅延実行されるため、イテレータがビューを評価する際に、要素が1つずつ生成(ジェネレート)されていきます。 :<syntaxhighlight lang=c++> auto ints = std::views::iota(0) | std::views::transform([](int i) { return i * i; }); for (int i : std::ranges::take_view(ints, 5)) { std::cout << i << " "; // 0 1 4 9 16 } </syntaxhighlight> ここでは、iota viewとtransform viewを合成して、無限の2乗数列を生成しています。take_viewで最初の5つの要素だけを取り出しています。 このように、rangesライブラリはC++に関数型プログラミングの機能を取り入れ、イテレーションの抽象化、合成性の向上、ジェネレータなどを実現しています。シンプルでわかりやすいコードを書けるだけでなく、新しいプログラミングスタイルの可能性も切り開いています。 }} == 附録 == === 単純なループ(要素の表示) === ; <code>ranges</code>導入前 :<syntaxhighlight lang=c++> for (auto it = container.begin(); it != container.end(); it++) { std::cout << *it << std::endl; } </syntaxhighlight> ; <code>ranges</code>導入後 :<syntaxhighlight lang=c++> std::ranges::for_each(container, [](auto&& elem) { std::cout << elem << std::endl; }); </syntaxhighlight> :<code>ranges</code>では、<code>for_each</code>を使って簡潔に範囲内の要素を処理でき、イテレータの操作が不要になります。 === 条件付きフィルタリング(偶数の要素を表示) === ; <code>ranges</code>導入前 :<syntaxhighlight lang=c++> for (auto it = container.begin(); it != container.end(); it++) { if (*it % 2 == 0) { std::cout << *it << std::endl; } } </syntaxhighlight> ; <code>ranges</code>導入後 :<syntaxhighlight lang=c++> std::ranges::for_each(container | std::ranges::views::filter([](auto&& elem) { return elem % 2 == 0; }), [](auto&& elem) { std::cout << elem << std::endl; }); </syntaxhighlight> :<code>ranges</code>では、<code>views::filter</code>を使って範囲をフィルタリングし、その結果をパイプラインで処理できます。 === 要素の変換(各要素に10を加算) === ; <code>ranges</code>導入前 :<syntaxhighlight lang=c++> for (auto it = container.begin(); it != container.end(); it++) { *it += 10; } </syntaxhighlight> ; <code>ranges</code>導入後 :<syntaxhighlight lang=c++> std::ranges::for_each(container, [](auto&& elem) { elem += 10; }); </syntaxhighlight> :<code>ranges</code>を使用すると、範囲の各要素を簡単に変換でき、ループ構文が簡潔になります。 === マップ操作(各要素を2倍にする) === ; <code>ranges</code>導入前 :<syntaxhighlight lang=c++> std::vector<int> result; for (auto it = container.begin(); it != container.end(); it++) { result.push_back(*it * 2); } </syntaxhighlight> ; <code>ranges</code>導入後 :<syntaxhighlight lang=c++> auto result = container | std::ranges::views::transform([](auto&& elem) { return elem * 2; }); </syntaxhighlight> :<code>ranges</code>では、<code>views::transform</code>を使って各要素を変換した新しい範囲を作成できます。これにより、新しいコンテナを明示的に作成する必要がなくなります。 === 集約操作(合計を計算) === ; <code>ranges</code>導入前 :<syntaxhighlight lang=c++> int sum = 0; for (auto it = container.begin(); it != container.end(); it++) { sum += *it; } </syntaxhighlight> ; <code>ranges</code>導入後 :<syntaxhighlight lang=c++> int sum = std::ranges::accumulate(container, 0); </syntaxhighlight> :<code>ranges</code>では、<code>accumulate</code>関数を使って範囲内の要素を集約する処理が簡単に行えます。 === まとめ === <code>ranges</code>ライブラリ導入前では、C++での範囲操作はイテレータを使って手動で行う必要がありましたが、<code>ranges</code>ライブラリ導入後は、範囲に対する操作が簡潔で直感的に記述できるようになりました。<code>ranges</code>を使用することで、コードの可読性が向上し、エラーが減るだけでなく、意図した操作をより明示的に表現できます。 == まとめと課題 == ここまでrangesライブラリの概要と基本的な使い方を説明してきました。最後に、本章をまとめると共に、rangesの課題やベストプラクティスについて触れます。 === rangesの利点のまとめ === * コードの簡潔性と表現力が向上する * 関数型プログラミングスタイルが適用できる * 安全性が高い(範囲チェックなど) * パフォーマンスが向上する(遅延実行、無駄なコピーの削減) * 独自の範囲アダプターやビューを作れる === 課題とベストプラクティス === * 範囲の合成が複雑になりすぎないよう注意 * 無駄な範囲の合成は避け、パフォーマンスに気をつける * ビューを再利用する場合はsubrangeで永続化する * 範囲アダプターの詳細を理解し、適切に使い分ける * 範囲は参照を返すため、ダングリング参照に注意 * 範囲ベースのコードは一般にわかりにくいため、コメントを心がける === 今後の展望 === * C++23ではrangesライブラリに更なる拡張が加えられる予定 * 範囲に対する並列アルゴリズムの導入が検討されている * 範囲に関する標準ライブラリの充実が進むと期待される rangesライブラリは、C++プログラミングのスタイルを一新する革新的な機能です。シンプルかつ表現力の高いコードを実現しつつ、アプリケーションのパフォーマンスも向上できます。一方で、一部の機能の複雑さや学習コストなどの課題もあります。今後、より安全で使いやすい範囲ライブラリが提供されることを期待しましょう。 以上がrangesライブラリの解説でした。皆さんのC++プログラミングの幅が広がることを願っています。 {{Nav}} [[Category:C++]] d69fyrtj34tms53k8bie1rwgq0o3xq3 C++/三方比較演算子 0 39910 264151 249690 2024-11-25T00:38:29Z Ef3 694 校閲と推敲と加筆 264151 wikitext text/x-wiki {{Nav}} C++20で導入された三方比較演算子(<code><=></code>)は、「宇宙船演算子」(spaceship operator)の愛称でも知られています。この演算子は、2つの値の関係(less、equal、greater)を単一の操作で判定できる総称的な比較を実現します。 == 基本概念 == 三方比較演算子は、比較結果として以下のいずれかの型を返します: * <code>std::strong_ordering</code> * <code>std::weak_ordering</code> * <code>std::partial_ordering</code> ;基本的な使用例: :<syntaxhighlight lang=c++ copy> #include <compare> #include <iostream> auto main() -> int { auto a{0.0}, b{a / a}; auto result = a <=> b; if (result < 0) std::cout << "a は b より小さい\n"; else if (result > 0) std::cout << "a は b より大きい\n"; else if (result == 0) std::cout << "a は b と等しい\n"; else std::cout << "NaN?\n"; } </syntaxhighlight> == 比較カテゴリ == === strong_ordering === 完全な順序関係を表現します。整数型などの厳密な比較が可能な型で使用されます。 * less * equal * greater === weak_ordering === 大小関係は存在するが、同値性を持つ要素が存在する場合に使用されます。 例:大文字小文字を区別しない文字列比較 === partial_ordering === 一部の値間で比較が定義されない可能性がある場合に使用されます。 ;例:浮動小数点数(NaNを含む場合) == クラスでの使用 == === デフォルト実装 === :<syntaxhighlight lang=c++ copy> struct Point { int x, y; auto operator<=>(const Point&) const = default; // 自動生成 }; </syntaxhighlight> === カスタム実装 === :<syntaxhighlight lang=c++ copy> struct Point { int x, y; std::strong_ordering operator<=>(const Point& other) const { if (auto cmp = x <=> other.x; cmp != 0) return cmp; return y <=> other.y; } }; </syntaxhighlight> == 特殊なケース == === NaNの処理 === 浮動小数点数の比較では、NaN(Not a Number)の存在に注意が必要です: :<syntaxhighlight lang=c++ copy> #include <compare> #include <cmath> double nan = std::nan("1"); double num = 1.0; auto result = nan <=> num; // std::partial_ordering::unordered を返す </syntaxhighlight> == メリット == * 比較演算子の一貫した実装 * ボイラープレートコードの削減 * 型安全な比較操作 * 標準ライブラリとの互換性 == ベストプラクティス == * 可能な限り <code>= default</code> を使用する * 適切な比較カテゴリを選択する * NaNを含む可能性がある場合は <code>partial_ordering</code> を使用する * 比較の推移性を保証する 三方比較演算子は、C++20以降のモダンなコードにおいて、オブジェクトの比較を簡潔かつ効率的に実装するための重要な機能です。特に、クラス型の比較操作を実装する際に、コードの可読性と保守性を大きく向上させることができます。 {{Nav}} {{DEFAULTSORT:さんほうこうひかくえんさんし}} [[Category:C++]] evyd4rike1hqnhzc5k6blimgserfxzh C++/Boost 0 39985 264169 257120 2024-11-25T08:32:37Z Ef3 694 {{DEFAULTSORT:BOOST}} 264169 wikitext text/x-wiki {{Nav}} == はじめに == Boostは、C++プログラミング言語のための重要なツールセットであり、豊富な機能と柔軟性を提供します。このハンドブックでは、Boostライブラリの概要から実用例までを網羅し、効果的なBoostの活用法を解説します。 == Boostの基本 == Boostの導入とインストール方法から始め、Boostライブラリの概要を説明します。さらに、Boostの利点と使い方についての詳細なガイダンスを提供します。 === Boostの導入とインストール方法 === Boostを利用するには、まず環境にBoostをインストールする必要があります。Boostのインストールは比較的簡単であり、以下の手順に従うことで行うことができます。 ; Boostのダウンロード : Boostの公式ウェブサイト(www.boost.org)から最新バージョンのBoostをダウンロードします。提供されている圧縮ファイルを展開します。 ; ビルド設定の確認 : Boostは、ヘッダーファイルのみで提供されているライブラリもあれば、ビルドが必要なライブラリもあります。インストールするライブラリに応じて、ビルド設定を確認します。 ; ビルド : 必要に応じて、Boostをビルドします。ビルド方法はOSや環境によって異なりますが、通常は提供されているスクリプトや手順に従ってビルドします。 ; インストール : ビルドが完了したら、Boostをシステムにインストールします。これにより、Boostのヘッダーファイルやビルド済みのライブラリが適切な場所に配置されます。 ; パスの設定 : Boostがインストールされた場所へのパスをシステムに追加します。これにより、コンパイラやビルドシステムがBoostを正しく見つけることができます。 以上の手順を実行することで、Boostを環境にインストールし準備することができます。 === Boostライブラリの概要 === Boostは、様々な用途に特化したライブラリが豊富に揃っています。以下に、いくつか代表的なBoostライブラリを紹介します。 ; Smart Pointers : スマートポインタライブラリは、C++のメモリ管理を効率的に行うためのツールです。動的メモリの確保や解放を自動化し、メモリリークや二重解放などの問題を回避します。 ; Regex : 正規表現ライブラリは、文字列のパターンマッチングや検索・置換を行うための機能を提供します。複雑な文字列操作を簡単に行うことができます。 ; Thread : スレッドライブラリは、マルチスレッドプログラミングをサポートします。並列処理や同期、排他制御などの機能を提供し、効率的な並列プログラミングを実現します。 ; Filesystem : ファイルシステムライブラリは、ファイルやディレクトリの操作を行うための機能を提供します。ファイルの読み書きやパスの操作などが可能です。 これらの他にも、数学関連やコンテナ、アルゴリズム、入出力、テストなど、さまざまな用途に特化したBoostライブラリが提供されています。 === Boostの利点と使い方 === Boostの利点は多岐にわたりますが、主なものとしては以下の点が挙げられます。 ; 高品質なライブラリ : Boostは、高品質なC++ライブラリの集合体です。その品質は、多くの開発者やコミュニティによって検証されています。 ; 標準化の促進 : Boostの一部のライブラリは、C++標準の一部として採用されています。これにより、BoostはC++の標準化に貢献しています。 ; 豊富な機能 : Boostは幅広い用途に特化したライブラリが揃っており、開発者が効率的にさまざまなタスクを実行できるようサポートしています。 Boostの使い方は、各ライブラリのドキュメントやチュートリアルを参照することで学ぶことができます。適切なライブラリを選択し、効果的に活用することで、C++プログラミングの生産性と品質を向上させることができます。 == Boostライブラリのカテゴリ == Boostライブラリはさまざまなカテゴリに分類されます。ユーティリティ、コンテナ、アルゴリズム、スレッディング、ファイルシステム、数学、正規表現、画像処理、テストなど、各カテゴリごとにライブラリの特性や使い方を解説します。 === ユーティリティライブラリ === ユーティリティライブラリには、一般的なプログラミングタスクを補助する機能が含まれています。例えば、スマートポインタやタプルのようなデータ構造、バイトオーダーの変換、日付と時刻の操作などがあります。これらのライブラリは、プログラマが効率的で信頼性の高いコードを書くための基本的なツールを提供します。 例: Boost.SmartPtr、Boost.Any、Boost.Date_Time === コンテナライブラリ === コンテナライブラリは、データを格納し、管理するための様々なデータ構造を提供します。これには、配列、リスト、マップ、セットなどが含まれます。これらのライブラリは、効率的なデータアクセスや操作を実現し、プログラムのパフォーマンスを向上させます。 例: Boost.Array、Boost.Container、Boost.MultiIndex === アルゴリズムライブラリ === アルゴリズムライブラリは、一般的なアルゴリズムやデータ処理の機能を提供します。ソート、検索、変換、比較などのアルゴリズムが含まれます。これらのライブラリは、プログラムの効率性や柔軟性を向上させるために使用されます。 例: Boost.Algorithm、Boost.Range、Boost.Sort === スレッディングライブラリ === スレッディングライブラリは、マルチスレッドプログラミングをサポートします。並列処理や同期、スレッド間通信などの機能を提供し、プログラマが効率的で安全な並列プログラミングを行うことができます。 例: Boost.Thread、Boost.Atomic、Boost.Asio === ファイルシステムライブラリ === ファイルシステムライブラリは、ファイルやディレクトリの操作を行うための機能を提供します。ファイルの作成、削除、移動、ファイルパスの操作などが含まれます。 例: Boost.Filesystem、Boost.IOStreams === 数学ライブラリ === 数学ライブラリには、数値計算や数学関数、乱数生成などの機能が含まれます。これらのライブラリは、科学技術計算やシミュレーションなどの数学的なタスクを実行するために使用されます。 例: Boost.Math、Boost.Random === 正規表現ライブラリ === 正規表現ライブラリは、文字列のパターンマッチングや検索、置換などの操作を行うための機能を提供します。複雑な文字列処理を簡素化し、効率的なテキスト処理を実現します。 例: Boost.Regex === 画像処理ライブラリ === 画像処理ライブラリは、画像の読み込み、保存、変換、フィルタリングなどの機能を提供します。これらのライブラリは、画像処理アプリケーションやコンピュータビジョンプロジェクトで使用されます。 例: Boost.GIL(Generic Image Library) === テストライブラリ === テストライブラリは、ユニットテストや統合テストを実行するための機能を提供します。テストケースの作成、実行、結果の検証などを行うことができます。 例: Boost.Test これらは、Boostライブラリの主要なカテゴリの一部です。各カテゴリにはさらに多くのサブライブラリが含まれており、プログラマがさまざまな用途に応じて適切なライブラリを選択できるようになっています。 == 各ライブラリの詳細 == 各Boostライブラリの詳細な解説を行います。ライブラリの概要、基本的な使用方法、具体的な例、およびベストプラクティスを提供します。 === Boost.SmartPtr === ==== 概要 ==== Boost.SmartPtrライブラリは、スマートポインタの実装を提供します。スマートポインタは、動的に割り当てられたメモリの所有権を自動的に管理するためのポインタであり、メモリリークや二重解放などの問題を回避するのに役立ちます。 ==== 基本的な使用方法 ==== Boost.SmartPtrライブラリには、以下の主要なスマートポインタが含まれています。 * <code>boost::shared_ptr</code>: 複数のポインタが同じリソースを参照できる共有ポインタ。 * <code>boost::scoped_ptr</code>: スコープを持つ単一所有権ポインタ。 * <code>boost::weak_ptr</code>: 循環参照を回避するための弱参照ポインタ。 ==== 具体的な例 ==== :<syntaxhighlight lang=c++> #include <boost/smart_ptr.hpp> #include <iostream> int main() { // shared_ptrの使用例 boost::shared_ptr<int> sharedPtr(new int(42)); std::cout << "Value: " << *sharedPtr << std::endl; // scoped_ptrの使用例 boost::scoped_ptr<int> scopedPtr(new int(100)); std::cout << "Value: " << *scopedPtr << std::endl; return 0; } </syntaxhighlight> ==== ベストプラクティス ==== * スマートポインタは、動的メモリ管理の煩わしさを軽減するために使用されます。できる限り、裸のポインタよりもスマートポインタを使用することを推奨します。 * <code>shared_ptr</code>は、共有リソースの管理に使用されますが、循環参照に注意する必要があります。 === Boost.Regex === ==== 概要 ==== Boost.Regexライブラリは、正規表現の操作を行うための機能を提供します。正規表現は、文字列のパターンマッチングや検索、置換などの操作に使用されます。 ==== 基本的な使用方法 ==== Boost.Regexライブラリは、C++の正規表現操作に対する柔軟で高度なインターフェースを提供します。<code>boost::regex</code>クラスを使用して正規表現オブジェクトを作成し、<code>boost::regex_search()</code>や<code>boost::regex_replace()</code>などの関数を使用して文字列操作を行います。 ==== 具体的な例 ==== :<syntaxhighlight lang=c++> #include <boost/regex.hpp> #include <iostream> int main() { std::string text = "Hello, world!"; boost::regex pattern("world"); if (boost::regex_search(text, pattern)) { std::cout << "Pattern found in text." << std::endl; } else { std::cout << "Pattern not found in text." << std::endl; } return 0; } </syntaxhighlight> ==== ベストプラクティス ==== * 正規表現を使用する前に、パフォーマンスやセキュリティに関する考慮事項を十分に理解してください。 * 正規表現パターンが複雑になる場合は、コメントやドキュメントを追加して理解しやすくしてください。 このように、各Boostライブラリには独自の特性と使い方があります。適切なライブラリを選択し、効果的に活用することで、C++プログラミングの生産性と品質を向上させることができます。 == 発展的なトピック == テンプレートメタプログラミングやC++標準との関係など、より高度なトピックについて掘り下げます。また、Boostの最新の動向や将来展望についても議論します。 === テンプレートメタプログラミング === テンプレートメタプログラミング(TMP)は、C++の強力な機能の1つであり、コンパイル時にプログラムを生成する手法です。Boostは、TMPの活用において非常に重要な役割を果たしています。Boost.MPL(Template Metaprogramming Library)やBoost.Fusionなどのライブラリは、TMPを使用して高度なメタプログラミングを実現するためのツールを提供しています。これにより、プログラムの性能や柔軟性を向上させることができます。 === C++標準との関係 === Boostは、C++標準化のプロセスにおいても重要な役割を果たしています。多くのBoostライブラリが、C++標準の一部として採用されています。例えば、C++11ではBoostからの影響が顕著であり、スマートポインタ、スレッド、正規表現などの機能が標準化されました。また、C++標準化委員会のメンバーの一部がBoostコミュニティにも参加しており、両者の間には密接な関係があります。 === Boostの最新の動向と将来展望 === Boostは、常に進化し続けています。新しいライブラリや機能が定期的に追加され、既存のライブラリも改良されています。特に、C++の新しい機能や標準の変更に合わせて、Boostも追随しています。将来的には、より効率的で柔軟なプログラミングを実現するための新しい機能やパフォーマンスの向上が期待されます。また、Boostのコミュニティは、より多様なプラットフォームやアーキテクチャに対応するために活発に活動しています。 Boostの最新の動向や将来展望については、Boostの公式ウェブサイトやメーリングリスト、コミュニティのフォーラムなどで定期的に情報が提供されています。これらの情報源を通じて、最新のBoostの動向を追跡し、今後のプロジェクトや開発に活かすことができます。 == 附録 == === Boostのライセンス === Boostは、独自のフリーソフトウェアライセンスであるBoost Software License(BSL)の下で提供されています。BSLは、BSDライセンスやMITライセンスのような許容的なライセンスであり、商用および非商用の両方のプロジェクトで自由に使用することができます。また、BSLは、Boostライブラリを修正して再配布する際にも、追加の義務を負わない条件を規定しています。 詳細については、Boostの公式ウェブサイトやライセンステキストを参照してください。 === リリース情報 === 以下は、Boostの最新から3つ前のリリース(バージョン1.86.0、1.85.0、1.84.0)の要約です。 ; Boost 1.86.0 (2024年8月14日) :; 新機能 ::; Boost.Cobalt : 高度な数学的コンセプトのサポートを提供する新しいライブラリ。 ::; Boost.Redis : Redisデータベースとの接続をサポートするライブラリ。 :; 更新されたライブラリ ::; Boost.Accumulators : 集計用の新しい機能が追加。 ::; Boost.Filesystem : ファイルシステム操作の改善とバグ修正。 ::; Boost.Graph : グラフアルゴリズムの強化。 ::; Boost.Math : 数学的な機能の拡充。 :; バグ修正と性能向上 :: いくつかのライブラリで性能の改善とバグ修正が行われています。 ; Boost 1.85.0 (2024年4月15日) :; 新機能 ::; Boost.Charconv : C++17の`std::from_chars`と`std::to_chars`に基づく文字列と数値の変換ライブラリ。 ::; Boost.Scope : スコープに関連するリソースの自動管理を提供するライブラリ。 :; 更新されたライブラリ ::; Boost.Asio : 非同期I/Oの機能が強化されています。 ::; Boost.JSON : JSONの処理機能が改良されています。 ::; Boost.Multiprecision : 高精度な数値計算の機能が拡張されています。 :; バグ修正と性能向上 :: 多くのライブラリでバグ修正と性能改善が行われています。 ; Boost 1.84.0 (2023年12月13日) :; 新機能 ::; Boost.Cobalt : 新しい数学的機能をサポートするライブラリ(詳細不明)。 ::; Boost.Redis : Redisとの接続をサポートするライブラリ(詳細不明)。 :; 更新されたライブラリ ::; Boost.Filesystem : ファイルシステム操作に関する機能が強化されています。 ::; Boost.Graph : グラフアルゴリズムとデータ構造の機能が拡充されています。 ::; Boost.Math : 数学的な機能が改善されています。 :; バグ修正と性能向上 :: 複数のライブラリでバグ修正と性能改善が行われ、全体的な安定性が向上しています。 これらのリリースでは、新しいライブラリの追加や既存ライブラリの機能強化、性能向上が図られており、C++開発者にとってより強力で便利なツールが提供されています。最新のリリースノートでは、詳細な変更点や追加機能について確認できます。 === 参考文献 === Boostに関するさらなる学習や理解を深めるために、以下の参考文献が役立ちます。 * [https://www.boost.org/doc/ Boost公式ドキュメント] * [https://www.boost.org/doc/libs/ The Boost C++ Libraries]: Boostライブラリの個別のドキュメントとリファレンス。 * C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond by David Abrahams, Aleksey Gurtovoy * Introduction to the Boost C++ Libraries by Robert Demming, Daniel J. Duffy これらの文献は、Boostライブラリの理解を深めるための貴重なリソースです。 === Boostコミュニティへの参加方法 === Boostコミュニティへの参加は、以下の方法で行うことができます。 ; メーリングリストへの参加 Boostのメーリングリストに登録し、他の開発者やユーザーとコミュニケーションを取りましょう。 ; GitHubでの貢献 BoostのGitHubリポジトリに貢献し、バグの報告や新しい機能の提案、パッチの提供などを行いましょう。 Boostコミュニティは非常に活発で、新しいメンバーを歓迎しています。あなたの貢献がBoostプロジェクトの成長と発展に役立つことでしょう。 {{Nav}} {{DEFAULTSORT:BOOST}} [[Category:C++]] r4psop3s38i1p2rq0vuo5j8eyrao9s8 C++/パッケージマネージャ 0 39986 264170 250081 2024-11-25T08:38:27Z Ef3 694 Fix markup 264170 wikitext text/x-wiki {{Nav}} = パッケージマネージャ = == C/C++におけるパッケージマネージャの必要性 == 近年、C/C++プログラミングにおいても外部ライブラリの利用が一般化しています。高機能なライブラリを活用することで、開発の効率化やコードの信頼性向上が図れるためです。しかし、ライブラリの導入には複雑な依存関係の管理が伴います。適切に管理されない場合、ビルドエラーやバージョン不整合などの問題が発生する可能性があります。 また、ソフトウェア開発では環境の違いによるビルド結果の変化を防ぐ必要があります。同じソースコードでも、使用するライブラリのバージョンや設定が異なれば、動作が変わってしまう可能性があるのです。これを回避するには、ビルド環境の統一が不可欠です。 このような状況において、パッケージマネージャは効率的な依存関係の管理と、プロジェクトの可搬性と再現性を実現するための重要なツールとなります。パッケージマネージャを利用すれば、必要なライブラリをすばやく入手し、簡単にセットアップできます。さらに、プロジェクトで使用するライブラリのバージョンを明示的に記述できるため、異なる環境でも同じビルド結果が得られるようになります。 == 主要なC/C++向けパッケージマネージャ == C/C++向けの主要なパッケージマネージャとして、以下の2つが広く利用されています。 === Vcpkg === '''Vcpkg''' は、C/C++向けのオープンソースのパッケージマネージャです。GitHubでホストされており、Windows、Linux、macOSといったさまざまなプラットフォームに対応しています。CMakeベースのビルドシステムを採用しており、ビルドツールに依存しない設計となっています。 Vcpkgのインストールは公式サイト( https://vcpkg.io/ )から入手できるバイナリか、GitHubのリポジトリ( https://github.com/microsoft/vcpkg )からのクローンによって行えます。Windows向けのバイナリ配布もあり、手軽に利用を始められます。 Vcpkgを使ってライブラリをインストールする場合、以下のようなコマンドを実行します。 :<syntaxhighlight lang=shell-session> vcpkg install [packagename] </syntaxhighlight> この <code>vcpkg install</code> コマンドでパッケージをインストールすると、自動的にそのパッケージに必要な依存ライブラリも一緒にインストールされます。インストール先は <code>vcpkg</code> フォルダ内の <code>installed</code> ディレクトリになります。 インストール済みのパッケージとバージョンを確認するには、次のコマンドを使います。 :<syntaxhighlight lang=shell-session> vcpkg list </syntaxhighlight> パッケージの情報を見るには、以下のように実行します。 :<syntaxhighlight lang=shell-session> vcpkg search [packagename] </syntaxhighlight> === Conan === '''Conan''' は、C/C++、PythonでのオープンソースおよびプロプライエタリなパッケージングのためのCross-platformで無料のパッケージマネージャです。Conanには独自のレシピ形式があり、ソースコードからバイナリパッケージをビルドし、パッケージホスティングサービスにアップロードできます。Python製のため、クロスプラットフォームに対応しています。 Conanのインストールはpipコマンドで行えます。 :<syntaxhighlight lang=shell-session> pip install conan </syntaxhighlight> Conanでパッケージをインストールする場合、以下のようにします。 :<syntaxhighlight lang=shell-session> conan install [packagename/version@user/channel] --build=missing </syntaxhighlight> packageのリビジョンを指定したり、ビルド設定をカスタマイズすることもできます。 :<syntaxhighlight lang=shell-session> conan install [packagename/version@user/channel] ... </syntaxhighlight> インストールされたパッケージを確認するには以下のコマンドを使います。 :<syntaxhighlight lang=shell-session> conan info . </syntaxhighlight> Conanにもパッケージの検索機能があり、フィルタリング指定が可能です。 :<syntaxhighlight lang=shell-session> conan search [packagename] --remote=all </syntaxhighlight> このように、VcpkgとConanはパッケージのインストール、検索、管理を行うためのコマンドラインツールを備えています。次の節では、具体的な使用方法をご紹介します。 == パッケージマネージャの基本的な使用方法 == パッケージマネージャを使う上で最も基本的な操作は、パッケージのインストール、削除、更新、情報確認です。この節では、VcpkgとConanを例にそれぞれの方法を解説します。 === パッケージのインストール === パッケージをインストールする際は、パッケージ名を指定してコマンドを実行します。 ; Vcpkgの場合 :<syntaxhighlight lang=shell-session> vcpkg install [packagename] </syntaxhighlight> : 例えば、広く利用されているBoostライブラリをインストールするには以下のようにします。 :<syntaxhighlight lang=shell-session> vcpkg install boost:x64-windows </syntaxhighlight> ; Conanの場合 :<syntaxhighlight lang=shell-session> conan install [packagename/version@user/channel] --build=missing </syntaxhighlight> : versionやuser/channelを省略することもできます。例えばOpenCVの最新版をインストールする場合は、以下のようになります。 :<syntaxhighlight lang=shell-session> conan install opencv/4.5.1@ </syntaxhighlight> === パッケージの削除 === 不要になったパッケージは削除できます。 ; Vcpkg :<syntaxhighlight lang=shell-session> vcpkg remove [packagename] </syntaxhighlight> ; Conan :<syntaxhighlight lang=shell-session> conan remove [packagename] --src --build --packages </syntaxhighlight> : --src、--build、--packagesオプションでソース、ビルド、バイナリパッケージを削除するかを細かく指定できます。 === パッケージの更新 === インストール済みのパッケージを最新版に更新することもできます。 ; Vcpkg :<syntaxhighlight lang=shell-session> vcpkg upgrade --no-dry-run </syntaxhighlight> ; Conan :<syntaxhighlight lang=shell-session> conan install [packagename/version@user/channel] --update </syntaxhighlight> === パッケージ情報の確認 === '''Vcpkg'''でインストール済みのパッケージ一覧を表示: :<syntaxhighlight lang=shell-session> vcpkg list </syntaxhighlight> ; パッケージの詳細情報を表示: :<syntaxhighlight lang=shell-session> vcpkg search [packagename] </syntaxhighlight> '''Conan'''でインストール済みのパッケージ情報を表示: :<syntaxhighlight lang=shell-session> conan info . </syntaxhighlight> ; パッケージを検索: :<syntaxhighlight lang=shell-session> conan search [packagename] --remote=all </syntaxhighlight> このようにパッケージマネージャのコマンドラインツールを使うことで、外部ライブラリの管理を容易に行えます == ビルドシステムとの連携 == パッケージマネージャでインストールしたライブラリを実際のプロジェクトで活用するには、ビルドシステムと連携させる必要があります。ここではCMakeとの連携方法を中心に解説します。 === CMakeでのVcpkgの利用 === VcpkgはCMakeとの連携に最適化されています。CMakeプロジェクトのルートディレクトリに <code>vcpkg.cmake</code> ツールチェーンファイルを配置し、<code>CMakeLists.txt</code> で読み込むことで連携できます。 <code>CMakeLists.txt</code> の設定例: :<syntaxhighlight lang=cmake copy> # VcpkgのMSVCツールチェーンファイルのパスを設定 set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file") # ビルドに必要なパッケージを指定 find_package(Boost REQUIRED) find_package(OpenCV REQUIRED) # ターゲットリンクライブラリを指定 target_link_libraries(myapp PRIVATE Boost::boost ${OpenCV_LIBS} ) </syntaxhighlight> VcpkgではCMakeのfind_packageコマンドで外部ライブラリを検出できます。ライブラリがインストールされていない場合は自動的にvcpkgコマンドでインストールを試みます。 === CMakeでのConanの利用 === ConanもCMakeと連携できますが、標準ツールチェーンファイルは用意されていません。代わりに <code>conan.cmake</code> という独自のモジュールを利用します。 <code>conanfile.txt</code> にプロジェクトの依存関係を記述し、 :<syntaxhighlight lang=text copy> [requires] boost/1.73.0 opencv/4.5.1 [generators] cmake </syntaxhighlight> <code>conan install</code> コマンドで外部ライブラリをインストールします。インストール時に <code>conan.cmake</code> がプロジェクトルートに生成されます。 <code>CMakeLists.txt</code> で <code>conan.cmake</code> を読み込むことで連携できます。 :<syntaxhighlight lang=cmake copy> include(${CMAKE_BINARY_DIR}/conan.cmake) # パッケージのインクルードパスをプロジェクトに追加 include_directories(${CONAN_INCLUDE_DIRS}) # ターゲットリンクライブラリを指定 target_link_libraries(myapp ${CONAN_LIBS} ) </syntaxhighlight> このようにCMakeプロジェクトにパッケージマネージャの情報を付与することで、ビルド時に外部ライブラリを適切に読み込めるようになります。 == 外部ライブラリの管理 == 前節でCMakeとの連携を見たように、パッケージマネージャを使えばさまざまな外部ライブラリを簡単にインストールできます。ここでは、特にC/C++で広く利用される主要ライブラリのインストール例をご紹介します。 === Boost === C++の汎用ライブラリであるBoostは、VcpkgやConanのパッケージとして提供されています。 ; Vcpkg :<syntaxhighlight lang=shell-session> vcpkg install boost:x64-windows </syntaxhighlight> ; Conan :<syntaxhighlight lang=shell-session> conan install boost/1.73.0@ </syntaxhighlight> Boostは膨大なモジュールから構成されるため、必要なモジュールのみ部分的にインストールすることもできます。 === OpenCV === コンピュータビジョンライブラリのOpenCVもインストール可能です。 ; Vcpkg :<syntaxhighlight lang=shell-session> vcpkg install opencv4:x64-windows </syntaxhighlight> ; Conan :<syntaxhighlight lang=shell-session> conan install opencv/4.5.1@ </syntaxhighlight> Conanではコンパイル済みのOpenCV 4.5.1バイナリパッケージを提供しています。VcpkgもバイナリをPullできますが、ソースからビルドすることも可能です。 その他にも、数値計算ライブラリのEigen、自然言語処理ライブラリのOPENNLP、幾何ライブラリのCGALなど、さまざまな人気ライブラリがVcpkgやConanでインストールできます。 == パッケージマネージャの高度な機能 == ここまでは、パッケージマネージャの基本的な使い方を解説してきました。しかし、パッケージマネージャには高度な機能も備わっています。この節では、カスタムパッケージの作成、バージョン管理、マルチプラットフォーム対応など、上級者向けの機能について説明します。 === カスタムパッケージの作成 === パッケージマネージャに登録されていないライブラリを利用したい場合、自分でカスタムパッケージを作成する必要があります。 '''Vcpkg'''ではパッケージ定義ファイル(CONTROL)とビルドスクリプト(portfile.cmake)を記述します。 :<syntaxhighlight lang=cmake copy> # CONTROL ファイル Source: mylib Version: 1.0 Description: My custom library </syntaxhighlight> :<syntaxhighlight lang=cmake copy> # portfile.cmake vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH REPO mylib/mylib REF v1.0 ) vcpkg_configure_cmake( SOURCE_PATH ${SOURCE_PATH} PREFER_NINJA ) vcpkg_install_cmake() vcpkg_copy_pdbs() </syntaxhighlight> '''Conan'''ではレシピ(conanfile.py)を記述してパッケージを作成します。 :<syntaxhighlight lang=python3 copy> from conans import ConanFile, CMake class MylibConan(ConanFile): name = "mylib" version = "1.0" def source(self): self.run("git clone https://github.com/mylib/mylib.git") def build(self): cmake = CMake(self) cmake.configure() cmake.build() def package(self): self.copy("*.h", dst="include", src="mylib") self.copy("*.lib", dst="lib", keep_path=False) </syntaxhighlight> これらのファイルを用意し、パッケージマネージャのコマンドを実行するとカスタムパッケージが作成できます。 === バージョン管理とアップグレード === パッケージマネージャではライブラリのバージョン指定と、アップグレードの機能が提供されています。 '''Vcpkg'''ではバージョンを指定してインストールできます。 :<syntaxhighlight lang=shell-session> vcpkg install boost:x64-windows@1.72.0 </syntaxhighlight> アップグレードはこのコマンドで実行します。 :<syntaxhighlight lang=shell-session> vcpkg upgrade --no-dry-run </syntaxhighlight> '''Conan'''でもバージョン指定が可能です。 :<syntaxhighlight lang=shell-session> conan install boost/1.72.0@ </syntaxhighlight> アップグレードは <code>--update</code> オプションをつけてインストールします。 :<syntaxhighlight lang=shell-session> conan install boost/1.73.0@ --update </syntaxhighlight> また、ConanではGitリポジトリから直接インストールすることもできます。このようにしてリポジトリの最新版を入手できます。 :<syntaxhighlight lang=shell-session> conan install boost/1.73.0@conan/stable --build=missing </syntaxhighlight> === マルチプラットフォーム対応 === C/C++アプリケーションはさまざまなプラットフォームで動作する必要があります。パッケージマネージャではプラットフォームごとにビルドオプションを指定して、クロスプラットフォームなバイナリパッケージを作成できます。 '''Vcpkg'''では <code>-Target</code> オプションでプラットフォームを指定します。 :<syntaxhighlight lang=shell-session> vcpkg install boost:x64-windows vcpkg install boost:x64-linux vcpkg install boost:x64-osx </syntaxhighlight> '''Conan'''でもプラットフォーム設定が可能です。<code>conan install</code> 時のプロファイルでオプションを設定します。 :<syntaxhighlight lang=shell-session> conan install boost/1.73.0@ -s build_type=Release -s compiler=gcc -s ... </syntaxhighlight> 生成されたパッケージは、あらかじめ設定したリモートサーバーにアップロードしておき、必要な時にダウンロードできます。 == ベストプラクティス == パッケージマネージャを効果的に活用するためには、適切な運用方法を心がける必要があります。この節では、パッケージマネージャの利用におけるベストプラクティスをいくつか紹介します。 === セキュリティ対策 === 第三者が提供するパッケージを利用する際は、セキュリティリスクに注意を払う必要があります。パッケージにマルウェアが含まれていたり、既知の脆弱性が存在する可能性があるためです。 そこで、公的な信頼できるリポジトリからパッケージを取得することが推奨されます。Vcpkgの公式リポジトリやConanのconan-centerリポジトリなどがそれにあたります。 ; Vcpkg :<syntaxhighlight lang=shell-session> vcpkg install [package] --overlay-ports=https://github.com/microsoft/vcpkg </syntaxhighlight> ; Conan :<syntaxhighlight lang=shell-session> conan install [package] --remote=conan-center </syntaxhighlight> 信頼できないソースからパッケージを取得する場合は、ソースコードを確認し、脆弱性のスキャンを行うなどの対策が必要です。 === キャッシュの活用 === ネットワーク経由でパッケージをダウンロードしてくると、回線状況によっては時間がかかる可能性があります。特に大規模なプロジェクトでは、この影響が無視できません。 そこでパッケージマネージャではキャッシュ機能が用意されています。一度ダウンロードしたパッケージはキャッシュに保存されるので、2回目以降は高速にインストールできます。 '''Vcpkg'''のキャッシュは以下のディレクトリに保存されています。 :<syntaxhighlight lang=text> %VCPKG_ROOT%\packages </syntaxhighlight> '''Conan'''のキャッシュは、デフォルトで以下の場所に置かれています。 :<syntaxhighlight lang=text> ~/.conan </syntaxhighlight> このキャッシュディレクトリはリポジトリのように扱え、共有やバックアップも可能です。複数の開発者で同じキャッシュを参照すれば、無駄な通信トラフィックを大幅に削減できます。 === CIでの利用 === 継続的インテグレーション(CI)ではビルド環境の完全な再現が重要です。そこでパッケージマネージャを導入することで、確実に同一の外部ライブラリをインストールでき、ビルド再現性が高まります。 CIサービスの多くは、パッケージマネージャをあらかじめサポートしています。例えばAppVeyorではVcpkgが利用でき、CircleCIではConanが利用可能です。 CIの設定ファイルに、パッケージマネージャのインストールと依存ライブラリのインストール手順を記述します。以下はVcpkgとCircleCIの例です。 :<syntaxhighlight lang=yaml copy> # CircleCI の設定ファイル jobs: build: docker: - image: circleci/python:3.7 steps: # VcpkgのセットアップとBoostライブラリのインストール - run: name: Install Vcpkg and Dependencies command: | git clone https://github.com/Microsoft/vcpkg.git ./vcpkg/bootstrap-vcpkg.sh ./vcpkg/vcpkg install boost:x64-linux # プロジェクトのビルド - checkout - run: command: | mkdir build cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake make </syntaxhighlight> このようにCIでパッケージマネージャを活用することで、本番環境でのビルド確認が確実になり、品質の向上が期待できます。 == まとめ == この章では、C/C++開発におけるパッケージマネージャの必要性と、主要なパッケージマネージャであるVcpkgとConanの使い方を詳しく解説してきました。 パッケージマネージャを利用することで、次のようなメリットが得られます。 * 外部ライブラリの簡単なインストールと管理 * 依存関係の自動解決 * プロジェクトの可搬性と再現性の向上 * ビルド時間の短縮 * 開発の効率化 特にC/C++のようにコンパイル時間が長く、多くの外部ライブラリに依存するプロジェクトではパッケージマネージャの導入が不可欠といえます。 一方で、パッケージマネージャを安全かつ効率的に運用するために、セキュリティ対策やキャッシュの活用、CIでの利用などのベストプラクティスも押さえておく必要があります。 パッケージマネージャはC/C++の開発環境を大きく改善するツールです。本章で解説した内容を活かして、ぜひ実際の開発でパッケージマネージャを積極的に活用していただければと思います。 今後もパッケージマネージャはさらに進化を続けていくでしょう。新しい機能の追加や、より使いやすくなるための改善が行われていくことが予想されます。C/C++開発者としては、これらの動向に注目し、よりよいツールを取り入れていくことが重要になるでしょう。 {{Nav}} {{DEFAULTSORT:はつけしまねしや}} [[Category:C++]] mq3krq1c6k83tf6hcyj7do8c8hgr6pb 高等学校日本史探究/古代国家の形成Ⅰ 0 43191 264128 263796 2024-11-24T13:42:23Z ~2024-18367 85054 /* 推古朝の外交と内政 */ 264128 wikitext text/x-wiki [[小学校・中学校・高等学校の学習]]>[[高等学校の学習]]>[[高等学校地理歴史]]>[[高等学校日本史探究]]>古代国家の形成Ⅰ ==6世紀の朝鮮半島と倭== 5世紀の朝鮮半島は、'''高句麗'''と'''百済'''の間で戦争になりました。475年、高句麗が漢城(百済の首都)を攻めました。その結果、百済の国王は降伏して、高句麗の兵士に殺されました。降伏後の百済は首都を熊津から扶余に引っ越し、'''加耶'''地域まで影響力を広げました。日本のヤマト政権も伽耶地域に関心がありました。加耶諸国と仲良くしたいので、兵士を朝鮮半島に送りました。しかし、伽耶諸国は「自分達の力だけで国を動かしていきたい」と考えるようになりました。512年、加耶地域の西側が百済の支配下に入るようになりました。6世紀を迎えると、'''新羅'''もかなり力をつけ始めます。新羅は百済と争いながら、伽耶諸国を新羅の領土に入れました。その結果、ヤマト政権は朝鮮半島の影響力を失いました。 継体天皇が亡くなると、ヤマト政権も'''大伴金村'''派(安閑天皇と宣化天皇)と'''蘇我稲目'''派('''欽明天皇''')に分かれました(二朝併立)。539年、大伴金村と蘇我稲目が仲直りします。仲直りすると、欽明天皇が国をまとめます。なお、大伴金村は'''物部尾輿'''から朝鮮半島政策でかなり怒られ、540年に政権を退くようになりました。 538年、仏教が朝鮮半島から日本に初めて伝わると、2つの意見に分かれました。蘇我稲目は「仏教を取り入れたい。」と考えました。一方、物部尾輿と中臣鎌子は「仏教を取り入れず、今までの神様を大切にしたい。」と考えました。こうして、蘇我稲目(蘇我氏)と物部尾輿(物部氏)・中臣鎌子(中臣氏)は争うようになります。この争いは子供にも引き継がれます。結局、<span style="color:#f29100">'''蘇我馬子'''</span>が仏教を取り入れるために王族や諸豪族を集めて、物部氏の代表(<span style="color:#f29100">'''物部守屋'''</span>)を587年に倒しました([[w:丁未の乱|丁未の乱]]<ref>この名称の記述は日本史探究の全教科書・全参考書・資料集に記載されていません。</ref>)。なお、考古学者は、奈良県明日香村の石舞台古墳を上円下方墳と考えられています。かなり大きな横穴式石室が石舞台古墳にそのまま残っています。石舞台古墳は蘇我馬子のお墓(桃原墓)と考えられています。また、石舞台古墳近くの島庄遺跡は蘇我馬子の屋敷跡だと考えられています。 当時、国の施設('''屯倉''')・特別な人('''名代・子代''')を全国各地に置きました。また、有力豪族の代表(大夫)同士で話し合いをする仕組みも作りました。さらに、専門職('''品部''')も作られました。このように、国の仕組みが整うと、倭国も大きく変わりました。 {| style="border:2px solid #F4ADA3;width:100%" cellspacing="0" ! style="background: #F4ADA3" |'''蘇我氏はどうして大きくなりましたか?''' |- | style="padding:5px" |蘇我氏はかつて大和国の高市郡曽我地方に住んでいました。やがて、葛城家(大和南西部の一族)から離れるために、大和国の高市郡飛鳥地方に移ります(蘇我氏の独立)。蘇我稲目は大臣になり、かなり重要な政策を進めました。5世紀を迎えると、蘇我氏は当時の天皇家と結婚します。こうして蘇我氏は大きな力を持つようになり、日本各地に広がりました。また、蘇我稲目はお金や大切な物を斎蔵・内蔵・大蔵へ移して、渡来人の東漢氏に斎蔵・内蔵・大蔵の管理を任せました。さらに、蘇我稲目は自分の娘2人(堅塩媛と小姉君)を欽明天皇の妻にしました。その結果、蘇我氏は用明天皇・崇峻天皇・推古天皇と家族のような繋がりを持つようになり、ますます大きな力を持つようになりました。次の蘇我馬子は大臣になり、大夫と協力しながら政治のお仕事をしました。これに対して、崇峻天皇は蘇我馬子を恐れていました。592年、蘇我馬子は崇峻天皇を殺しました。 |} ==推古朝の外交と内政== 当時、政治の中心地は飛鳥にありました(<span style="color:#f29100">'''飛鳥時代'''</span>)。額田部皇女(豊御食炊屋姫)が蘇我馬子と豪族からの推薦で初めて女性天皇に選ばれました(<span style="color:#f29100">'''推古天皇'''</span>)。なお、額田部皇女(豊御食炊屋姫)は欽明天皇(父親)と蘇我堅塩媛(母親)の娘です。奈良県橿原市の植山古墳は東側と西側に横穴式石室を設けています。そのうち、西側の石室が推古天皇の墓だと考えられています。593年、<span style="color:#f29100">'''厩戸王'''</span>(<span style="color:#f29100">'''聖徳太子'''</span>:推古天皇の甥)が政治に携わるようになりました。そこから推古天皇・厩戸王・蘇我馬子の3人が力を合わせて国を治めるようになりました。それ以降、倭国は東アジアの国際関係を深めるようになりました。なお、日本書紀の「摂政」は平安時代の「摂政」と異なり、「誰かの代わりに政治をする。」という意味で使われます。 {| style="border:2px solid #9E7360;width:100%" cellspacing="0" ! style="background: #9E7360" |'''{{font color|#ffffff|聖徳太子}}''' |- | style="padding:5px" |厩戸王(聖徳太子)は用明天皇(父親)と穴穂部皇女(母親)の息子です。実は、厩戸王(聖徳太子)の父親と母親はどちらも蘇我家でした。そして、推古天皇・蘇我馬子も蘇我氏の親戚関係なので、推古天皇・厩戸王・蘇我馬子の3人が力を合わせて国を治めるようになりました。なお、皇太子制度と摂政制度は飛鳥時代にありません。そのため、厩戸王は天皇の後継者として政治に関わるようになりました。しかし、どこまで推古天皇のお仕事を手伝っていたのかまでははっきりしません。厩戸王は残念ながら推古天皇より先に亡くなり、天皇になれませんでした。厩戸王はかなり早い時期から聖徳太子とも呼ばれ、様々な伝説も生まれました。厩戸王が亡くなってからも、一般民衆の間でますます尊敬されるようになりました。 |} 北朝の<span style="color:#f29100">'''隋'''</span>は勢力を伸ばし、南陳を589年に手に入れました。その結果、久しぶりに国がまとまりました。隋は法律を作り、朝鮮半島と倭国を攻めました。598年から高句麗に4回も軍隊を送りました。これに対して、高句麗・新羅・百済・倭国は国をまとめなければならないと思うようになりました。 5世紀頃、中国に使者を送らなくなると、倭国と中国の関係が途切れました。やがて、倭国は中国中心の考え方から抜け出して、新羅と新しい関係を作ろうとしました。倭国は新羅に3回(600年・602年・623年)も軍隊を送りました。特に、600年は新羅遠征軍と遣隋使の両方を送りました。 隋書東夷伝倭国条は第1回<span style="color:#f29100">'''遣隋使'''</span>について記されています。第1回遣隋使を隋へ送ると、隋の文帝から日本の政治と生活の仕方について厳しい意見がありました。それまで、倭国は朝鮮半島の国家と仲良くなるために、力の強さだけを見せればいいと考えていました。しかし、この厳しい意見から他の国と事前に話し合いをするようになりました。しかし、第1回遣隋使は日本の歴史書『日本書紀』に全く書かれていません。 倭国は隋と関わるうちに『政治の仕組みがまだまだ整っていないかも…』と気づきました。そこで、隋と仲良く付き合うために、厩戸王と蘇我馬子が中心になって冠位十二階と憲法十七条を作りました。 {| style="border:2px solid #F4ADA3;width:100%" cellspacing="0" ! style="background: #F4ADA3" |'''冠位十二階''' |- | style="padding:5px" |中国や朝鮮のやり方をお手本にして、冠位十二階を603年に作りました。冠位十二階を説明すると、その人の良心(徳・仁・礼・信義・智)を評価します。そして、この評価を十二段階に分けて、その段階に合わせて六色の冠(紫・青・赤・黄・白・黒)を被るようになります。冠位十二階は生まれた時からではなく、個人の才能と個人の頑張り具合で評価されるようになっています。しかも一代限りなので、頑張れば冠位も上がりました。鞍作鳥・秦河勝・小野妹子は出身とか関係なく、自分の才能と自分の頑張りで冠位を貰えました。しかし、蘇我氏・王族・地方の豪族は冠位十二階の対象に含まれていません。 |- ! style="background: #F4ADA3" |'''憲法十七条''' |- | style="padding:5px" |憲法十七条は朝廷の仕事をするようになったら、どのような心構えで働けばいいのかについて記されています。憲法十七条は中国の影響を大きく受けており、儒教・仏教の考え方を上手く取り入れて604年に定められました。また、隋に対して倭国の立場や意見をはっきり主張するために、憲法十七条を定めていました。この後、日本の政治の仕組みも少しずつ整いました。しかし、どこまで憲法十七条を守っていたのかまでは分かりません。憲法十七条の内容は次の通りです。 # みんな仲良く暮らしなさい。 # お坊さんを大切にしなさい。 # 天皇の言葉をしっかり聞きなさい。 # 礼儀作法を守りなさい。 # 裁判は公平に裁きなさい。 # いい人は褒めて、悪い人はしっかり注意しなさい。 # 自分の役割をきちんと果たしなさい。 # 早めに行って遅くまでしっかり働きなさい。 # 信頼関係を持ちなさい。 # 腹を立ててはいけません。 # 出来る役人は褒め、出来ない役人は注意しなさい。 # 国司・国造は、庶民から余計な税金を取ってはいけません。 # 役人は自分の仕事をしっかり理解しなさい。 # 他の人と比べてはいけません。 # 自分勝手にしないで、思いやりの心を持ちなさい。 # 庶民を引っ張っていく時は、周りの状況もしっかり見ながら進めなさい。 # 自分だけで決めないで、みんなで様々な意見を聞いてから決めなさい。 憲法十七条については、[[高等学校言語文化/日本書紀#十七箇條憲法]]も参照してください。 |} 607年、<span style="color:#f29100">'''小野妹子'''</span>は第2次遣隋使の代表として隋に渡りました。小野妹子の外交は隋に従うような外交でした。なぜなら、「日出づる処の天子、書を日没する処の天子に致す」と隋の'''煬帝'''に伝えると、煬帝が怒ったからです。この内容は中国の歴史書(隋書倭国伝)に記されています。第2回遣隋使を隋へ送ってから、倭国の外交方法が大きく変わりました。これまでの卑弥呼・讃・珍・済・興・武の時代は、中国の皇帝に「倭国の王様として認めて下さい。」とお願いしました。しかし、遣隋使はそのようなお願いを外交で全くしていません。当時、朝鮮半島の百済と新羅は隋の皇帝のいいなりになっていました。だから、倭国は遣隋使を送って、隋と同じような立場になりたいと考えました。 このような倭国の考え方は煬帝に伝わらず、勘違いをしています。隋の煬帝は「高句麗と倭国が手を組むと、自分の国が困るかもしれない。」と心配になりました。その後、隋の煬帝は'''裴世清'''を使者として倭国に送り、隋国と倭国の関係を保とうとしました。 608年、小野妹子は第3次遣隋使の代表として隋に渡りました。お詫びとして、倭国の手紙を隋国に送っています。二度と失礼にならないように、手紙の内容を「東の天皇が西の皇帝に申し上げる。」と記しています。 第3次遣隋使の中でも<span style="color:#f29100">'''旻・高向玄理・南淵請安'''</span>は、中国史の大きな転換点を実際に見ています。旻・高向玄理・南淵請安は日本に帰ってきてから、中大兄皇子・中臣鎌足・蘇我入鹿に中国の新しい知識を伝えました。やがて、中国の新しい知識が大化の改新につながるようになりました。なお、犬上御田鍬は第4次遣隋使の代表として隋に渡っています。 ==7世紀の東アジアと倭国== 最初に、中国の歴史を説明します。618年、隋王朝が終わり、<span style="color:#f29100">'''唐王朝'''</span>に変わりました。唐王朝は、土地を公平に分けたり、税金の仕組みを整えたりして国をまとめました。太宗皇帝の頃、唐王朝が最も栄えました('''貞観の治''')。次に、朝鮮半島の歴史を説明します。641年、百済の義慈王は権力を奪いました。やがて、百済の義慈王は新羅へ翌年から攻めました。642年、高句麗宰相の泉蓋蘇文が権力を奪うために、国王・貴族を倒します。その後、百済と手を組んで、新羅の領土を狙うようになりました。こうして、新羅は四面楚歌の状態になったので、唐に助けを求めました。しかし、唐側は「助けてほしいなら、女王を変えてください。」と条件を出します。647年、新羅の中でも女王を交代するのか交代しないのかを巡って争いが始まりました。太宗皇帝は、644年から朝鮮半島の高句麗へ攻めました(駐蹕山の戦い<ref>この名称の記述も日本史探究の全教科書・全参考書・資料集に記載されていません。</ref>)。この戦いから、東アジア全体が大きく変わります。倭国でも、「大きな戦いが朝鮮半島で起きているから、このままだと悪い方向に向かうようになるかもしれない。」と考えるようになりました。そこで、これまでの政治が大きく変わるようになりました。 父親の<span style="color:#f29100">'''蘇我蝦夷'''</span>は祖父の蘇我馬子から大臣の役目を引き継いで、少しずつ大きな力を持つようになります。舒明天皇~<span style="color:#f29100">'''皇極天皇'''</span>の時代を迎えると、息子の<span style="color:#f29100">'''蘇我入鹿'''</span>は父親の蘇我蝦夷よりもさらに大きな力を持つようになりました。643年、蘇我入鹿は'''山背大兄王'''(厩戸王の息子)とその家族を殺しました。蘇我氏は高句麗のやり方と同じように蘇我氏寄りの天皇を選んで、政治の実権を握ろうとしました。これに対して、<span style="color:#f29100">'''中大兄皇子・中臣鎌足'''</span>・蘇我倉山田石川麻呂は「このまま、蘇我氏が政治の実権を握ると問題になるかもしれない。」と考えるようになります。645年7月10日、飛鳥板蓋宮で蘇我入鹿を殺しました。翌日、父親の蘇我蝦夷も追い詰められて自殺しました(<span style="color:#f29100">'''[[w:乙巳の変|乙巳の変]]'''</span>)。この後、朝廷が国をまとめていくようになります。 == 資料出所 == * 平雅行、横田冬彦ほか編著『[https://www.jikkyo.co.jp/material/dbook/R5_chireki_20220510/?pNo=6 日本史探究]』実教出版株式会社 2023年 * 佐藤信、五味文彦ほか編著『[https://new-textbook.yamakawa.co.jp/j-history/ 詳説日本史探究]』株式会社山川出版社 2023年 * 渡邊晃宏ほか編著『[https://ten.tokyo-shoseki.co.jp/text/hs/shakai/16596/ 日本史探究]』東京書籍株式会社 2023年 * 山中裕典著'''『'''[https://www.amazon.co.jp/改訂版-大学入学共通テスト-歴史総合、日本史探究の点数が面白いほどとれる本-0からはじめて100までねらえる-山中/dp/4046062371 改訂版 大学入学共通テスト 歴史総合、日本史探究の点数が面白いほどとれる本]'''』'''株式会社KADOKAWA 2024年 * 佐藤信、五味文彦ほか編著『[https://www.amazon.co.jp/%E8%A9%B3%E8%AA%AC%E6%97%A5%E6%9C%AC%E5%8F%B2%E7%A0%94%E7%A9%B6-%E4%BD%90%E8%97%A4-%E4%BF%A1/dp/4634010739/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2JVCFQ6ZSAM4W&keywords=%E6%97%A5%E6%9C%AC%E5%8F%B2%E7%A0%94%E7%A9%B6&qid=1673018227&sprefix=%E6%97%A5%E6%9C%AC%E5%8F%B2%E7%A0%94%E7%A9%B6%2Caps%2C229&sr=8-1 詳説日本史研究]』株式会社山川出版社 2017年 * 河合敦著『[https://www.amazon.co.jp/%E4%B8%96%E7%95%8C%E4%B8%80%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84-%E6%B2%B3%E5%90%88%E6%95%A6%E3%81%AE-%E6%97%A5%E6%9C%AC%E5%8F%B2B-%E3%80%8C%E5%8E%9F%E5%A7%8B-%E9%8E%8C%E5%80%89%E3%80%8D%E3%81%AE%E7%89%B9%E5%88%A5%E8%AC%9B%E5%BA%A7-%E6%B2%B3%E5%90%88/dp/404600794X/ref=d_pd_sbs_sccl_2_1/355-7112149-5713814?pd_rd_w=H8Pxa&content-id=amzn1.sym.820591ed-a555-4556-9bf6-5ebd5493c69e&pf_rd_p=820591ed-a555-4556-9bf6-5ebd5493c69e&pf_rd_r=ZWG9FNM6AD22NFF5WK2G&pd_rd_wg=scszo&pd_rd_r=8c1e9eda-f944-4c80-9e4e-7e35244ab2a6&pd_rd_i=404600794X&psc=1 世界一わかりやすい河合敦の日本史B[原始~鎌倉]の特別講座]』株式会社KADOKAWA 2014年(絶版本) == ここに注意!! == [[カテゴリ:高等学校日本史探究]] 0h2cyy3z4a9e6oysvzs5waofd46nnyh 高等学校言語文化/日本書紀 0 43432 264167 264125 2024-11-25T03:51:21Z ~2024-18378 85063 /* 白文 (正字) */ 264167 wikitext text/x-wiki {{Pathnav|高等学校の学習|高等学校国語|高等学校言語文化|frame=1}} ==十七箇條憲法== {{Wikisource|日本書紀}} {{wikisource|十七条憲法}} ===白文 (正字)=== :夏四月丙寅朔戊辰、皇太子親肇作憲法十七條。 :一曰。以和爲貴、無忤爲宗。人皆有黨亦少達󠄁者、是以、或不順君父乍違󠄂于隣󠄂里。然、上和下睦諧於論事則事理自通󠄁、何事不成。 :二曰。篤敬三寶。三寶者佛法僧也、則四生之終歸萬國之極宗。何世何人、非貴是法。人鮮尤惡、能敎從之。其不歸三寶、何以直枉。 :三曰。承詔必謹。君則天之、臣則地之。天覆地載、四時順行萬氣得通󠄁、地慾覆天則致壞耳。是以、君言臣承、上行下靡。故承詔必愼、不謹自敗。 :四曰。群卿百寮、以禮爲本。其治民之本要在乎禮。上不禮、而下非齊、下無禮、以必有罪。是以、群臣有禮、位次不亂、百姓有禮、國家自治。 :五曰。絶餮棄欲、明辨訴訟。其百姓之訟一日千事、一日尚爾、況乎累歲。頃治訟者、得利爲常、見賄聽讞。便有財之訟、如石投水、乏者之訴、似水投石。是以、貧民則不知所由、臣道亦於焉闕。 :六曰。懲惡勸善、古之良典。是以、无匿人善、見惡必匡。其諂詐者則爲覆國家之利器、爲絶人民之鋒劒。亦、侫媚者、對上則好說下過󠄁、逢下則誹謗上失。其如此人、皆无忠於君、无仁於民、是大亂之本也。 :七曰。人各有任、掌宜不濫。其賢哲任官、頌音則起󠄁、姧者有官、禍亂則繁。世少生知、剋念作聖。事無大少、得人必治、時無急緩、遇󠄁賢自寛。因此、國家永久社稷勿危。故古聖王、爲官以求人、爲人不求官。 :八曰。群卿百寮、早朝晏退󠄁。公事靡盬、終日難盡。是以、遲朝不逮󠄁于急、早退󠄁必事不盡。 :九曰。信是義本、毎事有信。其善惡成敗、要在于信。群臣共信、何事不成。群臣无信、萬事悉敗。 :十曰。絶忿、棄瞋、不怒人違󠄂。人皆有心、心各有執、彼是則我非、我是則彼非。我必非聖、彼必非愚、共是凡夫耳。是非之理、詎能可定。相共賢愚、如鐶无端。是以、彼人雖瞋、還󠄁恐我失。我獨雖得、從衆同舉。 :十一曰。明察功過󠄁、賞罰必當。日者賞不在功、罰不在罪。執事群卿、宜明賞罰。 :十二曰。國司・國造󠄁、勿斂百姓。國非二君、民無兩主。率土兆民、以王爲主。所任官司、皆是王臣。何敢與公、賦斂百姓。 :十三曰。諸任官者、同知職掌。或病或使、有闕於事。然、得知之日、和如曾識。其以非與聞、勿防公務。 :十四曰。群臣百寮、無有嫉妬。我既嫉人、人亦嫉我。嫉妬之患、不知其極。所以、智勝於己則不悅、才優於己則嫉妬。是以、五百之乃今遇󠄁賢、千載以難待一聖。其不得賢聖、何以治國。 :十五曰。背私嚮󠄁公、是臣之道󠄁矣。凡人有私必有恨、有憾必非同、非同則以私妨公、憾起󠄁則違󠄂制害法。故初章云、上下和諧、其亦是情歟。 :十六曰。使民以時、古之良典。故、冬月有閒󠄁以可使民、從春至秋農桑之節、不可使民。其不農何食、不桑何服。 :十七曰。夫事不可獨斷、必與衆宜論。少事是輕、不可必衆。唯逮󠄁論大事、若疑有失。故與衆相辨、辭則得理。 (日本書紀巻第廿二 推古天皇) <!-->入力環境の関係で正体字になっていない箇所があります。<--> ===書き下し (新字)=== :夏{{ruby|四月|うづき}}の{{ruby|丙寅|へいいん}}の{{ruby|朔|さく}}にして{{ruby|戊辰|ぼしん}}に、{{ruby|皇太子|ひつぎのみこ}}{{ruby|親|みずか}}ら{{ruby|肇|はじめ}}て憲法十七条を作りたまふ。 :{{ruby|一|いつ}}に{{ruby|曰|い}}はく、「和を{{ruby|以|もつ}}て{{ruby|貴|たふと}}しと{{ruby|為|な}}し、{{ruby|忤|さか}}ふること無きを{{ruby|宗|むね}}と為せ。人{{ruby|皆|みな}}{{ruby|党|たむら}}有り{{ruby|亦|また}}{{ruby|達|さと}}る者少なし。{{ruby|是|これ}}を以て、{{ruby|或|あ}}るいは{{ruby|君父|くんぷ}}に{{ruby|順|したが}}はず{{ruby|乍|あ}}るいは{{ruby|隣里|りんり}}に{{ruby|違|たが}}ふ。{{ruby|然|しか}}れども、{{ruby|上|かみ}}{{ruby|和|やわら}}ぎ{{ruby|下|しも}}{{ruby|睦|むつ}}びて事を{{ruby|論|あげつら}}ふことに{{ruby|諧|かな}}ふときは、{{ruby|則|すなは}}ち{{ruby|事理|じり}}{{ruby|自|おの}}づからに通ふ。何事か成らざらん。」と。 :二に曰はく、「{{ruby|篤|あつ}}く{{ruby|三宝|さんぼう}}を敬へ。三宝は仏法僧なり。則ち{{ruby|四生|ししやう}}の{{ruby|終帰|しうき}}、万国の{{ruby|極宗|きょくそう}}なり。{{ruby|何|いづれ}}の世、何の人か{{ruby|是|こ}}の{{ruby|法|のり}}を貴ばざる。人{{ruby|尤|はなは}}だ悪しきもの{{ruby|鮮|すくな}}し。{{Ruby|能|よ}}く教ふるをもて従ふ。{{ruby|其|そ}}れ三宝に{{ruby|帰|き}}せずんば、何を以てか{{ruby|枉|まが}}れるを直さむ。」と。 :三に曰はく、「{{ruby|詔|みことのり}}を{{ruby|承|う}}けては必ず{{ruby|謹|つつし}}め。君をば{{ruby|天|あめ}}とす。{{ruby|臣|やつこら}}をば{{ruby|地|つち}}とす。天{{ruby|覆|おほ}}ひ地{{ruby|載|の}}す。四時{{ruby|順|よ}}り行き、{{ruby|方気|ほうき}}{{ruby|通|かよ}}ふを得。地天を{{ruby|覆|くつがへ}}さんと欲するときは、則ち{{ruby|壊|やぶれ}}を致さむのみ。是を以て君{{ruby|言|のたま}}ふときは臣{{ruby|承|うけたまは}}る。上行へば下{{ruby|靡|なび}}く。故に{{ruby|詔|みことのり}}を{{ruby|承|う}}けては必ず慎め。謹まざれば自らに敗れむ。」と。 :四に曰はく、「{{ruby|群卿|まちぎみたち}}{{ruby|百寮|つかさづかさ}}、礼を以て{{ruby|本|もと}}と{{ruby|為|せ}}よ。其れ民を治むる本は、要は礼に在り。上礼無きときは下{{ruby|斉|ととのほ}}らず。下礼無きときは以て必ず罪有り。是を以て君臣礼有るときは、位の{{ruby|次|つぎて}}乱れず。百姓礼有るときは、{{ruby|国家|あめのした}}自ら治まる。」と。 :五に曰はく、「{{ruby|饗|あぢはひのむさぼり}}を絶ち、欲を棄て、{{ruby|明|さや}}に{{ruby|訴訟|うつたへ}}を{{ruby|弁|わきま}}へよ。其れ百姓の{{ruby|訟|うつたへ}}は一日に千事あり。一日すら尚{{ruby|爾|しか}}り。{{ruby|況|いは}}んや歳を{{ruby|累|かさ}}ぬるをや。{{ruby|須|すべか}}らく訟を治むべき者、利を得て常と為し、{{ruby|賄|まひなひ}}を見て{{ruby|讞|ことわり}}を{{ruby|聴|ゆる}}さば、{{ruby|便|すなは}}ち{{ruby|財|たから}}有るものの訟は、石をもて水に投ぐるが如し。乏しき{{ruby|者|ひと}}の訟は、水をもて石に投ぐるに似たり。是を以て貧しき民、則ち{{ruby|所由|よるところ}}を知らず。臣道亦{{ruby|焉|ここ}}に{{ruby|於|おい}}て{{ruby|闕|か}}けむ。」と。 :六に曰はく、「悪を{{ruby|懲|こら}}し善を{{ruby|勧|すす}}むるは、{{ruby|古|いにしへ}}の{{ruby|良|よ}}き{{ruby|典|のり}}なり。是を以て人の善を{{ruby|慝|かく}}すこと無く、悪を見ては必ず{{ruby|匡|ただ}}せ。{{ruby|若|も}}し{{ruby|諂|へつら}}ひ{{ruby|詐|いつは}}る者は、則ち国家を覆すの利器たり。人民を絶つ{{ruby|鋒剣|ほうけん}}たり。亦{{ruby|侫媚者|かたましくこぶるもの}}は、上に{{ruby|対|むか}}ひては則ち好みて下の{{ruby|過|あやまち}}を説き、下に{{ruby|逢|あひ}}ては則ち上の{{ruby|失|あやまち}}を{{ruby|誹謗|そし}}る。其れ{{ruby|如此|これら}}の人は、皆君に{{ruby|忠|いさをしきこと}}{{ruby|无|な}}く民に{{ruby|仁|めぐみ}}無し。是れ大きなる{{ruby|乱|みだれ}}の本なり。」と。 :七に曰はく、「人{{ruby|各|おのおの}}{{ruby|任掌|よさしつかさど}}ること有り。{{ruby|宜|よろ}}しく{{ruby|濫|みだ}}れざるべし。其れ{{ruby|賢哲|けんてつ}}に官を{{ruby|任|よさ}}すときは、{{ruby|頌音|ほむるこゑ}}則ち起り、{{ruby|奸者|かんじゃ}}に官を{{ruby|有|たも}}つときは、{{ruby|禍乱|からん}}則ち{{ruby|繁|しげ}}し。世に{{ruby|生|うま}}れながら知ること少けれども、{{ruby|尅|よ}}く{{ruby|念|おも}}ひて{{ruby|聖|ひじり}}を{{ruby|作|な}}せ。事大小と無く、人を得て必ず治む。時{{ruby|急緩|きゅうかん}}と無く、賢に{{ruby|遇|あ}}ひて{{ruby|自|おのづか}}ら{{ruby|寛|ゆたか}}なり。{{ruby|此|これ}}に{{ruby|因|より}}て国家永久、{{ruby|社稷|しやしよく}}危きこと無し。{{ruby|故|か}}れ古の聖王、官の為に以て人を求む、人の為に官を求めたまはず。」と。 :八に曰はく、「群卿百寮、早く{{ruby|朝|まゐ}}り{{ruby|晏|おそ}}く{{ruby|退|まか}}でよ。公事{{ruby|監|いとま}}{{ruby|靡|な}}く、{{ruby|終日|ひねもす}}にも{{ruby|尽|つく}}し{{ruby|難|がた}}し。是を以て遅く{{ruby|朝|まゐ}}れば急に{{ruby|逮|およ}}ばず。早く{{ruby|退|まか}}れば必ず事{{ruby|尽|つく}}さず。」と。 :九に曰はく、「信は是れ義の本なり。事{{ruby|毎|ごと}}に信有れ。若し善悪成敗、要は信に在り。君臣共に信あるときは何事か成らざらむ。」と。 :十に曰はく、「{{ruby|忿|いかり}}を{{ruby|絶|た}}ち{{ruby|瞋|いかり}}を{{ruby|棄|す}}て、人の{{ruby|違|たが}}ふことを怒らざれ。人皆心有り。心各{{ruby|執|と}}ること有り。彼{{ruby|是|ぜ}}なれば{{ruby|吾|われ}}は非なり、我是なれば則ち彼非なり。我必ずしも聖に非ず。彼必ずしも愚に非ず。共に是れ{{ruby|凡夫|ぼんぶ}}のみ。是非の理、誰か能く定むべき。{{ruby|相|あい}}共に賢愚、{{ruby|鐶|みみがね}}の端{{ruby|无|な}}きが如し。是を以て彼の人は{{ruby|瞋|いか}}ると{{ruby|雖|いえど}}も、{{ruby|還|かへつ}}て我が{{ruby|失|あやまち}}を{{ruby|恐|おそ}}る。我独り得たりと雖も、衆に従ひて同く{{ruby|挙|おこな}}へ。」と。 :十一に曰はく、「功過を{{ruby|明察|あきらか}}にして、賞罰必ず当てよ。{{ruby|日者|このごろ}}、賞功に在らず、罰{{ruby|罰|つみ}}に在らず。事を執れる群卿、宜しく賞罰を{{ruby|明|さら}}にすべし。」と。 :十二に曰はく、「{{ruby|国司|みこともち}}{{ruby|国造|くにのみやつこ}}、百姓に{{ruby|歛|をさめと}}ること{{ruby|勿|なか}}れ、国に{{ruby|二君|ふたりのきみ}}{{ruby|非|な}}く、民に{{ruby|両主|ふたりのぬし}}無し、{{ruby|率土|そつと}}の兆民、{{ruby|王|きみ}}を以て{{ruby|主|しゆ}}と為す。{{ruby|所任官司|よさせるつかさみこともち}}は皆是れ王臣なり。何ぞ{{ruby|敢|あへ}}て{{ruby|公|おほやけ}}と{{ruby|与|とも}}に百姓に{{ruby|賦斂|をさめと}}らむ。」と。 :十三に曰はく、「{{ruby|諸|もろもろ}}の{{ruby|任官者|よさせるつかさびと}}、同じく{{ruby|職掌|つかさごと}}を知れ。或るいは{{ruby|病|やまひ}}し或るいは{{ruby|使|つかひ}}して、事に{{ruby|闕|おこた}}ることあり。然れども知るを得ての日には、{{ruby|和|あまな}}ふこと{{ruby|曾|さき}}より{{ruby|識|し}}るが{{ruby|如|ごと}}くせよ。其れ{{ruby|与|あづか}}り{{ruby|聞|き}}くに{{ruby|非|あら}}ざるを以て、{{ruby|公務|まつりごと}}を{{ruby|防|さまた}}ぐること勿れ。」と。 :十四に曰はく、「群卿百寮、{{ruby|嫉|そね}}み{{ruby|妬|ねた}}むこと有る{{ruby|無|なか}}れ。我既に人を嫉めば、人亦我を嫉む。{{ruby|嫉妬|しつと}}の患、其の{{ruby|極|きま}}りを知らず。{{ruby|所以|ゆゑ}}に智{{ruby|己|おの}}れに{{ruby|勝|まさ}}れば、則ち{{ruby|悦|よろこ}}ばず。才己れに{{ruby|優|まさ}}れば、則ち{{ruby|嫉妬|ねた}}む。是を以て{{ruby|五百|いほとせ}}にして{{ruby|乃|すなわ}}ち{{ruby|賢|さかしびと}}に{{ruby|遇|あ}}はしむれども、{{ruby|千載|ちとせ}}にして以て一聖を待つこと難し。其れ聖賢を得ざれば、何を以てか国を治めむ。」と。 :十五に曰はく、「私を背いて公に向くは、是れ臣の道なり。{{ruby|凡|およ}}そ{{ruby|夫人|ひとびと}}私有れば必ず{{ruby|恨|うらみ}}有り、{{ruby|憾|うらみ}}有れば必ず{{ruby|同|ととのほ}}らず。同らざれば則ち私を以て公を妨ぐ。{{ruby|憾|うらみ}}起れば則ち{{ruby|制|ことわり}}に違ひ{{ruby|法|のり}}を{{ruby|害|やぶ}}る。故に初の{{ruby|章|くだり}}に云へり、上下{{ruby|和諧|あまなひととのほ}}れと。其れ亦{{ruby|是|こ}}の{{ruby|情|こころ}}なる{{ruby|歟|かな}}。」と。 :十六に曰はく、「民を使ふに時を以てするは{{ruby|古|いにしへ}}の{{ruby|良典|よきのり}}なり。{{ruby|故|か}}れ冬の月には{{ruby|間|いとま}}有り、以て民を使ふべし。春{{ruby|従|よ}}り秋に至つては、{{ruby|農桑|たつくりこがひ}}の{{ruby|節|とき}}なり、民を使ふべからず。其れ{{ruby|農|たつく}}らずば何を以てか食はむ。{{ruby|桑|こが}}ひせずば何をか{{ruby|服|き}}む。」と。 :十七に曰はく、「{{ruby|夫|そ}}れ事は独り{{ruby|断|さだ}}むべからず。必ず{{ruby|衆|もろもろ}}と{{ruby|与|とも}}に宜しく{{ruby|論|あげつら}}ふべし。少事は是れ軽し、必ずしも{{ruby|衆|もろもろ}}とすべからず。{{ruby|唯|ただ}}大事を{{ruby|論|あげつら}}はんに{{ruby|逮|およ}}びては、若し{{ruby|失|あやまち}}有らんことを疑ふ。故に衆と{{ruby|与|とも}}に相{{ruby|弁|わきま}}ふるときは、{{ruby|辞|こと}}則ち理を{{ruby|得|う}}。」と。 ====注釈==== *丙寅:干支の「ひのえとら」。 *朔:月初めの「{{Ruby|一日|ついたち}}」のこと。ここでは、四月一日の干支が「丙寅」であったことを示す。 *戊辰:干支の「つちのえたつ」。「ひのえとら」から数えて3つであることから、ここでは前の部分と合わせて「四月三日」を表す。 *皇太子:{{Ruby|厩戸王|うまやどおう}}。第三十三代推古天皇の同母兄である第三十一代用明天皇の皇子。西暦574年〜622年。「{{Ruby|聖德太子|しょうとくたいし}}」や「{{Ruby|豐聰耳皇子|とよとみみのみこ}}」の名で知られるが、実在を疑問視する声があるほか、十七ヶ条憲法の作者ではないとする説もある。 *和を以つて貴しと為し:『論語』の「禮之用和爲貴(礼の用は和を貴しと為す。)」を踏まえた表現。「調和を尊ぶ」という意味。 *忤ふること:叛逆の意。 *党:徒党を組むこと。 *達る者:賢者。 *隣里:近隣。郷里。 *違ふ:争う。 *睦ぶ:懇意にする。 *論ふ:論じる。 *諧ふ:合意に至る。 *自づから:自然と。 *四生:胎生、卵生、湿生、化生の総称。全ての生物を指す。 <!-->注釈はまだ不十分なので、どんどん追加お願いします。<--> ===現代語訳=== :(西暦604年陰暦の)夏の四月三日に、皇太子はご自身で初めて憲法十七条をお作りになった。 :一に言う。「調和を尊び、逆らい背くことがないようにせよ。人は皆徒党を組むが、賢者は少ない。故に、ある者は主君や父に従わず、ある者は近隣の人と争う。しかし、上下の者が和み睦み合い、事を論じて合意に至るのであれば、事の道理は自然と通る。何事であれ、成就しないものはない。」と。 :二に言う。「{{ruby|篤|あつ}}く仏教を信仰せよ。仏教はあらゆる生きものの最後に帰するところ、全ての国々の仰ぐ究極のよりどころである。どのような時代のどのような人々でも、この法をあがめないことがあろうか。いや、ない。心底からの悪人は稀であり、よく教え諭せば必ず従わせることができる。仏教に帰依しないで、どうして{{ruby|邪|よこしま}}な心を正すことができよう。いや、できない。」と。 :三に言う。「天皇の命を受けたら、必ずそれに従え。例えるならば、君は天、臣は地。天が万物を覆い、地が万物を載せる。それによって四季は規則正しく移りゆき、万物を活動させる。もし地が天を覆おうとするなら、この秩序は破壊されてしまう。そのように、君主の言に臣下は必ず承服し、上の者が行えば下の者はそれに従うのである。故に、天皇の命を受けたら必ず従え。もし従わなければ、結局は自滅するだろう。」と。 :四に言う。「群卿や百寮は、みな礼法を物事の基本とせよ。民を治める肝要は、この礼法にある。上の者の行いが礼法に{{ruby|適|かな}}わなければ下の者の秩序は乱れ、下の者に礼法が失われれば罪を犯す者が出てくる。群臣に礼法が保たれていれば序列も乱れず、百姓に礼法が保たれていれば国家は自然と治まるものである。」と。 :五に言う。「食に{{ruby|驕|おご}}ることをやめ、財物への欲望を棄てて、訴訟を公明に裁け。百姓の訴えは一日に千件にも及ぼう。一日でもそうなのだから、年がたてば尚更だ。近ごろ、訴訟を扱う者は私利を得るのを当然と思い、賄賂を受けてからその申し立てを聞いているようだ。財産のある者の訴えは石を水に投げ込むように必ず聞き届けられるが、貧乏人の訴えは水を石に投げかけるように、手ごたえもなく{{ruby|撥|は}}ねつけられてしまう。これでは貧しい民はどうしてよいかわからず、臣としての役人のなすべき道も見失われることだろう。」と。 :六に言う。「悪を{{ruby|懲|こ}}らしめ善を{{ruby|勧|すす}}めるということは、古からの教えである。それゆえ、人の善行は隠すことなく知らせ、悪事は必ず改めさせよ。人に{{ruby|阿|おもね}}り、、人を{{ruby|欺|あざむ}}く者は国家を転覆させる利器ともなり、人民を滅ぼす鋭い剣ともなる者だ。また、{{ruby|媚|こ}}び{{ruby|諛|へつら}}う者は、上の者には好んで下の者の過失を告げ口し、下の者に会えば上の者を非難する。このような人々はみな君に対して忠義の心がなく、民に対しては仁愛の心がない。大きな乱れの原因となることだ。」と。 :七に言う。「人にはそれぞれの任務がある。おのおの領分を守り、権限を濫用しないようにせよ。賢明な人が官にあれば政治を称賛する声が{{ruby|忽|たちま}}ちに起こるが、邪な心をもつ者が官にあれば政治の乱れが忽ちに頻発する。世間には生まれながら物事を弁えている人は少ない。よく思慮を働かせ、努力してこそ聖人となる。物事はどんな重大なことも些細なことも、適任者を得てこそ成し遂げられる。時の流れが速かろうと遅かろうと、賢明な人にあったときに自然と解決する。その結果、国家は永久で、君主の地位も安泰となる。だから古の聖王は、官のために適当な人材を集めたのであり、人のために官を設けるようなことはしなかったのだ。」と。 :八に言う。「群卿や百寮は、朝は早く出仕し、夕は遅く退出するようにせよ。公務はいいかげんにできないものであり、一日掛けてもも全てを終えることは難しい。故に、遅く出仕したのでは緊急の用事に間に合わないし、早く退出したのでは事務をし残してしまう。」と。 :九に言う。「信は人の行うべき道の源である。何事をなすにも真心を込めよ。事の良し悪し、成否の{{ruby|要|かなめ}}はこの信にある。群臣がみな真心をもって事にあたるなら、どのようなことでも成功するだろう。しかし真心がなかったら、すべてが失敗するだろう。」と。 :十に言う。「心に憤りを抱いたり、それを顔に表したりすることをやめ、人が自分と違ったことをしても、それを怒らないようにせよ。人の心は様々でお互いに相譲れないものをもっている。相手が良いと思うことを自分は良くないと思ったり、自分が良いことだと思っても相手がそれを良くないと思うことがある。自分が聖人で相手が愚人だと決まっているわけではない。ともに凡夫なのだ。是非の理を誰が定めることができるのか。いや、できない。お互いに賢人でもあり、愚人でもあるのは、端のない輪っかのようなものだ。それゆえ、相手が怒ったら、むしろ自分が過失を犯しているのではないかと反省せよ。自分ひとりが、そのほうが正しいと思っても、衆人の意見を尊重し、その行うところに従うがよい。」と。 :十一に言う。「官人の功績や過失をはっきりとみて、それに応じた賞罰を行うようにせよ。近頃は、功績に関係なく賞を与えたり、罪がないのに罰を加えたりしていることがある。政務に{{ruby|携|たずさ}}わる群卿は、賞罰を正しくはっきりと行うようにすべきである。」と。 :十二に言う。「国司や国造は、百姓から税を{{ruby|貧|むさぼ}}り取らぬようにせよ。国に二人の君はなく、民に二人の主はない。この国土の{{ruby|遍|あまね}}く人々は、みな天皇を主としているのだ。国政を委ねられている官司の人々は、みな天皇の臣なのである。どうして公の事以外に、百姓から税をむさぼり取って良いであろうか。いや、良くない。」と。 :十三に言う。「それぞれの官司に任じられた者は官司の職務内容を熟知せよ。病気や使役のために事務を{{ruby|執|と}}らないことがあっても、職務についたなら以前から従事しているかのようにその職務に和していくようにせよ。そのようなことに自分は関知しないといって、公務を妨げるようなことがあってはならない。」と。 :十四に言う。「群臣や百寮は人を妬み嫉むことがあってはならない。自分が人に嫉妬すれば、人もまた自分に嫉妬する。そのような嫉妬の憂いは際限がない。故に、人の知識が自分より勝っていることを喜ばず、才能が自分より優れていることを妬む。そんなことでは五百年たって一人の賢人に出会うことも、千年たって一人の聖人が現れることも難しいだろう。賢人や聖人を得なくては、何によって国を治めたらよいであろうか。」と。 :十五に言う。「私心を捨てて公の事を行うのが臣たる者の道である。人に私心があれば他人に恨みの気持ちを起こさせる。恨みの気持ちがあれば人々の気持ちは整わない。人々の気持ちが整わないことは私心をもって公務を妨げることであり、恨みの気持ちが起これば制度に違反し法律を犯すことになる。第一条で『上下の人々が和み睦み合い、協調するように』といったのもこの気持ちからである。」と。 :十六に言う。「民を使役するのに時節を考えよとは、古からのよるべき教えである。冬の月の間に余暇があれば民を使役せよ。春から夏にかけては農耕や養蚕の時節であるから、民を使役してはならない。農耕をしなかったら何を食べればよいのか。養蚕をしなかったら何を着ればよいのか。」と。 :十七に言う。「物事は独断で行ってはならない。必ずみなと論じあうようにせよ。些細なことは必ずしもみなに相談しなくてもよいが、大事を議する場合には誤った判断をするかも知れない。人々と検討しあえば、話し合いによって道理に{{ruby|適|かな}}ったやり方を知りうる。」と。 ===鑑賞=== 『日本書紀』は、奈良時代に成立した日本最初の正史である。六国史の一番目に数えられ、第四十代天武天皇の発意で舎人親王らにより養老四年(西暦720年)に成立したとされる。全30巻からなり、原初の神の誕生から第四十一代持統天皇の時代までを漢文の編年体で記す。歴代天皇の系譜(帝記)や、その当時に口承されていた神話・伝説を体系化して記録した。独自の文字を持たなかった(とされる)当時の日本人は、漢語で書かれた文章(漢文)を理解し、自らの用いる言語(上代日本語)をそれに対応させようとした。そのため、日本独自の漢文が生まれ始めた。この『十七箇條憲法』は『日本書紀』の第二十二巻『推古天皇』に収められている。現代では「憲法十七条」として知られているこの憲法は、日本初の成文法であるといわれている。[[高等学校日本史探究]]の飛鳥〜奈良時代も参照。 [[カテゴリ:高等学校教育 国語]] [[カテゴリ:日本語]] [[カテゴリ:漢文]] ercavxbgvyjs5aee9d52lazriv447ui Laravel 0 43433 264137 2024-11-24T22:06:40Z Ef3 694 Laravelは、PHPのモダンなウェブアプリケーションフレームワークです。エレガントな構文と強力な機能を提供し、開発者の生産性を最大限に高めることができます。 264137 wikitext text/x-wiki == はじめに == '''Laravel'''は、[[PHP]]のモダンな[[ウェブアプリケーションフレームワーク]]です。エレガントな構文と強力な機能を提供し、開発者の生産性を最大限に高めることができます。 == インストール == === Composerを使用したインストール === 新しいLaravelプロジェクトを作成するには、以下の`Composer`コマンドを実行します: :<syntaxhighlight lang=shell-session copy> composer create-project laravel/laravel example-app cd example-app php artisan serve </syntaxhighlight> == ルーティング == === 基本的なルーティング === routes/web.phpでルートを定義します: :<syntaxhighlight lang=php copy> use Illuminate\Support\Facades\Route; Route::get('/', function () { return view('welcome'); }); Route::get('/hello', function () { return 'Hello, World!'; }); </syntaxhighlight> === パラメータ付きルート === :<syntaxhighlight lang=php copy> Route::get('/users/{id}', function ($id) { return 'User '.$id; }); // オプションパラメータ Route::get('/posts/{post?}', function ($post = null) { return $post ?? 'All posts'; }); </syntaxhighlight> == コントローラー == === 基本的なコントローラー === ;コントローラーを生成: :<syntaxhighlight lang=shell-session copy> php artisan make:controller UserController </syntaxhighlight> ;コントローラーの実装例: :<syntaxhighlight lang=php copy> namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; class UserController extends Controller { public function index() { $users = User::all(); return view('users.index', compact('users')); } public function show(User $user) { return view('users.show', compact('user')); } public function store(Request $request) { $validated = $request->validate([ 'name' => 'required|max:255', 'email' => 'required|email|unique:users', ]); User::create($validated); return redirect()->route('users.index'); } } </syntaxhighlight> == Eloquent ORM == === モデルの作成 === :<syntaxhighlight lang=shell-session copy> php artisan make:model Post -m </syntaxhighlight> === モデルの基本的な使用 === :<syntaxhighlight lang=php copy> namespace App\Models; use Illuminate\Database\Eloquent\Model; class Post extends Model { protected $fillable = [ 'title', 'content', 'user_id' ]; public function user() { return $this->belongsTo(User::class); } public function comments() { return $this->hasMany(Comment::class); } } </syntaxhighlight> == ビュー == === Bladeテンプレート === ;resources/views/posts/show.blade.php: :<syntaxhighlight lang=php copy> @extends('layouts.app') @section('content') <div class="container"> <h1>{{ $post->title }}</h1> <div class="content"> {{ $post->content }} </div> @if($post->comments->count() > 0) <div class="comments"> @foreach($post->comments as $comment) <div class="comment"> <p>{{ $comment->content }}</p> <small>By: {{ $comment->user->name }}</small> </div> @endforeach </div> @endif </div> @endsection </syntaxhighlight> == ミドルウェア == === カスタムミドルウェアの作成 === :<syntaxhighlight lang=shell-session copy> php artisan make:middleware CheckAge </syntaxhighlight> :<syntaxhighlight lang=php copy> namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class CheckAge { public function handle(Request $request, Closure $next) { if ($request->age <= 18) { return redirect('home'); } return $next($request); } } </syntaxhighlight> == アーティザンコマンド == === よく使用するコマンド === :<syntaxhighlight lang=shell-session copy> # マイグレーション php artisan migrate php artisan migrate:rollback php artisan migrate:fresh # キャッシュクリア php artisan cache:clear php artisan config:clear php artisan view:clear # 開発サーバー起動 php artisan serve # リソースの作成 php artisan make:controller PostController --resource php artisan make:model Post -mcr </syntaxhighlight> == テスト == === 基本的なテストの作成 === :<syntaxhighlight lang=php copy> namespace Tests\Feature; use Tests\TestCase; use App\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase; class UserTest extends TestCase { use RefreshDatabase; public function test_user_can_be_created() { $userData = [ 'name' => 'Test User', 'email' => 'test@example.com', 'password' => 'my secret password' ]; $response = $this->post('/api/users', $userData); $response->assertStatus(201); $this->assertDatabaseHas('users', [ 'email' => 'test@example.com' ]); } } </syntaxhighlight> == セキュリティ == === CSRF保護 === フォーム内でCSRFトークンを含める: :<syntaxhighlight lang=php copy> <form method="POST" action="/profile"> @csrf ... </form> </syntaxhighlight> === 認証 === auth.phpでガードを設定: :<syntaxhighlight lang=php copy> 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'sanctum', 'provider' => 'users', ], ], </syntaxhighlight> == キャッシュ == === キャッシュの基本的な使用 === :<syntaxhighlight lang=php copy> use Illuminate\Support\Facades\Cache; // キャッシュに値を保存 Cache::put('key', 'value', now()->addMinutes(10)); // キャッシュから値を取得 $value = Cache::get('key', 'default'); // キャッシュが存在しない場合にコールバックを実行 $value = Cache::remember('users', 3600, function () { return User::all(); }); </syntaxhighlight> == キュー == === ジョブの作成と実行 === ;ジョブクラスの作成: :<syntaxhighlight lang=shell-session copy> php artisan make:job ProcessPodcast </syntaxhighlight> :<syntaxhighlight lang=php copy> namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class ProcessPodcast implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public function __construct(private $podcast) { $this->podcast = $podcast; } public function handle() { // ジョブの処理ロジック } } </syntaxhighlight> ; ジョブのディスパッチ: :<syntaxhighlight lang=php copy> ProcessPodcast::dispatch($podcast); </syntaxhighlight> {{DEFAULTSORT:LARAVEL}} [[Category:PHP]] [[Category:フレームワーク]] oip52yvu6t9oxrtvj4idua33q8kndue PHP/名前空間 0 43434 264140 2024-11-24T23:07:09Z Ef3 694 名前空間は、PHPで大規模なアプリケーションを開発する際に不可欠な機能です。異なるライブラリやコードベース間での名前の衝突を防ぎ、コードの整理と管理を容易にします。 264140 wikitext text/x-wiki == 名前空間の基本概念 == '''名前空間'''は、PHPで大規模なアプリケーションを開発する際に不可欠な機能です。異なるライブラリやコードベース間での名前の衝突を防ぎ、コードの整理と管理を容易にします。 以下のような状況を考えてみましょう: ; app/Database/Connection.php :<syntaxhighlight lang=php copy> <?php namespace App\Database; class Connection { public function connect() { return "データベース接続を確立しました"; } } </syntaxhighlight> ; app/Network/Connection.php :<syntaxhighlight lang=php copy> <?php namespace App\Network; class Connection { public function connect() { return "ネットワーク接続を確立しました"; } } </syntaxhighlight> この例では、同じ<code>Connection</code>という名前のクラスを、異なる目的のために定義しています。名前空間を使用することで、これらのクラスは互いに干渉することなく共存できます。 == 名前空間の定義と使用 == 名前空間は、PHPファイルの先頭で宣言する必要があります。ただし、declare文がある場合は、その後に記述します: :<syntaxhighlight lang=php copy> <?php declare(strict_types=1); namespace MyApp\Services; class UserService { public function createUser(string $name) { return "ユーザー {$name} を作成しました"; } } </syntaxhighlight> == 名前空間の階層構造 == 名前空間は、ディレクトリ構造に似た階層を持つことができます: :<syntaxhighlight lang=php copy> <?php namespace App\Services\User\Authentication; class LoginService { public function authenticate(string $username, string $password) { // 認証ロジック return true; } } </syntaxhighlight> == 名前空間内のクラスの使用 == 他の名前空間のクラスを使用する方法には、主に3つのアプローチがあります: === 完全修飾名(FQCN)の使用 === :<syntaxhighlight lang=php copy> <?php namespace App\Controllers; class UserController { public function login() { $service = new \App\Services\User\Authentication\LoginService(); $result = $service->authenticate('username', 'password'); return $result; } } </syntaxhighlight> === use文による名前空間のインポート === :<syntaxhighlight lang=php copy> <?php namespace App\Controllers; use App\Services\User\Authentication\LoginService; use App\Models\User; use App\Database\Connection; class UserController { private LoginService $loginService; private Connection $db; public function __construct() { $this->loginService = new LoginService(); $this->db = new Connection(); } } </syntaxhighlight> === エイリアスの使用 === :<syntaxhighlight lang=php copy> <?php namespace App\Controllers; use App\Services\User\Authentication\LoginService as AuthService; use App\Models\User as UserModel; class UserController { public function register() { $auth = new AuthService(); $user = new UserModel(); } } </syntaxhighlight> == グローバル名前空間 == 名前空間を指定しない場合、そのコードはグローバル名前空間に属します。また、バックスラッシュを使用してグローバル名前空間の要素を参照できます: :<syntaxhighlight lang=php copy> <?php namespace App\Services; class FileService { public function readFile(string $path) { // グローバル関数の使用 return \file_get_contents($path); } public function getDateTime() { // グローバルクラスの使用 return new \DateTime(); } } </syntaxhighlight> == 名前空間と関数・定数 == 名前空間は、クラスだけでなく関数や定数にも適用できます: :<syntaxhighlight lang=php copy> <?php namespace App\Utilities; const APP_VERSION = '1.0.0'; function formatCurrency(float $amount): string { return "¥" . number_format($amount); } class StringHelper { public static function truncate(string $text, int $length): string { return mb_substr($text, 0, $length) . '...'; } } // 別のファイルでの使用 namespace App\Controllers; use App\Utilities; class ProductController { public function getProductInfo() { $price = Utilities\formatCurrency(1000); $version = Utilities\APP_VERSION; return "製品価格: {$price} (v{$version})"; } } </syntaxhighlight> == 複数の名前空間のインポート == 大規模なアプリケーションでは、多くの名前空間をインポートする必要があることがあります。この場合、グループ化して記述できます: :<syntaxhighlight lang=php copy> <?php namespace App\Controllers; use App\Models\{ User, Product, Order, Payment }; use App\Services\{ UserService, PaymentService }; use App\Exceptions\{ ValidationException, DatabaseException }; class OrderController { public function createOrder() { $user = new User(); $product = new Product(); $order = new Order(); $payment = new Payment(); try { $userService = new UserService(); $paymentService = new PaymentService(); // 注文処理のロジック } catch (ValidationException $e) { // バリデーションエラーの処理 } catch (DatabaseException $e) { // データベースエラーの処理 } } } </syntaxhighlight> == ベストプラクティス == # 名前空間は、プロジェクトのディレクトリ構造と一致させることをお勧めします: #;プロジェクトディレクトリ #:<syntaxhighlight lang=text copy> src/ └── App/ ├── Controllers/ │ └── UserController.php ├── Models/ │ └── User.php └── Services/ └── UserService.php </syntaxhighlight> #; src/App/Controllers/UserController.php #:<syntaxhighlight lang=php copy> <?php namespace App\Controllers; use App\Models\User; use App\Services\UserService; class UserController { private UserService $userService; public function __construct() { $this->userService = new UserService(); } public function index() { return $this->userService->getAllUsers(); } } </syntaxhighlight> # オートローディングを活用するために、PSR-4の規約に従った名前空間の構造を採用することをお勧めします: #:<syntaxhighlight lang=json copy> { "autoload": { "psr-4": { "App\\": "src/App/" } } } </syntaxhighlight> この章で説明した名前空間の概念と使用方法を理解することで、大規模なPHPアプリケーションの開発において、整理された、保守性の高いコードを書くことができます。 {{DEFAULTSORT:なまえくうかん}} [[Category:PHP]] a9y5bz02o28lfoomc6ssnpnri4y7j81 PHP/セキュリティ 0 43435 264143 2024-11-24T23:27:18Z Ef3 694 PHPではユーザーからの入力を必ず検証し、必要に応じてサニタイズする必要があります。 264143 wikitext text/x-wiki == セキュリティ == === 入力値の検証とサニタイズ === PHPではユーザーからの入力を必ず検証し、必要に応じてサニタイズする必要があります。 以下は、<code>filter_input</code>を使用して入力値を検証する例です。 :<syntaxhighlight lang=php copy> <?php // GETパラメータ "email" を検証 $email = filter_input(INPUT_GET, 'email', FILTER_VALIDATE_EMAIL); if ($email === false) { echo "無効なメールアドレスです。"; } else { echo "有効なメールアドレス: " . htmlspecialchars($email, ENT_QUOTES, 'UTF-8'); } ?> </syntaxhighlight> === CSRF対策 === CSRF対策としてトークンを利用する方法を示します。 :<syntaxhighlight lang=php copy> <?php session_start(); // トークン生成 if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // フォーム表示 echo '<form method="POST">'; echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">'; echo '<input type="submit" value="送信">'; echo '</form>'; // トークン検証 if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) { echo "トークン検証成功"; } else { echo "トークン検証失敗"; } } ?> </syntaxhighlight> === SQLインジェクション対策 === PDOを利用した安全なクエリ実行例です。 :<syntaxhighlight lang=php copy> <?php $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password'); // プリペアドステートメントで安全にデータを挿入 $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => $_GET['email']]); $user = $stmt->fetch(); ?> </syntaxhighlight> {{DEFAULTSORT:せきゆりてい}} [[Category:PHP]] eajik8vsbhj9ymlgxsmphfbqctbnd2t PHP/HTTPリクエストとAPI 0 43436 264144 2024-11-24T23:29:09Z Ef3 694 外部APIからデータを取得する例 264144 wikitext text/x-wiki == HTTPリクエストとAPI == === cURLを使用したGETリクエスト === 外部APIからデータを取得する例です。 :<syntaxhighlight lang=php cpoy> <?php $ch = curl_init('https://api.example.com/data'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true); print_r($data); ?> </syntaxhighlight> === cURLを使用したPOSTリクエスト === POSTデータを送信する例です。 :<syntaxhighlight lang=php cpoy> <?php $ch = curl_init('https://api.example.com/submit'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, ['name' => 'John', 'age' => 30]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); echo $response; ?> </syntaxhighlight> {{DEFAULTSORT:HTTPりくえすととAPI}} [[Category:PHP]] g0b8sl3t7b3t03uv71q5c895iyyblrp PHP/テスト 0 43437 264145 2024-11-24T23:31:30Z Ef3 694 簡単なPHPUnitのテスト例 264145 wikitext text/x-wiki == テスト == === PHPUnitを使った単体テスト === 以下は簡単なPHPUnitのテスト例です。 :<syntaxhighlight lang=php cpoy> <?php use PHPUnit\Framework\TestCase; class MathTest extends TestCase { public function testAddition() { $this->assertEquals(4, 2 + 2); } } ?> </syntaxhighlight> ;テストの実行コマンド: :<syntaxhighlight lang=shell-session copy> phpunit MathTest.php </syntaxhighlight> {{DEFAULTSORT:てすと}} [[Category:PHP]] a9p9tmxo62ih5e1pqxq1wgd9av1ebso PHP/パフォーマンス 0 43438 264146 2024-11-24T23:33:40Z Ef3 694 /*メモリ使用量の最適化*/ 264146 wikitext text/x-wiki == パフォーマンス == === メモリ使用量の最適化 === 配列を生成する際の効率的なコード例。 :<syntaxhighlight lang=php cpoy> <?php // 範囲指定で配列を生成 $numbers = range(1, 100000); // 大量のデータを処理する際はジェネレータを使用 function generateNumbers($max) { for ($i = 1; $i <= $max; $i++) { yield $i; } } foreach (generateNumbers(100000) as $number) { // 必要なときだけデータを処理 } ?> </syntaxhighlight> === キャッシュの活用 === OPCacheを有効にする例。 :<syntaxhighlight lang=php cpoy> <?php // スクリプト冒頭でOPCacheを確認 if (function_exists('opcache_get_status')) { print_r(opcache_get_status()); } ?> </syntaxhighlight> {{DEFAULTSORT:はふおまんす}} [[Category:PHP]] iu1h8by39ue6s88xgdpt9eb85t8h55a PHP/エラーハンドリング 0 43439 264147 2024-11-24T23:38:15Z Ef3 694 PHPではエラーを適切にキャッチし、処理を続行するための仕組みが提供されています。 264147 wikitext text/x-wiki == エラーハンドリング == === エラーハンドリングの基礎 === PHPではエラーを適切にキャッチし、処理を続行するための仕組みが提供されています。以下は基本的な<code>try-catch</code>構文の例です。 :<syntaxhighlight lang=php cpoy> <?php try { // エラーを発生させるコード if (!file_exists('example.txt')) { throw new Exception('ファイルが見つかりません。'); } $content = file_get_contents('example.txt'); echo $content; } catch (Exception $e) { // エラー処理 echo "エラー: " . $e->getMessage(); } ?> </syntaxhighlight> === カスタム例外クラス === 独自の例外クラスを作成して特定のエラーを処理できます。 :<syntaxhighlight lang=php cpoy> <?php class CustomException extends Exception {} try { $value = -1; if ($value < 0) { throw new CustomException('値は0以上である必要があります。'); } } catch (CustomException $e) { echo "カスタム例外: " . $e->getMessage(); } catch (Exception $e) { echo "一般例外: " . $e->getMessage(); } ?> </syntaxhighlight> === エラーログの記録 === エラーをログファイルに記録することで、運用中の問題を追跡できます。 :<syntaxhighlight lang=php cpoy> <?php try { throw new Exception('重大なエラーが発生しました。'); } catch (Exception $e) { error_log($e->getMessage(), 3, 'error.log'); echo "エラーが記録されました。"; } ?> </syntaxhighlight> === カスタムエラーハンドラー === 独自のエラーハンドラーを定義してエラー処理をカスタマイズできます。 :<syntaxhighlight lang=php cpoy> <?php function customErrorHandler($errno, $errstr, $errfile, $errline) { echo "エラー [$errno]: $errstr - $errfile:$errline\n"; // 必要に応じてエラーログに記録 error_log("エラー [$errno]: $errstr - $errfile:$errline", 3, 'error.log'); return true; // 標準のエラーハンドリングをスキップ } // カスタムエラーハンドラーを設定 set_error_handler('customErrorHandler'); // 意図的にエラーを発生 echo $undefinedVariable; ?> </syntaxhighlight> === 致命的エラーの処理 === <code>register_shutdown_function</code>を使って致命的エラーをキャッチできます。 :<syntaxhighlight lang=php cpoy> <?php register_shutdown_function(function() { $error = error_get_last(); if ($error) { echo "致命的エラー: " . $error['message']; error_log("致命的エラー: " . $error['message'], 3, 'error.log'); } }); // 意図的に致命的エラーを発生 undefinedFunction(); ?> </syntaxhighlight> === 例外とエラーの統一 === <code>Error</code>クラスを使用して致命的エラーを例外として処理できます。 :<syntaxhighlight lang=php cpoy> <?php try { // 型エラーを発生 $result = 1 / 0; } catch (Error $e) { echo "エラーキャッチ: " . $e->getMessage(); } ?> </syntaxhighlight> {{DEFAULTSORT:えらはんとりんく}} [[Category:PHP]] 2imahfz6c5ppar31q2o19wojde9mece PHP/型ジャグリング 0 43440 264148 2024-11-24T23:46:55Z Ef3 694 PHPは動的型付け言語であり、型ジャグリング(型の自動変換)が発生します。これは特定の操作や状況でPHPが異なる型を自動的に変換する動作を指します。 264148 wikitext text/x-wiki == 型ジャグリング == === 型ジャグリングとは === PHPは動的型付け言語であり、型ジャグリング(型の自動変換)が発生します。これは特定の操作や状況でPHPが異なる型を自動的に変換する動作を指します。 === 比較時の型ジャグリング === 比較演算子を使用した場合、PHPは値を自動的に型変換します。 :<syntaxhighlight lang=php copy> <?php // 等しい (==) は型をチェックしない var_dump(123 == '123'); // bool(true) // 厳密な等しい (===) は型もチェック var_dump(123 === '123'); // bool(false) // == の場合、文字列が数値形式なら数値に変換 var_dump('123abc' == 123); // bool(true) // 文字列として比較 var_dump('123abc' == '123'); // bool(false) ?> </syntaxhighlight> === 算術演算時の型ジャグリング === 算術演算では、文字列が数値に変換されます。 :<syntaxhighlight lang=php copy> <?php echo '10' + 5; // 15 echo '10 apples' + 5; // 15 (文字列の先頭が数値として解釈) echo 'apples' + 5; // 5 (文字列が数値として解釈されない場合、0に変換) ?> </syntaxhighlight> === 関数呼び出し時の型ジャグリング === PHPの多くの組み込み関数は引数の型を自動的に変換します。 :<syntaxhighlight lang=php copy> <?php $length = strlen(12345); // 数値が文字列に変換される echo $length; // 5 ?> </syntaxhighlight> === 明示的な型変換 === 型ジャグリングを避けるには、明示的な型キャストを利用します。 :<syntaxhighlight lang=php copy> <?php $number = '123'; $integer = (int)$number; // 明示的に整数型に変換 echo $integer; // 123 $boolean = (bool)$number; // 真偽値に変換 echo $boolean ? 'true' : 'false'; // true ?> </syntaxhighlight> === 型ジャグリングの落とし穴 === 型ジャグリングは予期しない動作を引き起こす場合があります。 :<syntaxhighlight lang=php copy> <?php // 配列と文字列の比較 var_dump([] == ''); // bool(true) // 文字列が数値に解釈される var_dump('0e12345' == '0'); // bool(true) ('0e12345' は数値0と解釈される) ?> </syntaxhighlight> === 型ジャグリングを避けるためのポイント === * 厳密比較 (<code>===</code> と <code>!==</code>) を使用する。 * 関数引数や変数に型を明示的に指定する。 * 厳密な型宣言を有効化する(<code>declare(strict_types=1);</code>)。 :<syntaxhighlight lang=php copy> <?php declare(strict_types=1); function add(int $a, int $b): int { return $a + $b; } echo add(5, 10); // 15 // echo add('5', '10'); // 型エラー発生 ?> </syntaxhighlight> {{DEFAULTSORT:かたしやくりんく}} [[Category:PHP]] sug3v1n95d9ry5cvtoubo8ndwrq265g C++/指定子 0 43441 264174 2024-11-25T09:46:05Z Ef3 694 C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 264174 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] t41mq4cu7risk84tswdvfjgrzhh1edx 264175 264174 2024-11-25T10:09:27Z Ef3 694 /*const*/ C++のconst指定子は、C++の最初の規格(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。/*volatile*/ C++のvolatile指定子は、C++98から導入され、C言語のvolatile(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。/*signed*/ C++のsigned指定子は、C++の最初の規格(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。/*unsigned*/ C++のunsigned指定子は、C++の最初の規格(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 264175 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] gzipm2m9y2h5hg6w3e4v1567tupka0y 264177 264175 2024-11-25T10:15:26Z Ef3 694 /* 関数・変数の修飾指定子 */ 修飾子指定子の節 264177 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== ==== friend ==== ==== virtual ==== ==== override ==== ==== final ==== ==== noexcept ==== === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] 9g6c15fq67rq6k9x3tnlo2nboj42u3o 264178 264177 2024-11-25T10:16:31Z Ef3 694 /* クラス・構造体に関連する指定子 */ 各指定子の節 264178 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== ==== friend ==== ==== virtual ==== ==== override ==== ==== final ==== ==== noexcept ==== === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== ==== struct ==== ==== union ==== ==== enum ==== === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] iqvk7rdhzt60e02mml1e2wgohn01sha 264179 264178 2024-11-25T10:17:09Z Ef3 694 /* 名前空間関連指定子 */ 各指定子の節 264179 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== ==== friend ==== ==== virtual ==== ==== override ==== ==== final ==== ==== noexcept ==== === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== ==== struct ==== ==== union ==== ==== enum ==== === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 ==== namespace ==== ==== using ==== === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] mgj67b4cgjha0puzmkrn8hqmo8h7m4q 264181 264179 2024-11-25T10:18:09Z Ef3 694 /* テンプレート関連指定子 */ 各指定子の節 264181 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== ==== friend ==== ==== virtual ==== ==== override ==== ==== final ==== ==== noexcept ==== === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== ==== struct ==== ==== union ==== ==== enum ==== === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 ==== namespace ==== ==== using ==== === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 ==== template ==== ==== typename ==== ==== class ==== === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] 9unayzusxmunrg8uxnz4lskkcaw2wk2 264182 264181 2024-11-25T10:18:59Z Ef3 694 /* その他の指定子 */ 各指定子の節 264182 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== ==== friend ==== ==== virtual ==== ==== override ==== ==== final ==== ==== noexcept ==== === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== ==== struct ==== ==== union ==== ==== enum ==== === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 ==== namespace ==== ==== using ==== === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 ==== template ==== ==== typename ==== ==== class ==== === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 ==== alignas ==== ==== alignof ==== ==== decltype ==== ==== dynamic_cast ==== ==== static_cast ==== ==== reinterpret_cast ==== ==== const_cast ==== ==== sizeof ==== ==== typeid ==== === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] gl6jurnbkgkqbna2x8n87wsh14z3a01 264183 264182 2024-11-25T10:19:46Z Ef3 694 /* 例外関連指定子 */ 各指定子の節 264183 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== ==== friend ==== ==== virtual ==== ==== override ==== ==== final ==== ==== noexcept ==== === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== ==== struct ==== ==== union ==== ==== enum ==== === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 ==== namespace ==== ==== using ==== === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 ==== template ==== ==== typename ==== ==== class ==== === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 ==== alignas ==== ==== alignof ==== ==== decltype ==== ==== dynamic_cast ==== ==== static_cast ==== ==== reinterpret_cast ==== ==== const_cast ==== ==== sizeof ==== ==== typeid ==== === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 ==== try ==== ==== catch ==== ==== throw ==== ==== noexcept ==== === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] 8kmc8uaecc8qd8byjf9luv96cjrd5g3 264184 264183 2024-11-25T10:20:35Z Ef3 694 /* 名前の修飾 */ 各指定子の節 264184 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== ==== friend ==== ==== virtual ==== ==== override ==== ==== final ==== ==== noexcept ==== === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== ==== struct ==== ==== union ==== ==== enum ==== === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 ==== namespace ==== ==== using ==== === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 ==== template ==== ==== typename ==== ==== class ==== === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 ==== alignas ==== ==== alignof ==== ==== decltype ==== ==== dynamic_cast ==== ==== static_cast ==== ==== reinterpret_cast ==== ==== const_cast ==== ==== sizeof ==== ==== typeid ==== === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 ==== try ==== ==== catch ==== ==== throw ==== ==== noexcept ==== === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ==== namespace ==== ==== using ==== ==== typedef ==== ==== using ==== ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] hjlrfz65jsuy24r70du4x5qm4wz7lln 264185 264184 2024-11-25T10:35:24Z Ef3 694 /*explicit*/ C++のexplicit指定子は、C++98で導入されました。これはコンストラクタや変換演算子において、暗黙的な型変換を防ぐために使用され、コードの安全性と可読性を向上させます。 264185 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== C++の<code>[[#explicit|explicit]]</code>指定子は、'''C++98'''で導入されました。これはコンストラクタや変換演算子において、暗黙的な型変換を防ぐために使用され、コードの安全性と可読性を向上させます。 C++での<code>[[#explicit|explicit]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 暗黙的な型変換を禁止するための指定子。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit Example(int value) {} // 暗黙変換を禁止 }; Example e1 = 10; // エラー Example e2(10); // OK</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#explicit|explicit]]</code>を変換演算子にも適用可能に。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit operator bool() const { return true; } }; Example e; if (e) {} // OK(明示的変換) bool flag = e; // エラー(暗黙的変換は禁止)</syntaxhighlight> '''C++20''':条件付き<code>[[#explicit|explicit]]</code>の導入 * コンパイル時条件に基づき<code>[[#explicit|explicit]]</code>の適用を切り替え可能。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit((sizeof(int) > 2)) Example(int value) {} };</syntaxhighlight> <code>[[#explicit|explicit]]</code>の主な用途: # 暗黙的な型変換によるバグを防止 # コンストラクタや変換演算子の意図を明確化 # コードの可読性とメンテナンス性を向上 現代のC++では、<code>[[#explicit|explicit]]</code>は以下の場面で重要な役割を果たします: * 型の安全性を確保するためのAPI設計 * 意図しない型変換を防ぐ * 条件に基づく柔軟な指定 注意点: * <code>[[#explicit|explicit]]</code>を付け忘れると、予期しない暗黙的な型変換が発生する可能性があります。 * 暗黙変換が必要な場合には、あえて<code>[[#explicit|explicit]]</code>を省略する設計が必要です。 <code>[[#explicit|explicit]]</code>はクラス設計の一部として、他の指定子(<code>[[#constexpr|constexpr]]</code>や<code>[[#virtual|virtual]]</code>など)と組み合わせて使用されることが多く、コードの意図をより明確にするために不可欠な機能です。 ==== friend ==== C++の<code>[[#friend|friend]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しています。これは、クラスのプライベートメンバやプロテクテッドメンバに外部の関数や他のクラスからアクセスできるようにするために使用されます。 C++での<code>[[#friend|friend]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 関数やクラスを「友達」にすることでアクセスを許可。 :<syntaxhighlight lang=c++ copy>class Example { private: int value; public: Example(int v) : value(v) {} friend void printValue(const Example& e); // フレンド関数 }; void printValue(const Example& e) { std::cout << e.value << std::endl; // プライベートメンバにアクセス可能 }</syntaxhighlight> '''C++11以降''':機能の応用 * テンプレートとの組み合わせで柔軟性が向上。 :<syntaxhighlight lang=c++ copy>template <typename T> class Container { private: T data; public: Container(T d) : data(d) {} template <typename U> friend void printData(const Container<U>& c); // フレンドテンプレート }; template <typename U> void printData(const Container<U>& c) { std::cout << c.data << std::endl; }</syntaxhighlight> <code>[[#friend|friend]]</code>の主な用途: # クラスの内部データへの制限的なアクセスを提供 # 操作のために外部関数を許可 # テンプレートとの組み合わせで汎用性の向上 現代のC++では、<code>[[#friend|friend]]</code>は以下の場面で役立ちます: * 特定の外部関数にアクセス権を与える(例:入出力演算子の実装) * 相互アクセスが必要なクラス間の連携を実現 * プライベートメンバの安全な操作を可能に 注意点: * フレンド関数を多用するとカプセル化が損なわれる可能性があります。 * 乱用を避け、必要最小限の範囲に限定すべきです。 <code>[[#friend|friend]]</code>は、API設計や特定のユースケースで重要な役割を果たしますが、設計上の責任を明確にすることが求められます。他の指定子(<code>[[#const|const]]</code>や<code>[[#explicit|explicit]]</code>など)と併用して、安全かつ明確な設計を心がけることが重要です。 ==== virtual ==== C++の<code>[[#virtual|virtual]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しています。これは多態性(ポリモーフィズム)を実現するために使用され、派生クラスで関数をオーバーライドできるようにします。 C++での<code>[[#virtual|virtual]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 仮想関数を定義し、動的な関数呼び出しを実現。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() const override { // オーバーライド std::cout << "Derived class" << std::endl; } }; Base* b = new Derived(); b->show(); // "Derived class"(動的ディスパッチ)</syntaxhighlight> '''C++11''':機能の拡張 * <code>[[#override|override]]</code>と<code>[[#final|final]]</code>の導入により、意図の明確化と誤り防止が可能に。 :<syntaxhighlight lang=c++ copy>class Derived : public Base { public: void show() const override { /* ... */ } // 明示的オーバーライド }; class FinalDerived final : public Derived { // これ以上派生不可 void show() const override final { /* ... */ } // これ以上オーバーライド不可 };</syntaxhighlight> '''C++17'''以降:仮想関数テーブルの効率化や最適化が進化。 <code>[[#virtual|virtual]]</code>の主な用途: # 基底クラスの関数を派生クラスでオーバーライド可能に # 動的ポリモーフィズムを実現 # インターフェースの設計 # 共通の基底型での多態的な操作 現代のC++では、<code>[[#virtual|virtual]]</code>は以下の場面で重要な役割を果たします: * 抽象クラスの設計(純粋仮想関数によるインターフェースの提供) :<syntaxhighlight lang=c++ copy>class Abstract { public: virtual void doWork() const = 0; // 純粋仮想関数 };</syntaxhighlight> * 派生クラス間の動的な振る舞い * クラス階層の柔軟性を向上 注意点: * 仮想関数はランタイムでのオーバーヘッドが発生します。 * 仮想デストラクタを正しく定義することで、動的メモリ解放時の未定義動作を防ぐ。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual ~Base() {} // 仮想デストラクタ };</syntaxhighlight> <code>[[#virtual|virtual]]</code>は、C++のオブジェクト指向プログラミングの中核を担う指定子であり、正確な設計と適切な使用が求められます。他の指定子(<code>[[#override|override]]</code>、<code>[[#final|final]]</code>)と組み合わせることで、コードの安全性と可読性をさらに向上させます。 ==== override ==== C++の<code>[[#override|override]]</code>指定子は、'''C++11'''で導入されました。これは、仮想関数を派生クラスでオーバーライドする際に、意図を明確にし、間違いを防ぐために使用されます。 C++での<code>[[#override|override]]</code>の主な用途と進化: '''C++11''':基本的な機能 * 基底クラスの仮想関数を正しくオーバーライドしているかをコンパイル時にチェック。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() const override { // 正しいオーバーライド std::cout << "Derived class" << std::endl; } // void Show() const override; // エラー:関数名が異なる };</syntaxhighlight> '''C++17以降''':コンパイラのチェック機能がさらに洗練。 * <code>[[#override|override]]</code>の使用が推奨されるようになり、コードの安全性が向上。 <code>[[#override|override]]</code>の主な用途: # 基底クラスの仮想関数を正しくオーバーライドしていることを保証 # 関数名のタイポやシグネチャの不一致によるバグを防止 # コードの意図を明確化 現代のC++では、<code>[[#override|override]]</code>は以下の場面で重要です: * 仮想関数の正しい継承と動作確認 * 明示的な意図を示すことで、可読性と保守性を向上 注意点: * <code>[[#override|override]]</code>は、基底クラスの仮想関数に対してのみ使用可能。 * 基底クラスに仮想関数が存在しない場合、エラーが発生。 :<syntaxhighlight lang=c++ copy>class Base { void show() const {} // 仮想関数ではない }; class Derived : public Base { void show() const override {} // エラー:仮想関数でない };</syntaxhighlight> <code>[[#override|override]]</code>は、動的ポリモーフィズムを正確に実装するための必須要素であり、特に複雑なクラス階層での設計ミスを防ぐために重要です。<code>[[#final|final]]</code>と組み合わせることで、さらなる安全性と制御が可能です。 ==== final ==== C++の<code>[[#final|final]]</code>指定子は、'''C++11'''で導入されました。これは、クラスや仮想関数がさらに継承やオーバーライドされないことを明示するために使用されます。 C++での<code>[[#final|final]]</code>の主な用途と進化: '''C++11''':基本的な機能 * クラスや関数に対して継承やオーバーライドを禁止。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const {} }; class Derived final : public Base { // これ以上継承不可 void show() const override final { // これ以上オーバーライド不可 std::cout << "Derived class" << std::endl; } }; // class SubDerived : public Derived {}; // エラー:Derivedがfinal</syntaxhighlight> '''C++17以降''':最適化の恩恵がさらに強調される。 * <code>[[#final|final]]</code>指定子は仮想関数テーブルの効率化にも寄与。 <code>[[#final|final]]</code>の主な用途: # クラスや関数の設計意図を明示 # 継承やオーバーライドを防ぐことでコードを安定化 # 意図しない派生や仮想関数の再定義を防止 現代のC++では、<code>[[#final|final]]</code>は以下の場面で重要です: * 特定のクラスや関数を完全に固定化したい場合 * セキュリティやパフォーマンスを重視した設計 注意点: * クラスに<code>[[#final|final]]</code>を付与すると、それを基底クラスとして使用できません。 * 仮想関数に<code>[[#final|final]]</code>を付けた場合、それを派生クラスでオーバーライドするとエラーが発生。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void display() const {} }; class Derived : public Base { public: void display() const final {} // これ以上オーバーライド不可 }; // class SubDerived : public Derived { // void display() const {} // エラー:displayがfinal // };</syntaxhighlight> <code>[[#final|final]]</code>は設計時の意図を明確にし、予期しない動作や拡張を防ぐための強力なツールです。他の指定子(<code>[[#override|override]]</code>など)と併用することで、コードの安全性と可読性を向上させます。 ==== noexcept ==== C++の<code>[[#noexcept|noexcept]]</code>指定子は、'''C++11'''で導入され、関数が例外を投げないことを示すために使用されます。この指定子を使用することで、関数が例外をスローしないという保証をコンパイラに伝え、最適化の機会を提供します。 C++での<code>[[#noexcept|noexcept]]</code>の主な用途と進化: '''C++11''':基本的な機能 * 関数が例外を投げないことを宣言し、コンパイラによる最適化を促進。 :<syntaxhighlight lang=c++ copy>void foo() noexcept { // 例外を投げない関数 // 例外をスローしない } void bar() { // noexcept指定なし // 例外をスローする可能性がある }</syntaxhighlight> '''C++17''':<code>[[#noexcept|noexcept]]</code>の推論強化 * コンパイラが関数が例外を投げるかどうかを自動的に推論できるように強化されました。 :<syntaxhighlight lang=c++ copy>void func() noexcept(noexcept(foo())) { // foo()がnoexceptかどうかに基づいて決定 // 処理 }</syntaxhighlight> '''C++20''':<code>[[#noexcept|noexcept]]</code>と条件付きで最適化される場合が強調される。 * より複雑な関数やラムダ式にも対応。 :<syntaxhighlight lang=c++ copy>auto lambda = []() noexcept { // 例外を投げないラムダ };</syntaxhighlight> <code>[[#noexcept|noexcept]]</code>の主な用途: # 関数が例外をスローしないことを保証 # コンパイラによる最適化の支援(特に関数ポインタやラムダの使用時) # コードの意図を明確化(例外を投げない関数と投げる関数を明示的に区別) 現代のC++では、<code>[[#noexcept|noexcept]]</code>は以下の場面で重要です: * 最適化の機会を提供(例外処理の回避) * API設計における意図の明示(例外を投げないことを保証) * パフォーマンスの向上(特に例外処理を伴うコードにおいて) 注意点: * <code>[[#noexcept|noexcept]]</code>指定を持つ関数が実際に例外を投げると、<code>std::terminate()</code>が呼ばれ、プログラムが終了します。 * 既存のコードに対して<code>[[#noexcept|noexcept]]</code>を付ける際には、関数の内部で実際に例外を投げないことを確認する必要があります。 :<syntaxhighlight lang=c++ copy>void example() noexcept { throw std::runtime_error("This will cause std::terminate()"); // エラー:noexcept関数内で例外を投げてはいけない }</syntaxhighlight> <code>[[#noexcept|noexcept]]</code>は、コードの安全性を確保し、例外を投げない関数を設計する際に非常に有用です。また、例外を投げない関数がパフォーマンス向上に寄与するため、最適化が可能となります。 === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== ==== struct ==== ==== union ==== ==== enum ==== === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 ==== namespace ==== ==== using ==== === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 ==== template ==== ==== typename ==== ==== class ==== === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 ==== alignas ==== ==== alignof ==== ==== decltype ==== ==== dynamic_cast ==== ==== static_cast ==== ==== reinterpret_cast ==== ==== const_cast ==== ==== sizeof ==== ==== typeid ==== === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 ==== try ==== ==== catch ==== ==== throw ==== ==== noexcept ==== === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ==== namespace ==== ==== using ==== ==== typedef ==== ==== using ==== ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] ahqg2u34yz3ytcflw4rt86m9zialpo8 264189 264185 2024-11-25T10:47:30Z Ef3 694 /*class*/ C++のclassは、C++の最初の規格(C++98)から存在しており、オブジェクト指向プログラミングの基盤となる構造体を定義するために使用されます。classは、データと関数を1つの単位としてまとめ、カプセル化を提供します。 264189 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== C++の<code>[[#explicit|explicit]]</code>指定子は、'''C++98'''で導入されました。これはコンストラクタや変換演算子において、暗黙的な型変換を防ぐために使用され、コードの安全性と可読性を向上させます。 C++での<code>[[#explicit|explicit]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 暗黙的な型変換を禁止するための指定子。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit Example(int value) {} // 暗黙変換を禁止 }; Example e1 = 10; // エラー Example e2(10); // OK</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#explicit|explicit]]</code>を変換演算子にも適用可能に。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit operator bool() const { return true; } }; Example e; if (e) {} // OK(明示的変換) bool flag = e; // エラー(暗黙的変換は禁止)</syntaxhighlight> '''C++20''':条件付き<code>[[#explicit|explicit]]</code>の導入 * コンパイル時条件に基づき<code>[[#explicit|explicit]]</code>の適用を切り替え可能。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit((sizeof(int) > 2)) Example(int value) {} };</syntaxhighlight> <code>[[#explicit|explicit]]</code>の主な用途: # 暗黙的な型変換によるバグを防止 # コンストラクタや変換演算子の意図を明確化 # コードの可読性とメンテナンス性を向上 現代のC++では、<code>[[#explicit|explicit]]</code>は以下の場面で重要な役割を果たします: * 型の安全性を確保するためのAPI設計 * 意図しない型変換を防ぐ * 条件に基づく柔軟な指定 注意点: * <code>[[#explicit|explicit]]</code>を付け忘れると、予期しない暗黙的な型変換が発生する可能性があります。 * 暗黙変換が必要な場合には、あえて<code>[[#explicit|explicit]]</code>を省略する設計が必要です。 <code>[[#explicit|explicit]]</code>はクラス設計の一部として、他の指定子(<code>[[#constexpr|constexpr]]</code>や<code>[[#virtual|virtual]]</code>など)と組み合わせて使用されることが多く、コードの意図をより明確にするために不可欠な機能です。 ==== friend ==== C++の<code>[[#friend|friend]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しています。これは、クラスのプライベートメンバやプロテクテッドメンバに外部の関数や他のクラスからアクセスできるようにするために使用されます。 C++での<code>[[#friend|friend]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 関数やクラスを「友達」にすることでアクセスを許可。 :<syntaxhighlight lang=c++ copy>class Example { private: int value; public: Example(int v) : value(v) {} friend void printValue(const Example& e); // フレンド関数 }; void printValue(const Example& e) { std::cout << e.value << std::endl; // プライベートメンバにアクセス可能 }</syntaxhighlight> '''C++11以降''':機能の応用 * テンプレートとの組み合わせで柔軟性が向上。 :<syntaxhighlight lang=c++ copy>template <typename T> class Container { private: T data; public: Container(T d) : data(d) {} template <typename U> friend void printData(const Container<U>& c); // フレンドテンプレート }; template <typename U> void printData(const Container<U>& c) { std::cout << c.data << std::endl; }</syntaxhighlight> <code>[[#friend|friend]]</code>の主な用途: # クラスの内部データへの制限的なアクセスを提供 # 操作のために外部関数を許可 # テンプレートとの組み合わせで汎用性の向上 現代のC++では、<code>[[#friend|friend]]</code>は以下の場面で役立ちます: * 特定の外部関数にアクセス権を与える(例:入出力演算子の実装) * 相互アクセスが必要なクラス間の連携を実現 * プライベートメンバの安全な操作を可能に 注意点: * フレンド関数を多用するとカプセル化が損なわれる可能性があります。 * 乱用を避け、必要最小限の範囲に限定すべきです。 <code>[[#friend|friend]]</code>は、API設計や特定のユースケースで重要な役割を果たしますが、設計上の責任を明確にすることが求められます。他の指定子(<code>[[#const|const]]</code>や<code>[[#explicit|explicit]]</code>など)と併用して、安全かつ明確な設計を心がけることが重要です。 ==== virtual ==== C++の<code>[[#virtual|virtual]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しています。これは多態性(ポリモーフィズム)を実現するために使用され、派生クラスで関数をオーバーライドできるようにします。 C++での<code>[[#virtual|virtual]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 仮想関数を定義し、動的な関数呼び出しを実現。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() const override { // オーバーライド std::cout << "Derived class" << std::endl; } }; Base* b = new Derived(); b->show(); // "Derived class"(動的ディスパッチ)</syntaxhighlight> '''C++11''':機能の拡張 * <code>[[#override|override]]</code>と<code>[[#final|final]]</code>の導入により、意図の明確化と誤り防止が可能に。 :<syntaxhighlight lang=c++ copy>class Derived : public Base { public: void show() const override { /* ... */ } // 明示的オーバーライド }; class FinalDerived final : public Derived { // これ以上派生不可 void show() const override final { /* ... */ } // これ以上オーバーライド不可 };</syntaxhighlight> '''C++17'''以降:仮想関数テーブルの効率化や最適化が進化。 <code>[[#virtual|virtual]]</code>の主な用途: # 基底クラスの関数を派生クラスでオーバーライド可能に # 動的ポリモーフィズムを実現 # インターフェースの設計 # 共通の基底型での多態的な操作 現代のC++では、<code>[[#virtual|virtual]]</code>は以下の場面で重要な役割を果たします: * 抽象クラスの設計(純粋仮想関数によるインターフェースの提供) :<syntaxhighlight lang=c++ copy>class Abstract { public: virtual void doWork() const = 0; // 純粋仮想関数 };</syntaxhighlight> * 派生クラス間の動的な振る舞い * クラス階層の柔軟性を向上 注意点: * 仮想関数はランタイムでのオーバーヘッドが発生します。 * 仮想デストラクタを正しく定義することで、動的メモリ解放時の未定義動作を防ぐ。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual ~Base() {} // 仮想デストラクタ };</syntaxhighlight> <code>[[#virtual|virtual]]</code>は、C++のオブジェクト指向プログラミングの中核を担う指定子であり、正確な設計と適切な使用が求められます。他の指定子(<code>[[#override|override]]</code>、<code>[[#final|final]]</code>)と組み合わせることで、コードの安全性と可読性をさらに向上させます。 ==== override ==== C++の<code>[[#override|override]]</code>指定子は、'''C++11'''で導入されました。これは、仮想関数を派生クラスでオーバーライドする際に、意図を明確にし、間違いを防ぐために使用されます。 C++での<code>[[#override|override]]</code>の主な用途と進化: '''C++11''':基本的な機能 * 基底クラスの仮想関数を正しくオーバーライドしているかをコンパイル時にチェック。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() const override { // 正しいオーバーライド std::cout << "Derived class" << std::endl; } // void Show() const override; // エラー:関数名が異なる };</syntaxhighlight> '''C++17以降''':コンパイラのチェック機能がさらに洗練。 * <code>[[#override|override]]</code>の使用が推奨されるようになり、コードの安全性が向上。 <code>[[#override|override]]</code>の主な用途: # 基底クラスの仮想関数を正しくオーバーライドしていることを保証 # 関数名のタイポやシグネチャの不一致によるバグを防止 # コードの意図を明確化 現代のC++では、<code>[[#override|override]]</code>は以下の場面で重要です: * 仮想関数の正しい継承と動作確認 * 明示的な意図を示すことで、可読性と保守性を向上 注意点: * <code>[[#override|override]]</code>は、基底クラスの仮想関数に対してのみ使用可能。 * 基底クラスに仮想関数が存在しない場合、エラーが発生。 :<syntaxhighlight lang=c++ copy>class Base { void show() const {} // 仮想関数ではない }; class Derived : public Base { void show() const override {} // エラー:仮想関数でない };</syntaxhighlight> <code>[[#override|override]]</code>は、動的ポリモーフィズムを正確に実装するための必須要素であり、特に複雑なクラス階層での設計ミスを防ぐために重要です。<code>[[#final|final]]</code>と組み合わせることで、さらなる安全性と制御が可能です。 ==== final ==== C++の<code>[[#final|final]]</code>指定子は、'''C++11'''で導入されました。これは、クラスや仮想関数がさらに継承やオーバーライドされないことを明示するために使用されます。 C++での<code>[[#final|final]]</code>の主な用途と進化: '''C++11''':基本的な機能 * クラスや関数に対して継承やオーバーライドを禁止。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const {} }; class Derived final : public Base { // これ以上継承不可 void show() const override final { // これ以上オーバーライド不可 std::cout << "Derived class" << std::endl; } }; // class SubDerived : public Derived {}; // エラー:Derivedがfinal</syntaxhighlight> '''C++17以降''':最適化の恩恵がさらに強調される。 * <code>[[#final|final]]</code>指定子は仮想関数テーブルの効率化にも寄与。 <code>[[#final|final]]</code>の主な用途: # クラスや関数の設計意図を明示 # 継承やオーバーライドを防ぐことでコードを安定化 # 意図しない派生や仮想関数の再定義を防止 現代のC++では、<code>[[#final|final]]</code>は以下の場面で重要です: * 特定のクラスや関数を完全に固定化したい場合 * セキュリティやパフォーマンスを重視した設計 注意点: * クラスに<code>[[#final|final]]</code>を付与すると、それを基底クラスとして使用できません。 * 仮想関数に<code>[[#final|final]]</code>を付けた場合、それを派生クラスでオーバーライドするとエラーが発生。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void display() const {} }; class Derived : public Base { public: void display() const final {} // これ以上オーバーライド不可 }; // class SubDerived : public Derived { // void display() const {} // エラー:displayがfinal // };</syntaxhighlight> <code>[[#final|final]]</code>は設計時の意図を明確にし、予期しない動作や拡張を防ぐための強力なツールです。他の指定子(<code>[[#override|override]]</code>など)と併用することで、コードの安全性と可読性を向上させます。 ==== noexcept ==== C++の<code>[[#noexcept|noexcept]]</code>指定子は、'''C++11'''で導入され、関数が例外を投げないことを示すために使用されます。この指定子を使用することで、関数が例外をスローしないという保証をコンパイラに伝え、最適化の機会を提供します。 C++での<code>[[#noexcept|noexcept]]</code>の主な用途と進化: '''C++11''':基本的な機能 * 関数が例外を投げないことを宣言し、コンパイラによる最適化を促進。 :<syntaxhighlight lang=c++ copy>void foo() noexcept { // 例外を投げない関数 // 例外をスローしない } void bar() { // noexcept指定なし // 例外をスローする可能性がある }</syntaxhighlight> '''C++17''':<code>[[#noexcept|noexcept]]</code>の推論強化 * コンパイラが関数が例外を投げるかどうかを自動的に推論できるように強化されました。 :<syntaxhighlight lang=c++ copy>void func() noexcept(noexcept(foo())) { // foo()がnoexceptかどうかに基づいて決定 // 処理 }</syntaxhighlight> '''C++20''':<code>[[#noexcept|noexcept]]</code>と条件付きで最適化される場合が強調される。 * より複雑な関数やラムダ式にも対応。 :<syntaxhighlight lang=c++ copy>auto lambda = []() noexcept { // 例外を投げないラムダ };</syntaxhighlight> <code>[[#noexcept|noexcept]]</code>の主な用途: # 関数が例外をスローしないことを保証 # コンパイラによる最適化の支援(特に関数ポインタやラムダの使用時) # コードの意図を明確化(例外を投げない関数と投げる関数を明示的に区別) 現代のC++では、<code>[[#noexcept|noexcept]]</code>は以下の場面で重要です: * 最適化の機会を提供(例外処理の回避) * API設計における意図の明示(例外を投げないことを保証) * パフォーマンスの向上(特に例外処理を伴うコードにおいて) 注意点: * <code>[[#noexcept|noexcept]]</code>指定を持つ関数が実際に例外を投げると、<code>std::terminate()</code>が呼ばれ、プログラムが終了します。 * 既存のコードに対して<code>[[#noexcept|noexcept]]</code>を付ける際には、関数の内部で実際に例外を投げないことを確認する必要があります。 :<syntaxhighlight lang=c++ copy>void example() noexcept { throw std::runtime_error("This will cause std::terminate()"); // エラー:noexcept関数内で例外を投げてはいけない }</syntaxhighlight> <code>[[#noexcept|noexcept]]</code>は、コードの安全性を確保し、例外を投げない関数を設計する際に非常に有用です。また、例外を投げない関数がパフォーマンス向上に寄与するため、最適化が可能となります。 === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== C++の<code>[[#class|class]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、オブジェクト指向プログラミングの基盤となる構造体を定義するために使用されます。<code>[[#class|class]]</code>は、データと関数を1つの単位としてまとめ、カプセル化を提供します。 C++での<code>[[#class|class]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#class|class]]</code>はデータメンバとメンバ関数を持つ型を定義するために使用されます。デフォルトでは、<code>[[#class|class]]</code>のメンバは<code>[[#private|private]]</code>です。 :<syntaxhighlight lang=c++ copy>class Person { private: std::string name; // データメンバ(private) int age; // データメンバ(private) public: // コンストラクタ Person(std::string n, int a) : name(n), age(a) {} // メンバ関数 void setName(std::string n) { name = n; } std::string getName() const { return name; } void setAge(int a) { age = a; } int getAge() const { return age; } };</syntaxhighlight> '''C++11''':機能拡張 * コンストラクタの初期化リストの簡素化や、<code>[[#explicit|explicit]]</code>指定子、<code>[[#override|override]]</code>や<code>[[#final|final]]</code>などが導入されました。 :<syntaxhighlight lang=c++ copy>class Employee { public: std::string name; explicit Employee(std::string n) : name(std::move(n)) {} void printName() const { std::cout << name << std::endl; } };</syntaxhighlight> '''C++17''':<code>[[#class|class]]</code>のデータメンバの型推論(<code>[[#auto|auto]]</code>)が追加される。 * <code>[[#auto|auto]]</code>を使った型推論が可能になり、コンパイル時に型が決定されます。 :<syntaxhighlight lang=c++ copy>class Container { auto value = 42; // 型は自動的にintと推測される public: auto getValue() const { return value; } };</syntaxhighlight> '''C++20''':コンセプト(<code>[[#concepts|concepts]]</code>)とともに、型の制約をクラスのメンバ関数に適用する方法が強化されました。 :<syntaxhighlight lang=c++ copy>template <typename T> class Box { public: T value; Box(T val) : value(val) {} auto getValue() const { return value; } };</syntaxhighlight> <code>[[#class|class]]</code>の主な用途: # データのカプセル化と保護(<code>[[#private|private]]</code>メンバ) # 関数やメンバの動作を隠蔽(<code>[[#private|private]]</code>メンバ関数) # オブジェクト指向プログラミングの基本概念(継承、ポリモーフィズム、カプセル化) # 型安全を提供(メンバ関数とデータの結びつき) 現代のC++では、<code>[[#class|class]]</code>は以下の場面で重要です: * 複雑なデータ構造の定義と操作のカプセル化 * 継承とポリモーフィズムによるコードの再利用 * データの安全なアクセス管理(アクセス制御、メンバ関数の使用) * コンストラクタ、デストラクタによるオブジェクトの初期化・クリーンアップ 注意点: * <code>[[#class|class]]</code>と<code>[[#struct|struct]]</code>は非常に似ていますが、<code>[[#class|class]]</code>のデフォルトアクセス修飾子は<code>[[#private|private]]</code>であり、<code>[[#struct|struct]]</code>のデフォルトは<code>[[#public|public]]</code>です。 * <code>[[#class|class]]</code>は通常、データとメソッドを隠蔽するために使われ、<code>[[#struct|struct]]</code>はデータ構造として用いられることが多いです。 :<syntaxhighlight lang=c++ copy>class MyClass { private: int x; // デフォルトでprivate public: void setX(int val) { x = val; } }; struct MyStruct { int x; // デフォルトでpublic };</syntaxhighlight> <code>[[#class|class]]</code>はC++のオブジェクト指向設計の中心的な要素であり、強力な機能と柔軟性を提供します。データの隠蔽、継承、ポリモーフィズムを活用し、複雑なシステムを管理しやすくします。 ==== struct ==== C++の<code>[[#struct|struct]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、主にデータ構造を定義するために使用されます。<code>[[#struct|struct]]</code>は、C言語から継承されたもので、C++の<code>[[#class|class]]</code>と非常に似ていますが、デフォルトのアクセス修飾子が異なります。 C++での<code>[[#struct|struct]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#struct|struct]]</code>はデータメンバを持つ型を定義するために使用されます。デフォルトでは、<code>[[#struct|struct]]</code>のメンバは<code>[[#public|public]]</code>です。 :<syntaxhighlight lang=c++ copy>struct Person { std::string name; // データメンバ(public) int age; // データメンバ(public) // コンストラクタ Person(std::string n, int a) : name(n), age(a) {} // メンバ関数 void setName(std::string n) { name = n; } std::string getName() const { return name; } void setAge(int a) { age = a; } int getAge() const { return age; } };</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#struct|struct]]</code>でもメンバ関数を定義したり、コンストラクタ、デストラクタを使ったりすることができるようになり、<code>[[#class|class]]</code>とほぼ同等の機能が使えるようになりました。 * <code>[[#explicit|explicit]]</code>指定子や<code>[[#override|override]]</code>、<code>[[#final|final]]</code>などの機能も<code>[[#struct|struct]]</code>に適用できるようになりました。 :<syntaxhighlight lang=c++ copy>struct Employee { std::string name; explicit Employee(std::string n) : name(std::move(n)) {} void printName() const { std::cout << name << std::endl; } };</syntaxhighlight> '''C++17''':<code>[[#struct|struct]]</code>で<code>[[#auto|auto]]</code>を使った型推論がサポートされるようになりました。 * <code>[[#auto|auto]]</code>を使うことで、<code>[[#struct|struct]]</code>のデータメンバの型推論が可能になります。 :<syntaxhighlight lang=c++ copy>struct Container { auto value = 42; // 型は自動的にintと推測される public: auto getValue() const { return value; } };</syntaxhighlight> '''C++20''':構造体でも<code>[[#concepts|concepts]]</code>(型制約)を使うことができるようになり、<code>[[#struct|struct]]</code>内でもテンプレート型に制約を付けることができました。 :<syntaxhighlight lang=c++ copy>template <typename T> struct Box { T value; explicit Box(T val) : value(val) {} auto getValue() const { return value; } };</syntaxhighlight> <code>[[#struct|struct]]</code>の主な用途: # 単純なデータ構造の定義(例えば、複数の関連データを1つにまとめる) # オブジェクト指向のカプセル化(<code>[[#struct|struct]]</code>でもメンバ関数、コンストラクタなどを使用可能) # ユーザー定義の型を作成 # 他のクラスとの簡単なインターフェース(<code>[[#struct|struct]]</code>は<code>[[#class|class]]</code>とほぼ同等の機能を持つ) 現代のC++では、<code>[[#struct|struct]]</code>は以下の場面で重要です: * シンプルなデータ構造を作成 * APIやライブラリでのデータパッケージング * 高度なオブジェクト指向設計にも使用可能(ただし、<code>[[#struct|struct]]</code>のデフォルトメンバは<code>[[#public|public]]</code>であるため、カプセル化が必要な場合は<code>[[#class|class]]</code>が選ばれることが多い) 注意点: * <code>[[#struct|struct]]</code>と<code>[[#class|class]]</code>の違いは、デフォルトのアクセス修飾子の違いだけです。<code>[[#struct|struct]]</code>のメンバはデフォルトで<code>[[#public|public]]</code>、<code>[[#class|class]]</code>のメンバはデフォルトで<code>[[#private|private]]</code>です。 * <code>[[#struct|struct]]</code>は、通常はシンプルなデータ構造を定義するために使用されますが、<code>[[#class|class]]</code>と同様にメンバ関数やコンストラクタ、デストラクタを持つことができます。 :<syntaxhighlight lang=c++ copy>struct Point { int x; // デフォルトでpublic int y; // デフォルトでpublic // コンストラクタ Point(int a, int b) : x(a), y(b) {} // メンバ関数 void move(int dx, int dy) { x += dx; y += dy; } };</syntaxhighlight> <code>[[#struct|struct]]</code>は、C++においてシンプルなデータ構造の定義を行うために非常に便利ですが、<code>[[#class|class]]</code>と異なり、デフォルトでアクセス修飾子が<code>[[#public|public]]</code>であるため、カプセル化を意識した設計が求められます。 ==== union ==== C++の<code>[[#union|union]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、異なる型のデータを同じメモリ領域に格納するために使用されます。<code>[[#union|union]]</code>は、1つのメモリブロックを複数の異なる型で使い回すことで、メモリの使用効率を高めます。各メンバは同じメモリ領域を共有し、そのサイズは最大のメンバ型に合わせられます。 C++での<code>[[#union|union]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#union|union]]</code>を使用することで、異なるデータ型を同じメモリ空間で扱います。複数の型のデータを必要に応じて格納できますが、同時に格納できるのは1つだけです。 :<syntaxhighlight lang=c++ copy>union Data { int i; float f; char c; }; Data d; d.i = 10; // 整数を格納 d.f = 3.14f; // 浮動小数点数を格納(以前のデータは上書きされる) d.c = 'A'; // 文字を格納(以前のデータは再び上書きされる)</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#union|union]]</code>内でもコンストラクタ、デストラクタ、メンバ関数を定義できるようになりました。 * C++11では、<code>[[#union|union]]</code>内での<code>[[#constexpr|constexpr]]</code>の使用が可能になり、コンパイル時の定数を扱うことができるようになりました。 :<syntaxhighlight lang=c++ copy>union Example { int i; float f; constexpr Example(int x) : i(x) {} // C++11以降、コンストラクタが使える };</syntaxhighlight> '''C++14''':さらに機能強化 * C++14では、<code>[[#union|union]]</code>内に非静的なメンバ関数を定義できるようになり、メンバの使い方が柔軟になりました。 * また、<code>[[#union|union]]</code>のメンバに<code>[[#delete|delete]]</code>や<code>[[#default|default]]</code>を使うことも可能になりました。 :<syntaxhighlight lang=c++ copy>union MyUnion { int i; double d; MyUnion() = delete; // unionのデフォルトコンストラクタを削除 };</syntaxhighlight> '''C++17''':新しい機能 * <code>std::variant</code>が導入され、<code>[[#union|union]]</code>の代替として型安全な方法で異なる型のデータを扱えるようになりました。<code>std::variant</code>は型情報を保持し、<code>[[#union|union]]</code>のようにメモリを上書きせずに異なる型を安全に取り扱うことができます。 :<syntaxhighlight lang=c++ copy>#include <variant> std::variant<int, float, char> var; var = 3; // int var = 3.14f; // float var = 'A'; // char</syntaxhighlight> <code>[[#union|union]]</code>の主な用途: # メモリ効率の向上(異なる型を同じメモリ領域に格納) # 型が異なるデータを1つのデータ構造内で取り扱う # データの互換性がある場合に複数の型を使い分ける # 特定のデータ型が必要な場合に使う(例:ビットフィールドやネットワーク通信のデータ処理) 現代のC++では、<code>[[#union|union]]</code>は以下の場面で重要な役割を果たします: * メモリ効率が重要な場面(特にリソース制約が厳しい環境) * 複数の異なる型のデータを共有メモリ空間で管理する必要がある場合 * 型が明確で、同時に格納しないことが保証されている場合 '''注意点''': * <code>[[#union|union]]</code>の各メンバは同じメモリ空間を共有しており、1度に1つのメンバだけが有効です。他のメンバに格納されたデータは上書きされます。 * <code>[[#union|union]]</code>を使う場合、どのメンバが現在有効であるかを把握するために、追加の管理コードが必要になる場合があります。 * <code>[[#union|union]]</code>内でポインタ型を使う際は、データ型の整合性を確保することが重要です。ポインタが指すメモリ領域の内容が異なる可能性があるためです。 :<syntaxhighlight lang=c++ copy>union IntFloat { int i; float f; }; IntFloat u; u.i = 42; std::cout << u.i << std::endl; // 出力: 42 u.f = 3.14f; std::cout << u.i << std::endl; // 出力: データが上書きされているので予測不可能</syntaxhighlight> 現代のC++では、<code>[[#union|union]]</code>よりも<code>std::variant</code>や<code>std::optional</code>などの型安全な代替手段が好まれることが多いですが、メモリ効率が重要な低レベルプログラミングや、特定のデータ構造の設計では引き続き利用されることがあります。 ==== enum ==== C++の<code>[[#enum|enum]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、名前付きの整数型定数をグループ化するための機能です。<code>[[#enum|enum]]</code>を使用することで、コードの可読性やメンテナンス性が向上します。また、<code>[[#enum|enum]]</code>には定数のセットを定義するだけでなく、その定義に基づいて変数を宣言することができます。 C++での<code>[[#enum|enum]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#enum|enum]]</code>を使って、整数値に名前を付けてグループ化することができます。デフォルトでは、最初の定数には0が割り当てられ、以降は1ずつ増加します。 :<syntaxhighlight lang=c++ copy>enum Color { Red, // 0 Green, // 1 Blue // 2 }; Color c = Red; // Color型の変数cにRedを代入</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#enum class|enum class]]</code>の導入により、<code>[[#enum|enum]]</code>は名前空間で囲まれ、型の安全性が強化されました。これにより、<code>[[#enum|enum]]</code>の値が異なる<code>[[#enum|enum]]</code>型間で誤って使用されることを防げるようになりました。 :<syntaxhighlight lang=c++ copy>enum class Color { Red, // 値は自動的に整数型で、Redは0 Green, // Greenは1 Blue // Blueは2 }; Color c = Color::Red; // 名前空間を使って指定</syntaxhighlight> '''C++14''':改善された機能 * <code>[[#enum class|enum class]]</code>で型を指定することができ、さらに可読性を向上させるために、基になる型を指定することができます。 :<syntaxhighlight lang=c++ copy>enum class Color : unsigned int { Red, Green, Blue };</syntaxhighlight> '''C++17''':新しい機能 * <code>[[#enum class|enum class]]</code>に関する変更は特になく、引き続き強力な型安全機能がサポートされています。 <code>[[#enum|enum]]</code>の主な用途: # 定数のグループ化 # 可読性の向上(数字の代わりに意味のある名前を使用) # 名前空間やスコープの管理(<code>[[#enum class|enum class]]</code>を使用することで、グローバルな名前の衝突を防止) # 型安全な列挙型を作成する(<code>[[#enum class|enum class]]</code>) 現代のC++では、<code>[[#enum|enum]]</code>は以下の場面で重要な役割を果たします: * 定数の集合を定義することで、コードの可読性や保守性を向上させる * 状態やオプションのフラグを管理する * 列挙型の値が予測可能であることを保証するため、<code>[[#enum class|enum class]]</code>による型安全を活用する * 数値を直接扱わず、意味のある名前を使うことで意図を明確に伝える :<syntaxhighlight lang=c++ copy>enum class Status { OK = 0, Warning = 1, Error = 2 }; Status status = Status::OK; if (status == Status::Error) { // エラーハンドリング }</syntaxhighlight> '''注意点''': * <code>[[#enum|enum]]</code>の値はデフォルトで整数型として扱われ、必要に応じて明示的に型を指定できます。 * <code>[[#enum|enum]]</code>は型安全ではなく、他の<code>[[#enum|enum]]</code>型の値を誤って使用することが可能ですが、C++11以降は<code>[[#enum class|enum class]]</code>を使用することで型安全が提供されます。 * <code>[[#enum class|enum class]]</code>は、名前空間を提供することで異なる<code>[[#enum|enum]]</code>の衝突を避けることができます。 :<syntaxhighlight lang=c++ copy>enum class Color { Red, Green, Blue }; enum class Direction { North, South, East, West }; Color color = Color::Red; Direction dir = Direction::North;</syntaxhighlight> <code>[[#enum|enum]]</code>は、特に状態を管理するためや、特定のオプションを明確にするために、非常に便利な構文です。C++11以降では、型安全性が高まり、コードの誤使用を防ぐための機能が強化されました。 === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 ==== namespace ==== ==== using ==== === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>typename</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 ==== template ==== ==== typename ==== ==== class ==== === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 ==== alignas ==== ==== alignof ==== ==== decltype ==== ==== dynamic_cast ==== ==== static_cast ==== ==== reinterpret_cast ==== ==== const_cast ==== ==== sizeof ==== ==== typeid ==== === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 ==== try ==== ==== catch ==== ==== throw ==== ==== noexcept ==== === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ==== namespace ==== ==== using ==== ==== typedef ==== ==== using ==== ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] dyt4ur6xo8umgo0g69nqv72wqwesp9g 264190 264189 2024-11-25T11:04:08Z Ef3 694 /*template*/ C++のtemplateは、C++の最初の規格(C++98)から存在しており、型や値に依存しないコードの再利用を可能にする機能です。templateを使うことで、同じコードを異なるデータ型に対して適用することができ、汎用的なアルゴリズムやデータ構造を作成することができます。これにより、コードの可読性と保守性が向上します。/*typename */C++のtypenameは、C++の最初の規格(C++98)から存在しており、テンプレートの定義や特殊化で型を明示するために使用されるキーワードです。typenameは、テンプレートの型パラメータを指定したり、型依存式を解決するために重要な役割を果たします。また、typenameは型の名前をコンパイラに示すため、より明確で安全なコードを提供します。/*class C++におけるテンプレートの型引数としてのclassは、C++98から存在し、テンプレートを定義する際に型引数を指定するためのキーワードの1つです。 264190 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== C++の<code>[[#explicit|explicit]]</code>指定子は、'''C++98'''で導入されました。これはコンストラクタや変換演算子において、暗黙的な型変換を防ぐために使用され、コードの安全性と可読性を向上させます。 C++での<code>[[#explicit|explicit]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 暗黙的な型変換を禁止するための指定子。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit Example(int value) {} // 暗黙変換を禁止 }; Example e1 = 10; // エラー Example e2(10); // OK</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#explicit|explicit]]</code>を変換演算子にも適用可能に。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit operator bool() const { return true; } }; Example e; if (e) {} // OK(明示的変換) bool flag = e; // エラー(暗黙的変換は禁止)</syntaxhighlight> '''C++20''':条件付き<code>[[#explicit|explicit]]</code>の導入 * コンパイル時条件に基づき<code>[[#explicit|explicit]]</code>の適用を切り替え可能。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit((sizeof(int) > 2)) Example(int value) {} };</syntaxhighlight> <code>[[#explicit|explicit]]</code>の主な用途: # 暗黙的な型変換によるバグを防止 # コンストラクタや変換演算子の意図を明確化 # コードの可読性とメンテナンス性を向上 現代のC++では、<code>[[#explicit|explicit]]</code>は以下の場面で重要な役割を果たします: * 型の安全性を確保するためのAPI設計 * 意図しない型変換を防ぐ * 条件に基づく柔軟な指定 注意点: * <code>[[#explicit|explicit]]</code>を付け忘れると、予期しない暗黙的な型変換が発生する可能性があります。 * 暗黙変換が必要な場合には、あえて<code>[[#explicit|explicit]]</code>を省略する設計が必要です。 <code>[[#explicit|explicit]]</code>はクラス設計の一部として、他の指定子(<code>[[#constexpr|constexpr]]</code>や<code>[[#virtual|virtual]]</code>など)と組み合わせて使用されることが多く、コードの意図をより明確にするために不可欠な機能です。 ==== friend ==== C++の<code>[[#friend|friend]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しています。これは、クラスのプライベートメンバやプロテクテッドメンバに外部の関数や他のクラスからアクセスできるようにするために使用されます。 C++での<code>[[#friend|friend]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 関数やクラスを「友達」にすることでアクセスを許可。 :<syntaxhighlight lang=c++ copy>class Example { private: int value; public: Example(int v) : value(v) {} friend void printValue(const Example& e); // フレンド関数 }; void printValue(const Example& e) { std::cout << e.value << std::endl; // プライベートメンバにアクセス可能 }</syntaxhighlight> '''C++11以降''':機能の応用 * テンプレートとの組み合わせで柔軟性が向上。 :<syntaxhighlight lang=c++ copy>template <typename T> class Container { private: T data; public: Container(T d) : data(d) {} template <typename U> friend void printData(const Container<U>& c); // フレンドテンプレート }; template <typename U> void printData(const Container<U>& c) { std::cout << c.data << std::endl; }</syntaxhighlight> <code>[[#friend|friend]]</code>の主な用途: # クラスの内部データへの制限的なアクセスを提供 # 操作のために外部関数を許可 # テンプレートとの組み合わせで汎用性の向上 現代のC++では、<code>[[#friend|friend]]</code>は以下の場面で役立ちます: * 特定の外部関数にアクセス権を与える(例:入出力演算子の実装) * 相互アクセスが必要なクラス間の連携を実現 * プライベートメンバの安全な操作を可能に 注意点: * フレンド関数を多用するとカプセル化が損なわれる可能性があります。 * 乱用を避け、必要最小限の範囲に限定すべきです。 <code>[[#friend|friend]]</code>は、API設計や特定のユースケースで重要な役割を果たしますが、設計上の責任を明確にすることが求められます。他の指定子(<code>[[#const|const]]</code>や<code>[[#explicit|explicit]]</code>など)と併用して、安全かつ明確な設計を心がけることが重要です。 ==== virtual ==== C++の<code>[[#virtual|virtual]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しています。これは多態性(ポリモーフィズム)を実現するために使用され、派生クラスで関数をオーバーライドできるようにします。 C++での<code>[[#virtual|virtual]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 仮想関数を定義し、動的な関数呼び出しを実現。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() const override { // オーバーライド std::cout << "Derived class" << std::endl; } }; Base* b = new Derived(); b->show(); // "Derived class"(動的ディスパッチ)</syntaxhighlight> '''C++11''':機能の拡張 * <code>[[#override|override]]</code>と<code>[[#final|final]]</code>の導入により、意図の明確化と誤り防止が可能に。 :<syntaxhighlight lang=c++ copy>class Derived : public Base { public: void show() const override { /* ... */ } // 明示的オーバーライド }; class FinalDerived final : public Derived { // これ以上派生不可 void show() const override final { /* ... */ } // これ以上オーバーライド不可 };</syntaxhighlight> '''C++17'''以降:仮想関数テーブルの効率化や最適化が進化。 <code>[[#virtual|virtual]]</code>の主な用途: # 基底クラスの関数を派生クラスでオーバーライド可能に # 動的ポリモーフィズムを実現 # インターフェースの設計 # 共通の基底型での多態的な操作 現代のC++では、<code>[[#virtual|virtual]]</code>は以下の場面で重要な役割を果たします: * 抽象クラスの設計(純粋仮想関数によるインターフェースの提供) :<syntaxhighlight lang=c++ copy>class Abstract { public: virtual void doWork() const = 0; // 純粋仮想関数 };</syntaxhighlight> * 派生クラス間の動的な振る舞い * クラス階層の柔軟性を向上 注意点: * 仮想関数はランタイムでのオーバーヘッドが発生します。 * 仮想デストラクタを正しく定義することで、動的メモリ解放時の未定義動作を防ぐ。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual ~Base() {} // 仮想デストラクタ };</syntaxhighlight> <code>[[#virtual|virtual]]</code>は、C++のオブジェクト指向プログラミングの中核を担う指定子であり、正確な設計と適切な使用が求められます。他の指定子(<code>[[#override|override]]</code>、<code>[[#final|final]]</code>)と組み合わせることで、コードの安全性と可読性をさらに向上させます。 ==== override ==== C++の<code>[[#override|override]]</code>指定子は、'''C++11'''で導入されました。これは、仮想関数を派生クラスでオーバーライドする際に、意図を明確にし、間違いを防ぐために使用されます。 C++での<code>[[#override|override]]</code>の主な用途と進化: '''C++11''':基本的な機能 * 基底クラスの仮想関数を正しくオーバーライドしているかをコンパイル時にチェック。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() const override { // 正しいオーバーライド std::cout << "Derived class" << std::endl; } // void Show() const override; // エラー:関数名が異なる };</syntaxhighlight> '''C++17以降''':コンパイラのチェック機能がさらに洗練。 * <code>[[#override|override]]</code>の使用が推奨されるようになり、コードの安全性が向上。 <code>[[#override|override]]</code>の主な用途: # 基底クラスの仮想関数を正しくオーバーライドしていることを保証 # 関数名のタイポやシグネチャの不一致によるバグを防止 # コードの意図を明確化 現代のC++では、<code>[[#override|override]]</code>は以下の場面で重要です: * 仮想関数の正しい継承と動作確認 * 明示的な意図を示すことで、可読性と保守性を向上 注意点: * <code>[[#override|override]]</code>は、基底クラスの仮想関数に対してのみ使用可能。 * 基底クラスに仮想関数が存在しない場合、エラーが発生。 :<syntaxhighlight lang=c++ copy>class Base { void show() const {} // 仮想関数ではない }; class Derived : public Base { void show() const override {} // エラー:仮想関数でない };</syntaxhighlight> <code>[[#override|override]]</code>は、動的ポリモーフィズムを正確に実装するための必須要素であり、特に複雑なクラス階層での設計ミスを防ぐために重要です。<code>[[#final|final]]</code>と組み合わせることで、さらなる安全性と制御が可能です。 ==== final ==== C++の<code>[[#final|final]]</code>指定子は、'''C++11'''で導入されました。これは、クラスや仮想関数がさらに継承やオーバーライドされないことを明示するために使用されます。 C++での<code>[[#final|final]]</code>の主な用途と進化: '''C++11''':基本的な機能 * クラスや関数に対して継承やオーバーライドを禁止。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const {} }; class Derived final : public Base { // これ以上継承不可 void show() const override final { // これ以上オーバーライド不可 std::cout << "Derived class" << std::endl; } }; // class SubDerived : public Derived {}; // エラー:Derivedがfinal</syntaxhighlight> '''C++17以降''':最適化の恩恵がさらに強調される。 * <code>[[#final|final]]</code>指定子は仮想関数テーブルの効率化にも寄与。 <code>[[#final|final]]</code>の主な用途: # クラスや関数の設計意図を明示 # 継承やオーバーライドを防ぐことでコードを安定化 # 意図しない派生や仮想関数の再定義を防止 現代のC++では、<code>[[#final|final]]</code>は以下の場面で重要です: * 特定のクラスや関数を完全に固定化したい場合 * セキュリティやパフォーマンスを重視した設計 注意点: * クラスに<code>[[#final|final]]</code>を付与すると、それを基底クラスとして使用できません。 * 仮想関数に<code>[[#final|final]]</code>を付けた場合、それを派生クラスでオーバーライドするとエラーが発生。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void display() const {} }; class Derived : public Base { public: void display() const final {} // これ以上オーバーライド不可 }; // class SubDerived : public Derived { // void display() const {} // エラー:displayがfinal // };</syntaxhighlight> <code>[[#final|final]]</code>は設計時の意図を明確にし、予期しない動作や拡張を防ぐための強力なツールです。他の指定子(<code>[[#override|override]]</code>など)と併用することで、コードの安全性と可読性を向上させます。 ==== noexcept ==== C++の<code>[[#noexcept|noexcept]]</code>指定子は、'''C++11'''で導入され、関数が例外を投げないことを示すために使用されます。この指定子を使用することで、関数が例外をスローしないという保証をコンパイラに伝え、最適化の機会を提供します。 C++での<code>[[#noexcept|noexcept]]</code>の主な用途と進化: '''C++11''':基本的な機能 * 関数が例外を投げないことを宣言し、コンパイラによる最適化を促進。 :<syntaxhighlight lang=c++ copy>void foo() noexcept { // 例外を投げない関数 // 例外をスローしない } void bar() { // noexcept指定なし // 例外をスローする可能性がある }</syntaxhighlight> '''C++17''':<code>[[#noexcept|noexcept]]</code>の推論強化 * コンパイラが関数が例外を投げるかどうかを自動的に推論できるように強化されました。 :<syntaxhighlight lang=c++ copy>void func() noexcept(noexcept(foo())) { // foo()がnoexceptかどうかに基づいて決定 // 処理 }</syntaxhighlight> '''C++20''':<code>[[#noexcept|noexcept]]</code>と条件付きで最適化される場合が強調される。 * より複雑な関数やラムダ式にも対応。 :<syntaxhighlight lang=c++ copy>auto lambda = []() noexcept { // 例外を投げないラムダ };</syntaxhighlight> <code>[[#noexcept|noexcept]]</code>の主な用途: # 関数が例外をスローしないことを保証 # コンパイラによる最適化の支援(特に関数ポインタやラムダの使用時) # コードの意図を明確化(例外を投げない関数と投げる関数を明示的に区別) 現代のC++では、<code>[[#noexcept|noexcept]]</code>は以下の場面で重要です: * 最適化の機会を提供(例外処理の回避) * API設計における意図の明示(例外を投げないことを保証) * パフォーマンスの向上(特に例外処理を伴うコードにおいて) 注意点: * <code>[[#noexcept|noexcept]]</code>指定を持つ関数が実際に例外を投げると、<code>std::terminate()</code>が呼ばれ、プログラムが終了します。 * 既存のコードに対して<code>[[#noexcept|noexcept]]</code>を付ける際には、関数の内部で実際に例外を投げないことを確認する必要があります。 :<syntaxhighlight lang=c++ copy>void example() noexcept { throw std::runtime_error("This will cause std::terminate()"); // エラー:noexcept関数内で例外を投げてはいけない }</syntaxhighlight> <code>[[#noexcept|noexcept]]</code>は、コードの安全性を確保し、例外を投げない関数を設計する際に非常に有用です。また、例外を投げない関数がパフォーマンス向上に寄与するため、最適化が可能となります。 === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== C++の<code>[[#class|class]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、オブジェクト指向プログラミングの基盤となる構造体を定義するために使用されます。<code>[[#class|class]]</code>は、データと関数を1つの単位としてまとめ、カプセル化を提供します。 C++での<code>[[#class|class]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#class|class]]</code>はデータメンバとメンバ関数を持つ型を定義するために使用されます。デフォルトでは、<code>[[#class|class]]</code>のメンバは<code>[[#private|private]]</code>です。 :<syntaxhighlight lang=c++ copy>class Person { private: std::string name; // データメンバ(private) int age; // データメンバ(private) public: // コンストラクタ Person(std::string n, int a) : name(n), age(a) {} // メンバ関数 void setName(std::string n) { name = n; } std::string getName() const { return name; } void setAge(int a) { age = a; } int getAge() const { return age; } };</syntaxhighlight> '''C++11''':機能拡張 * コンストラクタの初期化リストの簡素化や、<code>[[#explicit|explicit]]</code>指定子、<code>[[#override|override]]</code>や<code>[[#final|final]]</code>などが導入されました。 :<syntaxhighlight lang=c++ copy>class Employee { public: std::string name; explicit Employee(std::string n) : name(std::move(n)) {} void printName() const { std::cout << name << std::endl; } };</syntaxhighlight> '''C++17''':<code>[[#class|class]]</code>のデータメンバの型推論(<code>[[#auto|auto]]</code>)が追加される。 * <code>[[#auto|auto]]</code>を使った型推論が可能になり、コンパイル時に型が決定されます。 :<syntaxhighlight lang=c++ copy>class Container { auto value = 42; // 型は自動的にintと推測される public: auto getValue() const { return value; } };</syntaxhighlight> '''C++20''':コンセプト(<code>[[#concepts|concepts]]</code>)とともに、型の制約をクラスのメンバ関数に適用する方法が強化されました。 :<syntaxhighlight lang=c++ copy>template <typename T> class Box { public: T value; Box(T val) : value(val) {} auto getValue() const { return value; } };</syntaxhighlight> <code>[[#class|class]]</code>の主な用途: # データのカプセル化と保護(<code>[[#private|private]]</code>メンバ) # 関数やメンバの動作を隠蔽(<code>[[#private|private]]</code>メンバ関数) # オブジェクト指向プログラミングの基本概念(継承、ポリモーフィズム、カプセル化) # 型安全を提供(メンバ関数とデータの結びつき) 現代のC++では、<code>[[#class|class]]</code>は以下の場面で重要です: * 複雑なデータ構造の定義と操作のカプセル化 * 継承とポリモーフィズムによるコードの再利用 * データの安全なアクセス管理(アクセス制御、メンバ関数の使用) * コンストラクタ、デストラクタによるオブジェクトの初期化・クリーンアップ 注意点: * <code>[[#class|class]]</code>と<code>[[#struct|struct]]</code>は非常に似ていますが、<code>[[#class|class]]</code>のデフォルトアクセス修飾子は<code>[[#private|private]]</code>であり、<code>[[#struct|struct]]</code>のデフォルトは<code>[[#public|public]]</code>です。 * <code>[[#class|class]]</code>は通常、データとメソッドを隠蔽するために使われ、<code>[[#struct|struct]]</code>はデータ構造として用いられることが多いです。 :<syntaxhighlight lang=c++ copy>class MyClass { private: int x; // デフォルトでprivate public: void setX(int val) { x = val; } }; struct MyStruct { int x; // デフォルトでpublic };</syntaxhighlight> <code>[[#class|class]]</code>はC++のオブジェクト指向設計の中心的な要素であり、強力な機能と柔軟性を提供します。データの隠蔽、継承、ポリモーフィズムを活用し、複雑なシステムを管理しやすくします。 ==== struct ==== C++の<code>[[#struct|struct]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、主にデータ構造を定義するために使用されます。<code>[[#struct|struct]]</code>は、C言語から継承されたもので、C++の<code>[[#class|class]]</code>と非常に似ていますが、デフォルトのアクセス修飾子が異なります。 C++での<code>[[#struct|struct]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#struct|struct]]</code>はデータメンバを持つ型を定義するために使用されます。デフォルトでは、<code>[[#struct|struct]]</code>のメンバは<code>[[#public|public]]</code>です。 :<syntaxhighlight lang=c++ copy>struct Person { std::string name; // データメンバ(public) int age; // データメンバ(public) // コンストラクタ Person(std::string n, int a) : name(n), age(a) {} // メンバ関数 void setName(std::string n) { name = n; } std::string getName() const { return name; } void setAge(int a) { age = a; } int getAge() const { return age; } };</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#struct|struct]]</code>でもメンバ関数を定義したり、コンストラクタ、デストラクタを使ったりすることができるようになり、<code>[[#class|class]]</code>とほぼ同等の機能が使えるようになりました。 * <code>[[#explicit|explicit]]</code>指定子や<code>[[#override|override]]</code>、<code>[[#final|final]]</code>などの機能も<code>[[#struct|struct]]</code>に適用できるようになりました。 :<syntaxhighlight lang=c++ copy>struct Employee { std::string name; explicit Employee(std::string n) : name(std::move(n)) {} void printName() const { std::cout << name << std::endl; } };</syntaxhighlight> '''C++17''':<code>[[#struct|struct]]</code>で<code>[[#auto|auto]]</code>を使った型推論がサポートされるようになりました。 * <code>[[#auto|auto]]</code>を使うことで、<code>[[#struct|struct]]</code>のデータメンバの型推論が可能になります。 :<syntaxhighlight lang=c++ copy>struct Container { auto value = 42; // 型は自動的にintと推測される public: auto getValue() const { return value; } };</syntaxhighlight> '''C++20''':構造体でも<code>[[#concepts|concepts]]</code>(型制約)を使うことができるようになり、<code>[[#struct|struct]]</code>内でもテンプレート型に制約を付けることができました。 :<syntaxhighlight lang=c++ copy>template <typename T> struct Box { T value; explicit Box(T val) : value(val) {} auto getValue() const { return value; } };</syntaxhighlight> <code>[[#struct|struct]]</code>の主な用途: # 単純なデータ構造の定義(例えば、複数の関連データを1つにまとめる) # オブジェクト指向のカプセル化(<code>[[#struct|struct]]</code>でもメンバ関数、コンストラクタなどを使用可能) # ユーザー定義の型を作成 # 他のクラスとの簡単なインターフェース(<code>[[#struct|struct]]</code>は<code>[[#class|class]]</code>とほぼ同等の機能を持つ) 現代のC++では、<code>[[#struct|struct]]</code>は以下の場面で重要です: * シンプルなデータ構造を作成 * APIやライブラリでのデータパッケージング * 高度なオブジェクト指向設計にも使用可能(ただし、<code>[[#struct|struct]]</code>のデフォルトメンバは<code>[[#public|public]]</code>であるため、カプセル化が必要な場合は<code>[[#class|class]]</code>が選ばれることが多い) 注意点: * <code>[[#struct|struct]]</code>と<code>[[#class|class]]</code>の違いは、デフォルトのアクセス修飾子の違いだけです。<code>[[#struct|struct]]</code>のメンバはデフォルトで<code>[[#public|public]]</code>、<code>[[#class|class]]</code>のメンバはデフォルトで<code>[[#private|private]]</code>です。 * <code>[[#struct|struct]]</code>は、通常はシンプルなデータ構造を定義するために使用されますが、<code>[[#class|class]]</code>と同様にメンバ関数やコンストラクタ、デストラクタを持つことができます。 :<syntaxhighlight lang=c++ copy>struct Point { int x; // デフォルトでpublic int y; // デフォルトでpublic // コンストラクタ Point(int a, int b) : x(a), y(b) {} // メンバ関数 void move(int dx, int dy) { x += dx; y += dy; } };</syntaxhighlight> <code>[[#struct|struct]]</code>は、C++においてシンプルなデータ構造の定義を行うために非常に便利ですが、<code>[[#class|class]]</code>と異なり、デフォルトでアクセス修飾子が<code>[[#public|public]]</code>であるため、カプセル化を意識した設計が求められます。 ==== union ==== C++の<code>[[#union|union]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、異なる型のデータを同じメモリ領域に格納するために使用されます。<code>[[#union|union]]</code>は、1つのメモリブロックを複数の異なる型で使い回すことで、メモリの使用効率を高めます。各メンバは同じメモリ領域を共有し、そのサイズは最大のメンバ型に合わせられます。 C++での<code>[[#union|union]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#union|union]]</code>を使用することで、異なるデータ型を同じメモリ空間で扱います。複数の型のデータを必要に応じて格納できますが、同時に格納できるのは1つだけです。 :<syntaxhighlight lang=c++ copy>union Data { int i; float f; char c; }; Data d; d.i = 10; // 整数を格納 d.f = 3.14f; // 浮動小数点数を格納(以前のデータは上書きされる) d.c = 'A'; // 文字を格納(以前のデータは再び上書きされる)</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#union|union]]</code>内でもコンストラクタ、デストラクタ、メンバ関数を定義できるようになりました。 * C++11では、<code>[[#union|union]]</code>内での<code>[[#constexpr|constexpr]]</code>の使用が可能になり、コンパイル時の定数を扱うことができるようになりました。 :<syntaxhighlight lang=c++ copy>union Example { int i; float f; constexpr Example(int x) : i(x) {} // C++11以降、コンストラクタが使える };</syntaxhighlight> '''C++14''':さらに機能強化 * C++14では、<code>[[#union|union]]</code>内に非静的なメンバ関数を定義できるようになり、メンバの使い方が柔軟になりました。 * また、<code>[[#union|union]]</code>のメンバに<code>[[#delete|delete]]</code>や<code>[[#default|default]]</code>を使うことも可能になりました。 :<syntaxhighlight lang=c++ copy>union MyUnion { int i; double d; MyUnion() = delete; // unionのデフォルトコンストラクタを削除 };</syntaxhighlight> '''C++17''':新しい機能 * <code>std::variant</code>が導入され、<code>[[#union|union]]</code>の代替として型安全な方法で異なる型のデータを扱えるようになりました。<code>std::variant</code>は型情報を保持し、<code>[[#union|union]]</code>のようにメモリを上書きせずに異なる型を安全に取り扱うことができます。 :<syntaxhighlight lang=c++ copy>#include <variant> std::variant<int, float, char> var; var = 3; // int var = 3.14f; // float var = 'A'; // char</syntaxhighlight> <code>[[#union|union]]</code>の主な用途: # メモリ効率の向上(異なる型を同じメモリ領域に格納) # 型が異なるデータを1つのデータ構造内で取り扱う # データの互換性がある場合に複数の型を使い分ける # 特定のデータ型が必要な場合に使う(例:ビットフィールドやネットワーク通信のデータ処理) 現代のC++では、<code>[[#union|union]]</code>は以下の場面で重要な役割を果たします: * メモリ効率が重要な場面(特にリソース制約が厳しい環境) * 複数の異なる型のデータを共有メモリ空間で管理する必要がある場合 * 型が明確で、同時に格納しないことが保証されている場合 '''注意点''': * <code>[[#union|union]]</code>の各メンバは同じメモリ空間を共有しており、1度に1つのメンバだけが有効です。他のメンバに格納されたデータは上書きされます。 * <code>[[#union|union]]</code>を使う場合、どのメンバが現在有効であるかを把握するために、追加の管理コードが必要になる場合があります。 * <code>[[#union|union]]</code>内でポインタ型を使う際は、データ型の整合性を確保することが重要です。ポインタが指すメモリ領域の内容が異なる可能性があるためです。 :<syntaxhighlight lang=c++ copy>union IntFloat { int i; float f; }; IntFloat u; u.i = 42; std::cout << u.i << std::endl; // 出力: 42 u.f = 3.14f; std::cout << u.i << std::endl; // 出力: データが上書きされているので予測不可能</syntaxhighlight> 現代のC++では、<code>[[#union|union]]</code>よりも<code>std::variant</code>や<code>std::optional</code>などの型安全な代替手段が好まれることが多いですが、メモリ効率が重要な低レベルプログラミングや、特定のデータ構造の設計では引き続き利用されることがあります。 ==== enum ==== C++の<code>[[#enum|enum]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、名前付きの整数型定数をグループ化するための機能です。<code>[[#enum|enum]]</code>を使用することで、コードの可読性やメンテナンス性が向上します。また、<code>[[#enum|enum]]</code>には定数のセットを定義するだけでなく、その定義に基づいて変数を宣言することができます。 C++での<code>[[#enum|enum]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#enum|enum]]</code>を使って、整数値に名前を付けてグループ化することができます。デフォルトでは、最初の定数には0が割り当てられ、以降は1ずつ増加します。 :<syntaxhighlight lang=c++ copy>enum Color { Red, // 0 Green, // 1 Blue // 2 }; Color c = Red; // Color型の変数cにRedを代入</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#enum class|enum class]]</code>の導入により、<code>[[#enum|enum]]</code>は名前空間で囲まれ、型の安全性が強化されました。これにより、<code>[[#enum|enum]]</code>の値が異なる<code>[[#enum|enum]]</code>型間で誤って使用されることを防げるようになりました。 :<syntaxhighlight lang=c++ copy>enum class Color { Red, // 値は自動的に整数型で、Redは0 Green, // Greenは1 Blue // Blueは2 }; Color c = Color::Red; // 名前空間を使って指定</syntaxhighlight> '''C++14''':改善された機能 * <code>[[#enum class|enum class]]</code>で型を指定することができ、さらに可読性を向上させるために、基になる型を指定することができます。 :<syntaxhighlight lang=c++ copy>enum class Color : unsigned int { Red, Green, Blue };</syntaxhighlight> '''C++17''':新しい機能 * <code>[[#enum class|enum class]]</code>に関する変更は特になく、引き続き強力な型安全機能がサポートされています。 <code>[[#enum|enum]]</code>の主な用途: # 定数のグループ化 # 可読性の向上(数字の代わりに意味のある名前を使用) # 名前空間やスコープの管理(<code>[[#enum class|enum class]]</code>を使用することで、グローバルな名前の衝突を防止) # 型安全な列挙型を作成する(<code>[[#enum class|enum class]]</code>) 現代のC++では、<code>[[#enum|enum]]</code>は以下の場面で重要な役割を果たします: * 定数の集合を定義することで、コードの可読性や保守性を向上させる * 状態やオプションのフラグを管理する * 列挙型の値が予測可能であることを保証するため、<code>[[#enum class|enum class]]</code>による型安全を活用する * 数値を直接扱わず、意味のある名前を使うことで意図を明確に伝える :<syntaxhighlight lang=c++ copy>enum class Status { OK = 0, Warning = 1, Error = 2 }; Status status = Status::OK; if (status == Status::Error) { // エラーハンドリング }</syntaxhighlight> '''注意点''': * <code>[[#enum|enum]]</code>の値はデフォルトで整数型として扱われ、必要に応じて明示的に型を指定できます。 * <code>[[#enum|enum]]</code>は型安全ではなく、他の<code>[[#enum|enum]]</code>型の値を誤って使用することが可能ですが、C++11以降は<code>[[#enum class|enum class]]</code>を使用することで型安全が提供されます。 * <code>[[#enum class|enum class]]</code>は、名前空間を提供することで異なる<code>[[#enum|enum]]</code>の衝突を避けることができます。 :<syntaxhighlight lang=c++ copy>enum class Color { Red, Green, Blue }; enum class Direction { North, South, East, West }; Color color = Color::Red; Direction dir = Direction::North;</syntaxhighlight> <code>[[#enum|enum]]</code>は、特に状態を管理するためや、特定のオプションを明確にするために、非常に便利な構文です。C++11以降では、型安全性が高まり、コードの誤使用を防ぐための機能が強化されました。 === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 ==== namespace ==== ==== using ==== === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>[[#typename|typename]]</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 * <code>[[#concept|concept]]</code>:テンプレートの引数に対して制約を設ける。 ==== template ==== C++の<code>[[#template|template]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、型や値に依存しないコードの再利用を可能にする機能です。<code>[[#template|template]]</code>を使うことで、同じコードを異なるデータ型に対して適用することができ、汎用的なアルゴリズムやデータ構造を作成することができます。これにより、コードの可読性と保守性が向上します。 C++での<code>[[#template|template]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#template|template]]</code>は、関数やクラスに対して、型を指定せずに再利用可能なコードを記述するための機能です。 :<syntaxhighlight lang=c++ copy>// 関数テンプレートの例 template <typename T> T add(T a, T b) { return a + b; } int main() { int x = add(1, 2); // int型 double y = add(1.1, 2.2); // double型 }</syntaxhighlight> * <code>[[#template|template]]</code>を使用することで、異なる型に対して同じ関数を再利用できます。 '''C++11''':機能拡張 * <code>[[#auto|auto]]</code>キーワードとラムダ式により、テンプレートの使い方が簡略化され、可読性が向上しました。 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数をテンプレートで使用することが可能になりました。 :<syntaxhighlight lang=c++ copy>template <typename T> constexpr T square(T x) { return x * x; }</syntaxhighlight> * テンプレートの引数にデフォルト値を指定することも可能になりました。 :<syntaxhighlight lang=c++ copy>template <typename T = int> T multiply(T a, T b) { return a * b; }</syntaxhighlight> '''C++14''':機能拡張 * 変数テンプレートの導入により、テンプレート引数として変数も扱えるようになりました。 :<syntaxhighlight lang=c++ copy>template <typename T> T max_value = T(10); // デフォルトでT型の最大値を設定</syntaxhighlight> '''C++17''':新しい機能 * <code>[[#if constexpr|if constexpr]]</code>の導入により、コンパイル時の条件によってテンプレートの選択ができるようになりました。 :<syntaxhighlight lang=c++ copy>template <typename T> void print(T value) { if constexpr (std::is_integral<T>::value) { std::cout << "整数型の値: " << value << std::endl; } else { std::cout << "その他の型の値: " << value << std::endl; } }</syntaxhighlight> '''C++20''':機能拡張 * コンセプト(Concepts)の導入により、テンプレートの引数に制約を付けることができ、テンプレートの使い方に制限を加えることができました。 :<syntaxhighlight lang=c++ copy>template <typename T> concept Incrementable = requires(T a) { { ++a } -> std::same_as<T&>; }; template <Incrementable T> T increment(T value) { return ++value; }</syntaxhighlight> <code>[[#template|template]]</code>の主な用途: # 型に依存しないコードの再利用 # 汎用的なアルゴリズムやデータ構造の作成 # コンパイル時に型の確認を行い、エラーを早期に発見 # 型に対する制約(C++20のコンセプト)や条件による分岐 現代のC++では、<code>[[#template|template]]</code>は以下の場面で重要な役割を果たします: * 汎用的な関数やクラスを作成するために使用 * 同じ処理を異なる型に適用する際に再利用 * 型制約やコンセプトを活用して、安全で明確なコードを実現 * コンパイル時定数や条件付きテンプレートを活用して、最適化やエラーチェックを行う :<syntaxhighlight lang=c++ copy>template <typename T> T max(T a, T b) { return (a > b) ? a : b; } int main() { std::cout << max(3, 5) << std::endl; // int型 std::cout << max(3.14, 2.71) << std::endl; // double型 }</syntaxhighlight> '''注意点''': * テンプレートは型に依存しないため、同じコードを異なる型に対して適用できますが、テンプレートのインスタンス化はコンパイル時に行われるため、非常に大きなコードを生成する可能性があることに注意が必要です。 * C++20で導入されたコンセプトや、条件付きテンプレートを使うことで、より柔軟で型安全なコードを記述することができます。 テンプレートは、汎用的なアルゴリズムやデータ構造を作成する際に非常に便利な機能であり、C++の強力なツールの一つです。 ==== typename ==== C++の<code>[[#typename|typename]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、テンプレートの定義や特殊化で型を明示するために使用されるキーワードです。<code>[[#typename|typename]]</code>は、テンプレートの型パラメータを指定したり、型依存式を解決するために重要な役割を果たします。また、<code>[[#typename|typename]]</code>は型の名前をコンパイラに示すため、より明確で安全なコードを提供します。 C++での<code>[[#typename|typename]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#typename|typename]]</code>は、テンプレートパラメータとして型を指定するために使用されます。テンプレートの引数に型を指定することで、汎用的な関数やクラスを作成することができます。 :<syntaxhighlight lang=c++ copy>// テンプレート引数としてtypenameを使う template <typename T> T add(T a, T b) { return a + b; } int main() { int x = add(1, 2); // int型 double y = add(1.1, 2.2); // double型 }</syntaxhighlight> * また、型を指定することで、コンパイル時に型の不一致を防ぐことができます。 '''C++11''':機能拡張 * 型依存式の解決に<code>[[#typename|typename]]</code>が必要となる場面が増えました。たとえば、テンプレートのメンバ型にアクセスする場合に、<code>[[#typename|typename]]</code>を使う必要があります。 :<syntaxhighlight lang=c++ copy>template <typename T> void print_first(T t) { typename T::value_type first = t.front(); // Tがコンテナ型のとき std::cout << first << std::endl; }</syntaxhighlight> * <code>[[#typename|typename]]</code>は、コンテナクラスやテンプレートのメンバ型を明示的に指示するためにも使われます。 '''C++14'''以降:型の依存式の解決と可読性の向上 * 型依存式における明示的な指定の際、<code>[[#typename|typename]]</code>の使い方がさらに重要となり、より多くの場面で型を明確にするために利用されます。 '''C++17''':機能拡張 * <code>[[#if constexpr|if constexpr]]</code>の導入により、<code>[[#typename|typename]]</code>が不要な場合もありますが、依然として型依存式の解決において重要です。 :<syntaxhighlight lang=c++ copy>template <typename T> void print(T value) { if constexpr (std::is_integral<T>::value) { std::cout << "整数型の値: " << value << std::endl; } else { std::cout << "その他の型の値: " << value << std::endl; } }</syntaxhighlight> <code>[[#typename|typename]]</code>の主な用途: # テンプレート引数として型を指定 # 型依存式の解決(例えば、メンバ型や型の名前にアクセスする際) # テンプレートメタプログラミングにおける型の明示的指定 # 型を指定することでコンパイル時エラーを防ぐ 現代のC++では、<code>[[#typename|typename]]</code>は以下の場面で重要な役割を果たします: * テンプレート引数を使用して汎用的なコードを作成 * 型依存式の解決 * より複雑なテンプレートメタプログラミングを実現 * コンパイラに型名を明示することで、型の不一致やエラーを防ぐ :<syntaxhighlight lang=c++ copy>template <typename T> void display_first_element(const T& container) { typename T::value_type first = container.front(); std::cout << first << std::endl; }</syntaxhighlight> '''注意点''': * <code>[[#typename|typename]]</code>は、型依存式を解決する際に必要であり、型名を明示することでコンパイラが型を正しく認識できるようにします。 * 型の依存関係やメンバ型へのアクセス時に使用されるため、テンプレートプログラミングや型を扱うコードでは欠かせないキーワードです。 <code>[[#typename|typename]]</code>は、C++における型安全性とコードの柔軟性を高めるために重要な役割を果たします。 ==== class ==== C++におけるテンプレートの型引数としての'''<code>[[#class|class]]</code>'''は、'''C++98'''から存在し、テンプレートを定義する際に型引数を指定するためのキーワードの1つです。<code>[[#class|class]]</code>は、テンプレート引数に型(クラス、構造体、あるいは任意の型)を指定するために使用され、<code>[[#typename|typename]]</code>とほぼ同じ意味を持ちます。ただし、<code>[[#class|class]]</code>は型を示すために使用され、<code>[[#typename|typename]]</code>は型名を明示的に指定する場面で使われます。 C++でのテンプレートの型引数としての'''<code>[[#class|class]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#class|class]]</code>をテンプレートの型引数として使用することで、テンプレートを型に対して汎用的に適用できます。これは、特定の型に依存せず、任意の型に対して動作する関数やクラスを作成するために利用されます。 :<syntaxhighlight lang=c++ copy>// classをテンプレート型引数として使用 template <class T> T add(T a, T b) { return a + b; } int main() { int x = add(1, 2); // int型 double y = add(1.1, 2.2); // double型 }</syntaxhighlight> * このように、<code>[[#class|class]]</code>は型を引数として受け取り、関数やクラスの定義を汎用化します。 '''C++11''':機能拡張 * C++11では、<code>[[#class|class]]</code>は引き続き型を指定するために使われるものの、<code>[[#typename|typename]]</code>との違いが明確になります。実際には、<code>[[#class|class]]</code>と<code>[[#typename|typename]]</code>は互換的に使用できるため、両者の使用には特に大きな違いはありません。しかし、<code>[[#class|class]]</code>は一般的に「クラス」という意味合いが強いため、直感的に「型」として理解されます。 :<syntaxhighlight lang=c++ copy>template <class T> void print(const T& obj) { std::cout << obj << std::endl; }</syntaxhighlight> * <code>[[#typename|typename]]</code>と違い、<code>[[#class|class]]</code>というキーワードは、主にクラス型を引数にする場合に使われることが多いですが、実際には任意の型に対しても利用可能です。 '''C++17'''以降:さらなる進化 * <code>[[#class|class]]</code>は依然として型引数として使用されますが、<code>[[#typename|typename]]</code>と同じ意味で使用される場面が増えています。特にテンプレート引数で型を指定する際、<code>[[#class|class]]</code>を使うことは非常に一般的であり、<code>[[#typename|typename]]</code>と差異はほとんどありません。 :<syntaxhighlight lang=c++ copy>template <class T> void display_type(const T& obj) { std::cout << typeid(obj).name() << std::endl; }</syntaxhighlight> '''C++20''':新しい機能に対応 * C++20でも、<code>[[#class|class]]</code>は引き続きテンプレートの型引数として使用されますが、テンプレートの制約や概念(<code>[[#concepts|concepts]]</code>)の導入により、テンプレート型引数に関する新しいアプローチが登場しました。例えば、特定の型に対して制約を追加することができます。 :<syntaxhighlight lang=c++ copy>template <class T> concept Incrementable = requires(T x) { ++x; }; template <Incrementable T> T increment(T value) { return ++value; }</syntaxhighlight> <code>[[#class|class]]</code>の主な用途: # 型引数として使用し、テンプレートを汎用的に定義 # 任意の型を引数に取り、異なる型で動作する関数やクラスを実装 # <code>[[#typename|typename]]</code>と同様に、型依存式やメンバ型の解決に使用 現代のC++では、<code>[[#class|class]]</code>は以下の場面で重要な役割を果たします: * テンプレート引数に型を指定し、汎用的な関数やクラスを作成 * 型に依存しないコードを提供するため、任意の型で動作する関数やクラスを作成 * <code>[[#typename|typename]]</code>と同様に、型依存式の解決や、より安全で明確な型指定を行う :<syntaxhighlight lang=c++ copy>template <class T> T multiply(T a, T b) { return a * b; }</syntaxhighlight> '''注意点''': * <code>[[#class|class]]</code>は<code>[[#typename|typename]]</code>とほぼ同じ役割を果たしますが、C++98の初期では<code>[[#class|class]]</code>がより多く使われました。現在では、両者はほぼ同義で使われますが、<code>[[#typename|typename]]</code>の方が一般的になっています。 * <code>[[#class|class]]</code>は、特にクラス型のテンプレート引数を受け取る場合に使用されることが多いですが、任意の型に対しても使用可能です。 <code>[[#class|class]]</code>は、C++において汎用的なコードを作成するために重要な役割を果たしており、テンプレートの引数として使用することで、柔軟で再利用可能なコードを提供することができます。 ==== concept ==== C++20で導入された'''<code>[[concept|concept]]</code>'''は、テンプレートの引数に対して制約を設けるための新しい機能です。<code>[[concept|concept]]</code>を使用することで、テンプレート引数が特定の条件を満たしていることを保証でき、より安全で明確なコードを書くことができます。これにより、テンプレートの適用範囲を絞り込み、コンパイル時に型チェックを強化することができます。 C++での'''<code>[[concept|concept]]</code>'''の主な用途と進化: '''C++20''':新機能としての<code>[[concept|concept]]</code>の導入 * <code>[[concept|concept]]</code>は、テンプレート引数に対する制約を定義するために使用されます。これにより、テンプレートを適用する型が特定の条件を満たすかどうかを確認することができます。例えば、特定の型が加算可能であることを保証する<code>[[concept|concept]]</code>を定義することができます。 :<syntaxhighlight lang=c++ copy>// Conceptの定義 template <typename T> concept Addable = requires(T a, T b) { a + b; // Tが加算可能であることを要求 }; // Conceptを使ったテンプレート template <Addable T> T add(T a, T b) { return a + b; } int main() { int result = add(1, 2); // 正常 // add("hello", "world"); // コンパイルエラー: Addable制約に違反 }</syntaxhighlight> * <code>[[concept|concept]]</code>は、型が特定の操作をサポートしていることをコンパイル時にチェックするために使用されます。これにより、テンプレートの使用がより直感的になり、型の制約を明示的に表現できるようになりました。 '''C++20''':<code>[[concept|concept]]</code>を使った制約の具体例 * 例えば、<code>Addable</code>という<code>[[concept|concept]]</code>を使って、加算が可能な型のみを受け入れるテンプレート関数を定義することができます。 :<syntaxhighlight lang=c++ copy>template <typename T> concept Addable = requires(T a, T b) { a + b; }; template <Addable T> T add(T a, T b) { return a + b; } int main() { int sum = add(3, 4); // OK, 加算可能な型 // double result = add("a", "b"); // コンパイルエラー: Addableに一致しない型 }</syntaxhighlight> * <code>[[concept|concept]]</code>は、テンプレート関数やクラスに適用される引数に対する制約を定義することで、より明確で安全なコードを提供します。 '''C++20以降''':<code>[[concept|concept]]</code>の進化と活用 * C++20以降では、<code>[[concept|concept]]</code>を利用することで、テンプレート引数の制約をより簡単に記述できるようになり、特定の型が満たすべき条件を直感的に表現できます。例えば、<code>std::integral</code>や<code>std::floating_point</code>など、標準ライブラリには様々な組み込みの<code>[[concept|concept]]</code>が追加されています。これにより、コードの安全性と可読性が向上し、バグを未然に防ぐことができます。 :<syntaxhighlight lang=c++ copy>#include <concepts> template <std::integral T> T add(T a, T b) { return a + b; } int main() { int result = add(5, 10); // OK, integral型 // add(3.5, 2.5); // コンパイルエラー: integralに適合しない型 }</syntaxhighlight> <code>[[concept|concept]]</code>の主な用途: # 型に対する制約を定義し、テンプレートの適用範囲を絞り込む # コンパイル時に型が特定の条件を満たすかを検査し、エラーを早期に検出 # テンプレート引数に対して明確な要求を示し、意図が明確なコードを実現 # より安全で可読性の高いコードを提供 現代のC++では、<code>[[concept|concept]]</code>は以下の場面で重要な役割を果たします: * テンプレート関数やクラスにおける型の制約を明示化 * 型が満たすべき条件を正確に定義することで、テンプレートの使用をより直感的に * より強力なコンパイル時チェックにより、バグの予防とエラーの早期発見 '''注意点''': * <code>[[concept|concept]]</code>はC++20から導入された新しい機能であり、それ以前のバージョンのC++では使用できません。コンパイラによっては、C++20以降の仕様をサポートしていないものもあるため、使用する際はコンパイラのバージョンに注意が必要です。 * <code>[[concept|concept]]</code>を使うことで、型の制約をより直感的に表現できるため、テンプレートの使用が簡潔になります。 :<syntaxhighlight lang=c++ copy>template <typename T> concept Comparable = requires(T a, T b) { { a == b } -> std::same_as<bool>; }; template <Comparable T> bool is_equal(const T& a, const T& b) { return a == b; }</syntaxhighlight> <code>[[concept|concept]]</code>はC++における強力な型チェックツールであり、特にテンプレートを利用した汎用的なプログラムにおいて、コードの安全性と可読性を向上させるために重要な役割を果たします。 === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>const</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 ==== alignas ==== ==== alignof ==== ==== decltype ==== ==== dynamic_cast ==== ==== static_cast ==== ==== reinterpret_cast ==== ==== const_cast ==== ==== sizeof ==== ==== typeid ==== === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 ==== try ==== ==== catch ==== ==== throw ==== ==== noexcept ==== === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ==== namespace ==== ==== using ==== ==== typedef ==== ==== using ==== ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] 525dd0f5myjfcpgh0711ygzhu0nwy01 264191 264190 2024-11-25T11:36:46Z Ef3 694 /*alignas*/ alignasは、C++11で導入されたキーワードで、変数や型に対して特定のアライメント(配置境界)を指定するために使用されます。アライメントは、メモリ内でデータがどのように配置されるかを制御するもので、特定のアライメントに合わせて変数を配置することで、パフォーマンスの向上やハードウェアの要件に適合させることができます。/*auto*/ autoは、C++11で導入されたキーワードで、変数の型を自動的に推論するために使用されます。これにより、プログラマが型を明示的に指定する手間を省き、コードの可読性と保守性が向上します。autoは、特にテンプレートや複雑な型が絡む場合に役立ちます。 264191 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== C++の<code>[[#explicit|explicit]]</code>指定子は、'''C++98'''で導入されました。これはコンストラクタや変換演算子において、暗黙的な型変換を防ぐために使用され、コードの安全性と可読性を向上させます。 C++での<code>[[#explicit|explicit]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 暗黙的な型変換を禁止するための指定子。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit Example(int value) {} // 暗黙変換を禁止 }; Example e1 = 10; // エラー Example e2(10); // OK</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#explicit|explicit]]</code>を変換演算子にも適用可能に。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit operator bool() const { return true; } }; Example e; if (e) {} // OK(明示的変換) bool flag = e; // エラー(暗黙的変換は禁止)</syntaxhighlight> '''C++20''':条件付き<code>[[#explicit|explicit]]</code>の導入 * コンパイル時条件に基づき<code>[[#explicit|explicit]]</code>の適用を切り替え可能。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit((sizeof(int) > 2)) Example(int value) {} };</syntaxhighlight> <code>[[#explicit|explicit]]</code>の主な用途: # 暗黙的な型変換によるバグを防止 # コンストラクタや変換演算子の意図を明確化 # コードの可読性とメンテナンス性を向上 現代のC++では、<code>[[#explicit|explicit]]</code>は以下の場面で重要な役割を果たします: * 型の安全性を確保するためのAPI設計 * 意図しない型変換を防ぐ * 条件に基づく柔軟な指定 注意点: * <code>[[#explicit|explicit]]</code>を付け忘れると、予期しない暗黙的な型変換が発生する可能性があります。 * 暗黙変換が必要な場合には、あえて<code>[[#explicit|explicit]]</code>を省略する設計が必要です。 <code>[[#explicit|explicit]]</code>はクラス設計の一部として、他の指定子(<code>[[#constexpr|constexpr]]</code>や<code>[[#virtual|virtual]]</code>など)と組み合わせて使用されることが多く、コードの意図をより明確にするために不可欠な機能です。 ==== friend ==== C++の<code>[[#friend|friend]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しています。これは、クラスのプライベートメンバやプロテクテッドメンバに外部の関数や他のクラスからアクセスできるようにするために使用されます。 C++での<code>[[#friend|friend]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 関数やクラスを「友達」にすることでアクセスを許可。 :<syntaxhighlight lang=c++ copy>class Example { private: int value; public: Example(int v) : value(v) {} friend void printValue(const Example& e); // フレンド関数 }; void printValue(const Example& e) { std::cout << e.value << std::endl; // プライベートメンバにアクセス可能 }</syntaxhighlight> '''C++11以降''':機能の応用 * テンプレートとの組み合わせで柔軟性が向上。 :<syntaxhighlight lang=c++ copy>template <typename T> class Container { private: T data; public: Container(T d) : data(d) {} template <typename U> friend void printData(const Container<U>& c); // フレンドテンプレート }; template <typename U> void printData(const Container<U>& c) { std::cout << c.data << std::endl; }</syntaxhighlight> <code>[[#friend|friend]]</code>の主な用途: # クラスの内部データへの制限的なアクセスを提供 # 操作のために外部関数を許可 # テンプレートとの組み合わせで汎用性の向上 現代のC++では、<code>[[#friend|friend]]</code>は以下の場面で役立ちます: * 特定の外部関数にアクセス権を与える(例:入出力演算子の実装) * 相互アクセスが必要なクラス間の連携を実現 * プライベートメンバの安全な操作を可能に 注意点: * フレンド関数を多用するとカプセル化が損なわれる可能性があります。 * 乱用を避け、必要最小限の範囲に限定すべきです。 <code>[[#friend|friend]]</code>は、API設計や特定のユースケースで重要な役割を果たしますが、設計上の責任を明確にすることが求められます。他の指定子(<code>[[#const|const]]</code>や<code>[[#explicit|explicit]]</code>など)と併用して、安全かつ明確な設計を心がけることが重要です。 ==== virtual ==== C++の<code>[[#virtual|virtual]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しています。これは多態性(ポリモーフィズム)を実現するために使用され、派生クラスで関数をオーバーライドできるようにします。 C++での<code>[[#virtual|virtual]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 仮想関数を定義し、動的な関数呼び出しを実現。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() const override { // オーバーライド std::cout << "Derived class" << std::endl; } }; Base* b = new Derived(); b->show(); // "Derived class"(動的ディスパッチ)</syntaxhighlight> '''C++11''':機能の拡張 * <code>[[#override|override]]</code>と<code>[[#final|final]]</code>の導入により、意図の明確化と誤り防止が可能に。 :<syntaxhighlight lang=c++ copy>class Derived : public Base { public: void show() const override { /* ... */ } // 明示的オーバーライド }; class FinalDerived final : public Derived { // これ以上派生不可 void show() const override final { /* ... */ } // これ以上オーバーライド不可 };</syntaxhighlight> '''C++17'''以降:仮想関数テーブルの効率化や最適化が進化。 <code>[[#virtual|virtual]]</code>の主な用途: # 基底クラスの関数を派生クラスでオーバーライド可能に # 動的ポリモーフィズムを実現 # インターフェースの設計 # 共通の基底型での多態的な操作 現代のC++では、<code>[[#virtual|virtual]]</code>は以下の場面で重要な役割を果たします: * 抽象クラスの設計(純粋仮想関数によるインターフェースの提供) :<syntaxhighlight lang=c++ copy>class Abstract { public: virtual void doWork() const = 0; // 純粋仮想関数 };</syntaxhighlight> * 派生クラス間の動的な振る舞い * クラス階層の柔軟性を向上 注意点: * 仮想関数はランタイムでのオーバーヘッドが発生します。 * 仮想デストラクタを正しく定義することで、動的メモリ解放時の未定義動作を防ぐ。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual ~Base() {} // 仮想デストラクタ };</syntaxhighlight> <code>[[#virtual|virtual]]</code>は、C++のオブジェクト指向プログラミングの中核を担う指定子であり、正確な設計と適切な使用が求められます。他の指定子(<code>[[#override|override]]</code>、<code>[[#final|final]]</code>)と組み合わせることで、コードの安全性と可読性をさらに向上させます。 ==== override ==== C++の<code>[[#override|override]]</code>指定子は、'''C++11'''で導入されました。これは、仮想関数を派生クラスでオーバーライドする際に、意図を明確にし、間違いを防ぐために使用されます。 C++での<code>[[#override|override]]</code>の主な用途と進化: '''C++11''':基本的な機能 * 基底クラスの仮想関数を正しくオーバーライドしているかをコンパイル時にチェック。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() const override { // 正しいオーバーライド std::cout << "Derived class" << std::endl; } // void Show() const override; // エラー:関数名が異なる };</syntaxhighlight> '''C++17以降''':コンパイラのチェック機能がさらに洗練。 * <code>[[#override|override]]</code>の使用が推奨されるようになり、コードの安全性が向上。 <code>[[#override|override]]</code>の主な用途: # 基底クラスの仮想関数を正しくオーバーライドしていることを保証 # 関数名のタイポやシグネチャの不一致によるバグを防止 # コードの意図を明確化 現代のC++では、<code>[[#override|override]]</code>は以下の場面で重要です: * 仮想関数の正しい継承と動作確認 * 明示的な意図を示すことで、可読性と保守性を向上 注意点: * <code>[[#override|override]]</code>は、基底クラスの仮想関数に対してのみ使用可能。 * 基底クラスに仮想関数が存在しない場合、エラーが発生。 :<syntaxhighlight lang=c++ copy>class Base { void show() const {} // 仮想関数ではない }; class Derived : public Base { void show() const override {} // エラー:仮想関数でない };</syntaxhighlight> <code>[[#override|override]]</code>は、動的ポリモーフィズムを正確に実装するための必須要素であり、特に複雑なクラス階層での設計ミスを防ぐために重要です。<code>[[#final|final]]</code>と組み合わせることで、さらなる安全性と制御が可能です。 ==== final ==== C++の<code>[[#final|final]]</code>指定子は、'''C++11'''で導入されました。これは、クラスや仮想関数がさらに継承やオーバーライドされないことを明示するために使用されます。 C++での<code>[[#final|final]]</code>の主な用途と進化: '''C++11''':基本的な機能 * クラスや関数に対して継承やオーバーライドを禁止。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const {} }; class Derived final : public Base { // これ以上継承不可 void show() const override final { // これ以上オーバーライド不可 std::cout << "Derived class" << std::endl; } }; // class SubDerived : public Derived {}; // エラー:Derivedがfinal</syntaxhighlight> '''C++17以降''':最適化の恩恵がさらに強調される。 * <code>[[#final|final]]</code>指定子は仮想関数テーブルの効率化にも寄与。 <code>[[#final|final]]</code>の主な用途: # クラスや関数の設計意図を明示 # 継承やオーバーライドを防ぐことでコードを安定化 # 意図しない派生や仮想関数の再定義を防止 現代のC++では、<code>[[#final|final]]</code>は以下の場面で重要です: * 特定のクラスや関数を完全に固定化したい場合 * セキュリティやパフォーマンスを重視した設計 注意点: * クラスに<code>[[#final|final]]</code>を付与すると、それを基底クラスとして使用できません。 * 仮想関数に<code>[[#final|final]]</code>を付けた場合、それを派生クラスでオーバーライドするとエラーが発生。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void display() const {} }; class Derived : public Base { public: void display() const final {} // これ以上オーバーライド不可 }; // class SubDerived : public Derived { // void display() const {} // エラー:displayがfinal // };</syntaxhighlight> <code>[[#final|final]]</code>は設計時の意図を明確にし、予期しない動作や拡張を防ぐための強力なツールです。他の指定子(<code>[[#override|override]]</code>など)と併用することで、コードの安全性と可読性を向上させます。 ==== noexcept ==== C++の<code>[[#noexcept|noexcept]]</code>指定子は、'''C++11'''で導入され、関数が例外を投げないことを示すために使用されます。この指定子を使用することで、関数が例外をスローしないという保証をコンパイラに伝え、最適化の機会を提供します。 C++での<code>[[#noexcept|noexcept]]</code>の主な用途と進化: '''C++11''':基本的な機能 * 関数が例外を投げないことを宣言し、コンパイラによる最適化を促進。 :<syntaxhighlight lang=c++ copy>void foo() noexcept { // 例外を投げない関数 // 例外をスローしない } void bar() { // noexcept指定なし // 例外をスローする可能性がある }</syntaxhighlight> '''C++17''':<code>[[#noexcept|noexcept]]</code>の推論強化 * コンパイラが関数が例外を投げるかどうかを自動的に推論できるように強化されました。 :<syntaxhighlight lang=c++ copy>void func() noexcept(noexcept(foo())) { // foo()がnoexceptかどうかに基づいて決定 // 処理 }</syntaxhighlight> '''C++20''':<code>[[#noexcept|noexcept]]</code>と条件付きで最適化される場合が強調される。 * より複雑な関数やラムダ式にも対応。 :<syntaxhighlight lang=c++ copy>auto lambda = []() noexcept { // 例外を投げないラムダ };</syntaxhighlight> <code>[[#noexcept|noexcept]]</code>の主な用途: # 関数が例外をスローしないことを保証 # コンパイラによる最適化の支援(特に関数ポインタやラムダの使用時) # コードの意図を明確化(例外を投げない関数と投げる関数を明示的に区別) 現代のC++では、<code>[[#noexcept|noexcept]]</code>は以下の場面で重要です: * 最適化の機会を提供(例外処理の回避) * API設計における意図の明示(例外を投げないことを保証) * パフォーマンスの向上(特に例外処理を伴うコードにおいて) 注意点: * <code>[[#noexcept|noexcept]]</code>指定を持つ関数が実際に例外を投げると、<code>std::terminate()</code>が呼ばれ、プログラムが終了します。 * 既存のコードに対して<code>[[#noexcept|noexcept]]</code>を付ける際には、関数の内部で実際に例外を投げないことを確認する必要があります。 :<syntaxhighlight lang=c++ copy>void example() noexcept { throw std::runtime_error("This will cause std::terminate()"); // エラー:noexcept関数内で例外を投げてはいけない }</syntaxhighlight> <code>[[#noexcept|noexcept]]</code>は、コードの安全性を確保し、例外を投げない関数を設計する際に非常に有用です。また、例外を投げない関数がパフォーマンス向上に寄与するため、最適化が可能となります。 === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== C++の<code>[[#class|class]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、オブジェクト指向プログラミングの基盤となる構造体を定義するために使用されます。<code>[[#class|class]]</code>は、データと関数を1つの単位としてまとめ、カプセル化を提供します。 C++での<code>[[#class|class]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#class|class]]</code>はデータメンバとメンバ関数を持つ型を定義するために使用されます。デフォルトでは、<code>[[#class|class]]</code>のメンバは<code>[[#private|private]]</code>です。 :<syntaxhighlight lang=c++ copy>class Person { private: std::string name; // データメンバ(private) int age; // データメンバ(private) public: // コンストラクタ Person(std::string n, int a) : name(n), age(a) {} // メンバ関数 void setName(std::string n) { name = n; } std::string getName() const { return name; } void setAge(int a) { age = a; } int getAge() const { return age; } };</syntaxhighlight> '''C++11''':機能拡張 * コンストラクタの初期化リストの簡素化や、<code>[[#explicit|explicit]]</code>指定子、<code>[[#override|override]]</code>や<code>[[#final|final]]</code>などが導入されました。 :<syntaxhighlight lang=c++ copy>class Employee { public: std::string name; explicit Employee(std::string n) : name(std::move(n)) {} void printName() const { std::cout << name << std::endl; } };</syntaxhighlight> '''C++17''':<code>[[#class|class]]</code>のデータメンバの型推論(<code>[[#auto|auto]]</code>)が追加される。 * <code>[[#auto|auto]]</code>を使った型推論が可能になり、コンパイル時に型が決定されます。 :<syntaxhighlight lang=c++ copy>class Container { auto value = 42; // 型は自動的にintと推測される public: auto getValue() const { return value; } };</syntaxhighlight> '''C++20''':コンセプト(<code>[[#concepts|concepts]]</code>)とともに、型の制約をクラスのメンバ関数に適用する方法が強化されました。 :<syntaxhighlight lang=c++ copy>template <typename T> class Box { public: T value; Box(T val) : value(val) {} auto getValue() const { return value; } };</syntaxhighlight> <code>[[#class|class]]</code>の主な用途: # データのカプセル化と保護(<code>[[#private|private]]</code>メンバ) # 関数やメンバの動作を隠蔽(<code>[[#private|private]]</code>メンバ関数) # オブジェクト指向プログラミングの基本概念(継承、ポリモーフィズム、カプセル化) # 型安全を提供(メンバ関数とデータの結びつき) 現代のC++では、<code>[[#class|class]]</code>は以下の場面で重要です: * 複雑なデータ構造の定義と操作のカプセル化 * 継承とポリモーフィズムによるコードの再利用 * データの安全なアクセス管理(アクセス制御、メンバ関数の使用) * コンストラクタ、デストラクタによるオブジェクトの初期化・クリーンアップ 注意点: * <code>[[#class|class]]</code>と<code>[[#struct|struct]]</code>は非常に似ていますが、<code>[[#class|class]]</code>のデフォルトアクセス修飾子は<code>[[#private|private]]</code>であり、<code>[[#struct|struct]]</code>のデフォルトは<code>[[#public|public]]</code>です。 * <code>[[#class|class]]</code>は通常、データとメソッドを隠蔽するために使われ、<code>[[#struct|struct]]</code>はデータ構造として用いられることが多いです。 :<syntaxhighlight lang=c++ copy>class MyClass { private: int x; // デフォルトでprivate public: void setX(int val) { x = val; } }; struct MyStruct { int x; // デフォルトでpublic };</syntaxhighlight> <code>[[#class|class]]</code>はC++のオブジェクト指向設計の中心的な要素であり、強力な機能と柔軟性を提供します。データの隠蔽、継承、ポリモーフィズムを活用し、複雑なシステムを管理しやすくします。 ==== struct ==== C++の<code>[[#struct|struct]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、主にデータ構造を定義するために使用されます。<code>[[#struct|struct]]</code>は、C言語から継承されたもので、C++の<code>[[#class|class]]</code>と非常に似ていますが、デフォルトのアクセス修飾子が異なります。 C++での<code>[[#struct|struct]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#struct|struct]]</code>はデータメンバを持つ型を定義するために使用されます。デフォルトでは、<code>[[#struct|struct]]</code>のメンバは<code>[[#public|public]]</code>です。 :<syntaxhighlight lang=c++ copy>struct Person { std::string name; // データメンバ(public) int age; // データメンバ(public) // コンストラクタ Person(std::string n, int a) : name(n), age(a) {} // メンバ関数 void setName(std::string n) { name = n; } std::string getName() const { return name; } void setAge(int a) { age = a; } int getAge() const { return age; } };</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#struct|struct]]</code>でもメンバ関数を定義したり、コンストラクタ、デストラクタを使ったりすることができるようになり、<code>[[#class|class]]</code>とほぼ同等の機能が使えるようになりました。 * <code>[[#explicit|explicit]]</code>指定子や<code>[[#override|override]]</code>、<code>[[#final|final]]</code>などの機能も<code>[[#struct|struct]]</code>に適用できるようになりました。 :<syntaxhighlight lang=c++ copy>struct Employee { std::string name; explicit Employee(std::string n) : name(std::move(n)) {} void printName() const { std::cout << name << std::endl; } };</syntaxhighlight> '''C++17''':<code>[[#struct|struct]]</code>で<code>[[#auto|auto]]</code>を使った型推論がサポートされるようになりました。 * <code>[[#auto|auto]]</code>を使うことで、<code>[[#struct|struct]]</code>のデータメンバの型推論が可能になります。 :<syntaxhighlight lang=c++ copy>struct Container { auto value = 42; // 型は自動的にintと推測される public: auto getValue() const { return value; } };</syntaxhighlight> '''C++20''':構造体でも<code>[[#concepts|concepts]]</code>(型制約)を使うことができるようになり、<code>[[#struct|struct]]</code>内でもテンプレート型に制約を付けることができました。 :<syntaxhighlight lang=c++ copy>template <typename T> struct Box { T value; explicit Box(T val) : value(val) {} auto getValue() const { return value; } };</syntaxhighlight> <code>[[#struct|struct]]</code>の主な用途: # 単純なデータ構造の定義(例えば、複数の関連データを1つにまとめる) # オブジェクト指向のカプセル化(<code>[[#struct|struct]]</code>でもメンバ関数、コンストラクタなどを使用可能) # ユーザー定義の型を作成 # 他のクラスとの簡単なインターフェース(<code>[[#struct|struct]]</code>は<code>[[#class|class]]</code>とほぼ同等の機能を持つ) 現代のC++では、<code>[[#struct|struct]]</code>は以下の場面で重要です: * シンプルなデータ構造を作成 * APIやライブラリでのデータパッケージング * 高度なオブジェクト指向設計にも使用可能(ただし、<code>[[#struct|struct]]</code>のデフォルトメンバは<code>[[#public|public]]</code>であるため、カプセル化が必要な場合は<code>[[#class|class]]</code>が選ばれることが多い) 注意点: * <code>[[#struct|struct]]</code>と<code>[[#class|class]]</code>の違いは、デフォルトのアクセス修飾子の違いだけです。<code>[[#struct|struct]]</code>のメンバはデフォルトで<code>[[#public|public]]</code>、<code>[[#class|class]]</code>のメンバはデフォルトで<code>[[#private|private]]</code>です。 * <code>[[#struct|struct]]</code>は、通常はシンプルなデータ構造を定義するために使用されますが、<code>[[#class|class]]</code>と同様にメンバ関数やコンストラクタ、デストラクタを持つことができます。 :<syntaxhighlight lang=c++ copy>struct Point { int x; // デフォルトでpublic int y; // デフォルトでpublic // コンストラクタ Point(int a, int b) : x(a), y(b) {} // メンバ関数 void move(int dx, int dy) { x += dx; y += dy; } };</syntaxhighlight> <code>[[#struct|struct]]</code>は、C++においてシンプルなデータ構造の定義を行うために非常に便利ですが、<code>[[#class|class]]</code>と異なり、デフォルトでアクセス修飾子が<code>[[#public|public]]</code>であるため、カプセル化を意識した設計が求められます。 ==== union ==== C++の<code>[[#union|union]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、異なる型のデータを同じメモリ領域に格納するために使用されます。<code>[[#union|union]]</code>は、1つのメモリブロックを複数の異なる型で使い回すことで、メモリの使用効率を高めます。各メンバは同じメモリ領域を共有し、そのサイズは最大のメンバ型に合わせられます。 C++での<code>[[#union|union]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#union|union]]</code>を使用することで、異なるデータ型を同じメモリ空間で扱います。複数の型のデータを必要に応じて格納できますが、同時に格納できるのは1つだけです。 :<syntaxhighlight lang=c++ copy>union Data { int i; float f; char c; }; Data d; d.i = 10; // 整数を格納 d.f = 3.14f; // 浮動小数点数を格納(以前のデータは上書きされる) d.c = 'A'; // 文字を格納(以前のデータは再び上書きされる)</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#union|union]]</code>内でもコンストラクタ、デストラクタ、メンバ関数を定義できるようになりました。 * C++11では、<code>[[#union|union]]</code>内での<code>[[#constexpr|constexpr]]</code>の使用が可能になり、コンパイル時の定数を扱うことができるようになりました。 :<syntaxhighlight lang=c++ copy>union Example { int i; float f; constexpr Example(int x) : i(x) {} // C++11以降、コンストラクタが使える };</syntaxhighlight> '''C++14''':さらに機能強化 * C++14では、<code>[[#union|union]]</code>内に非静的なメンバ関数を定義できるようになり、メンバの使い方が柔軟になりました。 * また、<code>[[#union|union]]</code>のメンバに<code>[[#delete|delete]]</code>や<code>[[#default|default]]</code>を使うことも可能になりました。 :<syntaxhighlight lang=c++ copy>union MyUnion { int i; double d; MyUnion() = delete; // unionのデフォルトコンストラクタを削除 };</syntaxhighlight> '''C++17''':新しい機能 * <code>std::variant</code>が導入され、<code>[[#union|union]]</code>の代替として型安全な方法で異なる型のデータを扱えるようになりました。<code>std::variant</code>は型情報を保持し、<code>[[#union|union]]</code>のようにメモリを上書きせずに異なる型を安全に取り扱うことができます。 :<syntaxhighlight lang=c++ copy>#include <variant> std::variant<int, float, char> var; var = 3; // int var = 3.14f; // float var = 'A'; // char</syntaxhighlight> <code>[[#union|union]]</code>の主な用途: # メモリ効率の向上(異なる型を同じメモリ領域に格納) # 型が異なるデータを1つのデータ構造内で取り扱う # データの互換性がある場合に複数の型を使い分ける # 特定のデータ型が必要な場合に使う(例:ビットフィールドやネットワーク通信のデータ処理) 現代のC++では、<code>[[#union|union]]</code>は以下の場面で重要な役割を果たします: * メモリ効率が重要な場面(特にリソース制約が厳しい環境) * 複数の異なる型のデータを共有メモリ空間で管理する必要がある場合 * 型が明確で、同時に格納しないことが保証されている場合 '''注意点''': * <code>[[#union|union]]</code>の各メンバは同じメモリ空間を共有しており、1度に1つのメンバだけが有効です。他のメンバに格納されたデータは上書きされます。 * <code>[[#union|union]]</code>を使う場合、どのメンバが現在有効であるかを把握するために、追加の管理コードが必要になる場合があります。 * <code>[[#union|union]]</code>内でポインタ型を使う際は、データ型の整合性を確保することが重要です。ポインタが指すメモリ領域の内容が異なる可能性があるためです。 :<syntaxhighlight lang=c++ copy>union IntFloat { int i; float f; }; IntFloat u; u.i = 42; std::cout << u.i << std::endl; // 出力: 42 u.f = 3.14f; std::cout << u.i << std::endl; // 出力: データが上書きされているので予測不可能</syntaxhighlight> 現代のC++では、<code>[[#union|union]]</code>よりも<code>std::variant</code>や<code>std::optional</code>などの型安全な代替手段が好まれることが多いですが、メモリ効率が重要な低レベルプログラミングや、特定のデータ構造の設計では引き続き利用されることがあります。 ==== enum ==== C++の<code>[[#enum|enum]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、名前付きの整数型定数をグループ化するための機能です。<code>[[#enum|enum]]</code>を使用することで、コードの可読性やメンテナンス性が向上します。また、<code>[[#enum|enum]]</code>には定数のセットを定義するだけでなく、その定義に基づいて変数を宣言することができます。 C++での<code>[[#enum|enum]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#enum|enum]]</code>を使って、整数値に名前を付けてグループ化することができます。デフォルトでは、最初の定数には0が割り当てられ、以降は1ずつ増加します。 :<syntaxhighlight lang=c++ copy>enum Color { Red, // 0 Green, // 1 Blue // 2 }; Color c = Red; // Color型の変数cにRedを代入</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#enum class|enum class]]</code>の導入により、<code>[[#enum|enum]]</code>は名前空間で囲まれ、型の安全性が強化されました。これにより、<code>[[#enum|enum]]</code>の値が異なる<code>[[#enum|enum]]</code>型間で誤って使用されることを防げるようになりました。 :<syntaxhighlight lang=c++ copy>enum class Color { Red, // 値は自動的に整数型で、Redは0 Green, // Greenは1 Blue // Blueは2 }; Color c = Color::Red; // 名前空間を使って指定</syntaxhighlight> '''C++14''':改善された機能 * <code>[[#enum class|enum class]]</code>で型を指定することができ、さらに可読性を向上させるために、基になる型を指定することができます。 :<syntaxhighlight lang=c++ copy>enum class Color : unsigned int { Red, Green, Blue };</syntaxhighlight> '''C++17''':新しい機能 * <code>[[#enum class|enum class]]</code>に関する変更は特になく、引き続き強力な型安全機能がサポートされています。 <code>[[#enum|enum]]</code>の主な用途: # 定数のグループ化 # 可読性の向上(数字の代わりに意味のある名前を使用) # 名前空間やスコープの管理(<code>[[#enum class|enum class]]</code>を使用することで、グローバルな名前の衝突を防止) # 型安全な列挙型を作成する(<code>[[#enum class|enum class]]</code>) 現代のC++では、<code>[[#enum|enum]]</code>は以下の場面で重要な役割を果たします: * 定数の集合を定義することで、コードの可読性や保守性を向上させる * 状態やオプションのフラグを管理する * 列挙型の値が予測可能であることを保証するため、<code>[[#enum class|enum class]]</code>による型安全を活用する * 数値を直接扱わず、意味のある名前を使うことで意図を明確に伝える :<syntaxhighlight lang=c++ copy>enum class Status { OK = 0, Warning = 1, Error = 2 }; Status status = Status::OK; if (status == Status::Error) { // エラーハンドリング }</syntaxhighlight> '''注意点''': * <code>[[#enum|enum]]</code>の値はデフォルトで整数型として扱われ、必要に応じて明示的に型を指定できます。 * <code>[[#enum|enum]]</code>は型安全ではなく、他の<code>[[#enum|enum]]</code>型の値を誤って使用することが可能ですが、C++11以降は<code>[[#enum class|enum class]]</code>を使用することで型安全が提供されます。 * <code>[[#enum class|enum class]]</code>は、名前空間を提供することで異なる<code>[[#enum|enum]]</code>の衝突を避けることができます。 :<syntaxhighlight lang=c++ copy>enum class Color { Red, Green, Blue }; enum class Direction { North, South, East, West }; Color color = Color::Red; Direction dir = Direction::North;</syntaxhighlight> <code>[[#enum|enum]]</code>は、特に状態を管理するためや、特定のオプションを明確にするために、非常に便利な構文です。C++11以降では、型安全性が高まり、コードの誤使用を防ぐための機能が強化されました。 === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 ==== namespace ==== ==== using ==== === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>[[#typename|typename]]</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 * <code>[[#concept|concept]]</code>:テンプレートの引数に対して制約を設ける。 ==== template ==== C++の<code>[[#template|template]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、型や値に依存しないコードの再利用を可能にする機能です。<code>[[#template|template]]</code>を使うことで、同じコードを異なるデータ型に対して適用することができ、汎用的なアルゴリズムやデータ構造を作成することができます。これにより、コードの可読性と保守性が向上します。 C++での<code>[[#template|template]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#template|template]]</code>は、関数やクラスに対して、型を指定せずに再利用可能なコードを記述するための機能です。 :<syntaxhighlight lang=c++ copy>// 関数テンプレートの例 template <typename T> T add(T a, T b) { return a + b; } int main() { int x = add(1, 2); // int型 double y = add(1.1, 2.2); // double型 }</syntaxhighlight> * <code>[[#template|template]]</code>を使用することで、異なる型に対して同じ関数を再利用できます。 '''C++11''':機能拡張 * <code>[[#auto|auto]]</code>キーワードとラムダ式により、テンプレートの使い方が簡略化され、可読性が向上しました。 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数をテンプレートで使用することが可能になりました。 :<syntaxhighlight lang=c++ copy>template <typename T> constexpr T square(T x) { return x * x; }</syntaxhighlight> * テンプレートの引数にデフォルト値を指定することも可能になりました。 :<syntaxhighlight lang=c++ copy>template <typename T = int> T multiply(T a, T b) { return a * b; }</syntaxhighlight> '''C++14''':機能拡張 * 変数テンプレートの導入により、テンプレート引数として変数も扱えるようになりました。 :<syntaxhighlight lang=c++ copy>template <typename T> T max_value = T(10); // デフォルトでT型の最大値を設定</syntaxhighlight> '''C++17''':新しい機能 * <code>[[#if constexpr|if constexpr]]</code>の導入により、コンパイル時の条件によってテンプレートの選択ができるようになりました。 :<syntaxhighlight lang=c++ copy>template <typename T> void print(T value) { if constexpr (std::is_integral<T>::value) { std::cout << "整数型の値: " << value << std::endl; } else { std::cout << "その他の型の値: " << value << std::endl; } }</syntaxhighlight> '''C++20''':機能拡張 * コンセプト(Concepts)の導入により、テンプレートの引数に制約を付けることができ、テンプレートの使い方に制限を加えることができました。 :<syntaxhighlight lang=c++ copy>template <typename T> concept Incrementable = requires(T a) { { ++a } -> std::same_as<T&>; }; template <Incrementable T> T increment(T value) { return ++value; }</syntaxhighlight> <code>[[#template|template]]</code>の主な用途: # 型に依存しないコードの再利用 # 汎用的なアルゴリズムやデータ構造の作成 # コンパイル時に型の確認を行い、エラーを早期に発見 # 型に対する制約(C++20のコンセプト)や条件による分岐 現代のC++では、<code>[[#template|template]]</code>は以下の場面で重要な役割を果たします: * 汎用的な関数やクラスを作成するために使用 * 同じ処理を異なる型に適用する際に再利用 * 型制約やコンセプトを活用して、安全で明確なコードを実現 * コンパイル時定数や条件付きテンプレートを活用して、最適化やエラーチェックを行う :<syntaxhighlight lang=c++ copy>template <typename T> T max(T a, T b) { return (a > b) ? a : b; } int main() { std::cout << max(3, 5) << std::endl; // int型 std::cout << max(3.14, 2.71) << std::endl; // double型 }</syntaxhighlight> '''注意点''': * テンプレートは型に依存しないため、同じコードを異なる型に対して適用できますが、テンプレートのインスタンス化はコンパイル時に行われるため、非常に大きなコードを生成する可能性があることに注意が必要です。 * C++20で導入されたコンセプトや、条件付きテンプレートを使うことで、より柔軟で型安全なコードを記述することができます。 テンプレートは、汎用的なアルゴリズムやデータ構造を作成する際に非常に便利な機能であり、C++の強力なツールの一つです。 ==== typename ==== C++の<code>[[#typename|typename]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、テンプレートの定義や特殊化で型を明示するために使用されるキーワードです。<code>[[#typename|typename]]</code>は、テンプレートの型パラメータを指定したり、型依存式を解決するために重要な役割を果たします。また、<code>[[#typename|typename]]</code>は型の名前をコンパイラに示すため、より明確で安全なコードを提供します。 C++での<code>[[#typename|typename]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#typename|typename]]</code>は、テンプレートパラメータとして型を指定するために使用されます。テンプレートの引数に型を指定することで、汎用的な関数やクラスを作成することができます。 :<syntaxhighlight lang=c++ copy>// テンプレート引数としてtypenameを使う template <typename T> T add(T a, T b) { return a + b; } int main() { int x = add(1, 2); // int型 double y = add(1.1, 2.2); // double型 }</syntaxhighlight> * また、型を指定することで、コンパイル時に型の不一致を防ぐことができます。 '''C++11''':機能拡張 * 型依存式の解決に<code>[[#typename|typename]]</code>が必要となる場面が増えました。たとえば、テンプレートのメンバ型にアクセスする場合に、<code>[[#typename|typename]]</code>を使う必要があります。 :<syntaxhighlight lang=c++ copy>template <typename T> void print_first(T t) { typename T::value_type first = t.front(); // Tがコンテナ型のとき std::cout << first << std::endl; }</syntaxhighlight> * <code>[[#typename|typename]]</code>は、コンテナクラスやテンプレートのメンバ型を明示的に指示するためにも使われます。 '''C++14'''以降:型の依存式の解決と可読性の向上 * 型依存式における明示的な指定の際、<code>[[#typename|typename]]</code>の使い方がさらに重要となり、より多くの場面で型を明確にするために利用されます。 '''C++17''':機能拡張 * <code>[[#if constexpr|if constexpr]]</code>の導入により、<code>[[#typename|typename]]</code>が不要な場合もありますが、依然として型依存式の解決において重要です。 :<syntaxhighlight lang=c++ copy>template <typename T> void print(T value) { if constexpr (std::is_integral<T>::value) { std::cout << "整数型の値: " << value << std::endl; } else { std::cout << "その他の型の値: " << value << std::endl; } }</syntaxhighlight> <code>[[#typename|typename]]</code>の主な用途: # テンプレート引数として型を指定 # 型依存式の解決(例えば、メンバ型や型の名前にアクセスする際) # テンプレートメタプログラミングにおける型の明示的指定 # 型を指定することでコンパイル時エラーを防ぐ 現代のC++では、<code>[[#typename|typename]]</code>は以下の場面で重要な役割を果たします: * テンプレート引数を使用して汎用的なコードを作成 * 型依存式の解決 * より複雑なテンプレートメタプログラミングを実現 * コンパイラに型名を明示することで、型の不一致やエラーを防ぐ :<syntaxhighlight lang=c++ copy>template <typename T> void display_first_element(const T& container) { typename T::value_type first = container.front(); std::cout << first << std::endl; }</syntaxhighlight> '''注意点''': * <code>[[#typename|typename]]</code>は、型依存式を解決する際に必要であり、型名を明示することでコンパイラが型を正しく認識できるようにします。 * 型の依存関係やメンバ型へのアクセス時に使用されるため、テンプレートプログラミングや型を扱うコードでは欠かせないキーワードです。 <code>[[#typename|typename]]</code>は、C++における型安全性とコードの柔軟性を高めるために重要な役割を果たします。 ==== class ==== C++におけるテンプレートの型引数としての'''<code>[[#class|class]]</code>'''は、'''C++98'''から存在し、テンプレートを定義する際に型引数を指定するためのキーワードの1つです。<code>[[#class|class]]</code>は、テンプレート引数に型(クラス、構造体、あるいは任意の型)を指定するために使用され、<code>[[#typename|typename]]</code>とほぼ同じ意味を持ちます。ただし、<code>[[#class|class]]</code>は型を示すために使用され、<code>[[#typename|typename]]</code>は型名を明示的に指定する場面で使われます。 C++でのテンプレートの型引数としての'''<code>[[#class|class]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#class|class]]</code>をテンプレートの型引数として使用することで、テンプレートを型に対して汎用的に適用できます。これは、特定の型に依存せず、任意の型に対して動作する関数やクラスを作成するために利用されます。 :<syntaxhighlight lang=c++ copy>// classをテンプレート型引数として使用 template <class T> T add(T a, T b) { return a + b; } int main() { int x = add(1, 2); // int型 double y = add(1.1, 2.2); // double型 }</syntaxhighlight> * このように、<code>[[#class|class]]</code>は型を引数として受け取り、関数やクラスの定義を汎用化します。 '''C++11''':機能拡張 * C++11では、<code>[[#class|class]]</code>は引き続き型を指定するために使われるものの、<code>[[#typename|typename]]</code>との違いが明確になります。実際には、<code>[[#class|class]]</code>と<code>[[#typename|typename]]</code>は互換的に使用できるため、両者の使用には特に大きな違いはありません。しかし、<code>[[#class|class]]</code>は一般的に「クラス」という意味合いが強いため、直感的に「型」として理解されます。 :<syntaxhighlight lang=c++ copy>template <class T> void print(const T& obj) { std::cout << obj << std::endl; }</syntaxhighlight> * <code>[[#typename|typename]]</code>と違い、<code>[[#class|class]]</code>というキーワードは、主にクラス型を引数にする場合に使われることが多いですが、実際には任意の型に対しても利用可能です。 '''C++17'''以降:さらなる進化 * <code>[[#class|class]]</code>は依然として型引数として使用されますが、<code>[[#typename|typename]]</code>と同じ意味で使用される場面が増えています。特にテンプレート引数で型を指定する際、<code>[[#class|class]]</code>を使うことは非常に一般的であり、<code>[[#typename|typename]]</code>と差異はほとんどありません。 :<syntaxhighlight lang=c++ copy>template <class T> void display_type(const T& obj) { std::cout << typeid(obj).name() << std::endl; }</syntaxhighlight> '''C++20''':新しい機能に対応 * C++20でも、<code>[[#class|class]]</code>は引き続きテンプレートの型引数として使用されますが、テンプレートの制約や概念(<code>[[#concepts|concepts]]</code>)の導入により、テンプレート型引数に関する新しいアプローチが登場しました。例えば、特定の型に対して制約を追加することができます。 :<syntaxhighlight lang=c++ copy>template <class T> concept Incrementable = requires(T x) { ++x; }; template <Incrementable T> T increment(T value) { return ++value; }</syntaxhighlight> <code>[[#class|class]]</code>の主な用途: # 型引数として使用し、テンプレートを汎用的に定義 # 任意の型を引数に取り、異なる型で動作する関数やクラスを実装 # <code>[[#typename|typename]]</code>と同様に、型依存式やメンバ型の解決に使用 現代のC++では、<code>[[#class|class]]</code>は以下の場面で重要な役割を果たします: * テンプレート引数に型を指定し、汎用的な関数やクラスを作成 * 型に依存しないコードを提供するため、任意の型で動作する関数やクラスを作成 * <code>[[#typename|typename]]</code>と同様に、型依存式の解決や、より安全で明確な型指定を行う :<syntaxhighlight lang=c++ copy>template <class T> T multiply(T a, T b) { return a * b; }</syntaxhighlight> '''注意点''': * <code>[[#class|class]]</code>は<code>[[#typename|typename]]</code>とほぼ同じ役割を果たしますが、C++98の初期では<code>[[#class|class]]</code>がより多く使われました。現在では、両者はほぼ同義で使われますが、<code>[[#typename|typename]]</code>の方が一般的になっています。 * <code>[[#class|class]]</code>は、特にクラス型のテンプレート引数を受け取る場合に使用されることが多いですが、任意の型に対しても使用可能です。 <code>[[#class|class]]</code>は、C++において汎用的なコードを作成するために重要な役割を果たしており、テンプレートの引数として使用することで、柔軟で再利用可能なコードを提供することができます。 ==== concept ==== C++20で導入された'''<code>[[concept|concept]]</code>'''は、テンプレートの引数に対して制約を設けるための新しい機能です。<code>[[concept|concept]]</code>を使用することで、テンプレート引数が特定の条件を満たしていることを保証でき、より安全で明確なコードを書くことができます。これにより、テンプレートの適用範囲を絞り込み、コンパイル時に型チェックを強化することができます。 C++での'''<code>[[concept|concept]]</code>'''の主な用途と進化: '''C++20''':新機能としての<code>[[concept|concept]]</code>の導入 * <code>[[concept|concept]]</code>は、テンプレート引数に対する制約を定義するために使用されます。これにより、テンプレートを適用する型が特定の条件を満たすかどうかを確認することができます。例えば、特定の型が加算可能であることを保証する<code>[[concept|concept]]</code>を定義することができます。 :<syntaxhighlight lang=c++ copy>// Conceptの定義 template <typename T> concept Addable = requires(T a, T b) { a + b; // Tが加算可能であることを要求 }; // Conceptを使ったテンプレート template <Addable T> T add(T a, T b) { return a + b; } int main() { int result = add(1, 2); // 正常 // add("hello", "world"); // コンパイルエラー: Addable制約に違反 }</syntaxhighlight> * <code>[[concept|concept]]</code>は、型が特定の操作をサポートしていることをコンパイル時にチェックするために使用されます。これにより、テンプレートの使用がより直感的になり、型の制約を明示的に表現できるようになりました。 '''C++20''':<code>[[concept|concept]]</code>を使った制約の具体例 * 例えば、<code>Addable</code>という<code>[[concept|concept]]</code>を使って、加算が可能な型のみを受け入れるテンプレート関数を定義することができます。 :<syntaxhighlight lang=c++ copy>template <typename T> concept Addable = requires(T a, T b) { a + b; }; template <Addable T> T add(T a, T b) { return a + b; } int main() { int sum = add(3, 4); // OK, 加算可能な型 // double result = add("a", "b"); // コンパイルエラー: Addableに一致しない型 }</syntaxhighlight> * <code>[[concept|concept]]</code>は、テンプレート関数やクラスに適用される引数に対する制約を定義することで、より明確で安全なコードを提供します。 '''C++20以降''':<code>[[concept|concept]]</code>の進化と活用 * C++20以降では、<code>[[concept|concept]]</code>を利用することで、テンプレート引数の制約をより簡単に記述できるようになり、特定の型が満たすべき条件を直感的に表現できます。例えば、<code>std::integral</code>や<code>std::floating_point</code>など、標準ライブラリには様々な組み込みの<code>[[concept|concept]]</code>が追加されています。これにより、コードの安全性と可読性が向上し、バグを未然に防ぐことができます。 :<syntaxhighlight lang=c++ copy>#include <concepts> template <std::integral T> T add(T a, T b) { return a + b; } int main() { int result = add(5, 10); // OK, integral型 // add(3.5, 2.5); // コンパイルエラー: integralに適合しない型 }</syntaxhighlight> <code>[[concept|concept]]</code>の主な用途: # 型に対する制約を定義し、テンプレートの適用範囲を絞り込む # コンパイル時に型が特定の条件を満たすかを検査し、エラーを早期に検出 # テンプレート引数に対して明確な要求を示し、意図が明確なコードを実現 # より安全で可読性の高いコードを提供 現代のC++では、<code>[[concept|concept]]</code>は以下の場面で重要な役割を果たします: * テンプレート関数やクラスにおける型の制約を明示化 * 型が満たすべき条件を正確に定義することで、テンプレートの使用をより直感的に * より強力なコンパイル時チェックにより、バグの予防とエラーの早期発見 '''注意点''': * <code>[[concept|concept]]</code>はC++20から導入された新しい機能であり、それ以前のバージョンのC++では使用できません。コンパイラによっては、C++20以降の仕様をサポートしていないものもあるため、使用する際はコンパイラのバージョンに注意が必要です。 * <code>[[concept|concept]]</code>を使うことで、型の制約をより直感的に表現できるため、テンプレートの使用が簡潔になります。 :<syntaxhighlight lang=c++ copy>template <typename T> concept Comparable = requires(T a, T b) { { a == b } -> std::same_as<bool>; }; template <Comparable T> bool is_equal(const T& a, const T& b) { return a == b; }</syntaxhighlight> <code>[[concept|concept]]</code>はC++における強力な型チェックツールであり、特にテンプレートを利用した汎用的なプログラムにおいて、コードの安全性と可読性を向上させるために重要な役割を果たします。 === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#auto|auto]]</code>:型推論。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>[[#const|const]]</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 ==== alignas ==== '''<code>[[#alignas|alignas]]</code>'''は、C++11で導入されたキーワードで、変数や型に対して特定のアライメント(配置境界)を指定するために使用されます。アライメントは、メモリ内でデータがどのように配置されるかを制御するもので、特定のアライメントに合わせて変数を配置することで、パフォーマンスの向上やハードウェアの要件に適合させることができます。 C++での'''<code>[[#alignas|alignas]]</code>'''の主な用途と進化: '''C++11''':<code>[[#alignas|alignas]]</code>の導入 * <code>[[#alignas|alignas]]</code>は、型や変数に対して特定のアライメントを要求するために使用されます。これにより、データが特定の境界に配置されるように強制できます。例えば、SSE命令を利用するために、特定のアライメントにデータを配置することが求められる場合などです。 :<syntaxhighlight lang=c++ copy>// 16バイト境界に配置する alignas(16) int arr[4]; auto main() -> int { std::cout << "Alignment of arr: " << alignof(arr) << std::endl; }</syntaxhighlight> * <code>[[#alignas|alignas]]</code>を使用すると、データ型のアライメントを変更でき、特に低レベルなパフォーマンス最適化に役立ちます。データが正しいアライメントを持つことは、メモリアクセスの効率を向上させることがあり、ハードウェアによってはアライメント違反がパフォーマンス低下を引き起こす場合もあります。 '''C++11''':<code>[[#alignas|alignas]]</code>を使ったクラスや構造体のアライメント指定 * 構造体やクラスのメンバに対しても、<code>[[#alignas|alignas]]</code>を使ってアライメントを指定できます。これにより、特定の境界に合わせてデータを配置することができます。 :<syntaxhighlight lang=c++ copy>struct alignas(32) MyStruct { int a; double b; };</syntaxhighlight> * 上記の例では、<code>MyStruct</code>構造体全体が32バイトのアライメント境界で配置されることを要求します。 '''C++11以降''':<code>[[#alignof|alignof]]</code>との併用 * <code>[[#alignas|alignas]]</code>とともに、<code>[[#alignof|alignof]]</code>を使うことで、型のアライメントを取得することができます。これにより、どのようなアライメントが適用されているのかを確認することができます。 :<syntaxhighlight lang=c++ copy>std::cout << "Alignment of int: " << alignof(int) << std::endl;</syntaxhighlight> '''C++14以降''':さらに使いやすく * C++14以降でも<code>[[#alignas|alignas]]</code>は引き続き使用されており、特にハードウェアの制約やパフォーマンス最適化を行う際に重要です。 '''<code>[[#alignas|alignas]]</code>の主な用途''': # メモリ配置の最適化:パフォーマンス向上やハードウェア要件に応じた最適な配置 # 特定のアライメントを必要とするデータ型の設定(例えば、SSE命令を使用する際など) # 構造体やクラスのメンバに対するアライメント設定 # メモリのアライメント違反を防ぎ、パフォーマンスを向上させる '''現代のC++では、<code>[[#alignas|alignas]]</code>は以下のような場面で重要な役割を果たします''': * ハードウェアや特定の命令セットに対して最適化されたデータ配置 * パフォーマンス向上のためのデータのアライメント設定 * メモリの正しい配置を確保することで、データの整合性を保つ * 特に低レベルなプログラミングやシステムプログラミングで活用される '''注意点''': * <code>[[#alignas|alignas]]</code>はC++11から導入されたため、それ以前のバージョンのC++では使用できません。使用するにはC++11以降に対応したコンパイラが必要です。 * アライメントの指定は、プラットフォームやコンパイラの制約に依存するため、最適化がプラットフォーム間で異なる場合があります。 :<syntaxhighlight lang=c++ copy>alignas(64) int data[100];</syntaxhighlight> このコードは、<code>[[#data|data]]</code>配列が64バイト境界で配置されるように要求します。このように、<code>[[#alignas|alignas]]</code>はメモリのアライメントを直接指定する手段を提供し、特定のハードウェアアーキテクチャに最適化されたコードを記述するために重要です。 ==== alignof ==== '''<code>[[#alignof|alignof]]</code>'''は、C++11で導入された演算子で、指定された型やオブジェクトのアライメントをバイト単位で取得するために使用されます。アライメントとは、メモリ上で変数がどのように配置されるかを示すもので、特にパフォーマンスやハードウェア要件に影響を与える要素です。<code>[[#alignof|alignof]]</code>を使うことで、特定の型がどのアライメント境界に配置されるかを調べることができます。 C++での'''<code>[[#alignof|alignof]]</code>'''の主な用途と進化: '''C++11''':<code>[[#alignof|alignof]]</code>の導入 * <code>[[#alignof|alignof]]</code>演算子は、型やオブジェクトがどのアライメント境界に配置されるべきかを返します。具体的には、指定した型またはオブジェクトが必要とするアライメントの最小バイト数を返します。 :<syntaxhighlight lang=c++ copy>std::cout << "Alignment of int: " << alignof(int) << std::endl;</syntaxhighlight> * このコードは、<code>[[#int|int]]</code>型のアライメントを取得して表示します。通常、<code>[[#int|int]]</code>のアライメントは4バイトですが、プラットフォームによって異なることがあります。 '''C++11''':<code>[[#alignof|alignof]]</code>を使った構造体やクラスのアライメント確認 * <code>[[#alignof|alignof]]</code>は、クラスや構造体のアライメントも確認できます。例えば、構造体のメンバや、構造体全体のアライメントを調べることができます。 :<syntaxhighlight lang=c++ copy>struct MyStruct { int a; double b; }; std::cout << "Alignment of MyStruct: " << alignof(MyStruct) << std::endl;</syntaxhighlight> * この場合、<code>MyStruct</code>のアライメントが表示されます。<code>[[#double|double]]</code>型のメンバ<code>[[#b|b]]</code>に合わせて、構造体全体のアライメントが決まることが多いです。 '''C++14以降''':<code>[[#alignof|alignof]]</code>を使った動的オブジェクトのアライメント確認 * <code>[[#alignof|alignof]]</code>は、動的メモリ確保によって作られたオブジェクトにも使用できます。 :<syntaxhighlight lang=c++ copy>int* p = new int; std::cout << "Alignment of *p: " << alignof(*p) << std::endl;</syntaxhighlight> * このコードは、ポインタ<code>[[#p|p]]</code>が指すオブジェクトのアライメントを調べます。 '''<code>[[#alignof|alignof]]</code>の主な用途''': # 型やオブジェクトのメモリアライメントを調べる # 特定のアライメントを要求するデータ構造を設計する # メモリ最適化やパフォーマンス向上のために、アライメントがどのように影響するかを理解する # ハードウェアの要件に応じた最適なデータ配置を実現する '''現代のC++では、<code>[[#alignof|alignof]]</code>は以下のような場面で重要な役割を果たします''': * ハードウェアアーキテクチャに特化した最適化 * メモリ配置やアライメントを意識したデータ構造の設計 * データの整合性を保ちながらパフォーマンスを向上させるための調整 * 動的メモリのアライメントを確認するために、<code>[[#alignof|alignof]]</code>を利用したデバッグや最適化 '''注意点''': * <code>[[#alignof|alignof]]</code>は、C++11以降の機能なので、それ以前のバージョンのC++では使用できません。C++11以降に対応したコンパイラを使用する必要があります。 * <code>[[#alignof|alignof]]</code>が返す値は、型に対する最小のアライメントを示しており、プラットフォームによって異なる場合があります。特に、64ビットシステムと32ビットシステムではアライメントが異なることが一般的です。 :<syntaxhighlight lang=c++ copy>std::cout << "Alignment of MyStruct: " << alignof(MyStruct) << std::endl;</syntaxhighlight> このコードでは、<code>MyStruct</code>型のアライメントを取得して表示します。<code>[[#alignof|alignof]]</code>を使うことで、型のアライメントを簡単に取得でき、特に低レベルプログラミングやハードウェアに関連した開発で非常に便利です。 ==== auto ==== '''<code>[[#auto|auto]]</code>'''は、C++11で導入されたキーワードで、変数の型を自動的に推論するために使用されます。これにより、プログラマが型を明示的に指定する手間を省き、コードの可読性と保守性が向上します。<code>[[#auto|auto]]</code>は、特にテンプレートや複雑な型が絡む場合に役立ちます。 C++での'''<code>[[#auto|auto]]</code>'''の主な用途と進化: '''C++11''':<code>[[#auto|auto]]</code>の導入 * <code>[[#auto|auto]]</code>は、変数の型をコンパイラが自動的に推論することを意味します。これにより、型を明示的に書かなくても、コンパイラが変数の型を解析して適切に決定します。 :<syntaxhighlight lang=c++ copy>auto x = 42; // xはint型と推論される auto y = 3.14; // yはdouble型と推論される</syntaxhighlight> * このコードでは、<code>[[#x|x]]</code>は<code>[[#int|int]]</code>型、<code>[[#y|y]]</code>は<code>[[#double|double]]</code>型として推論されます。 '''C++14''':<code>[[#auto|auto]]</code>によるラムダ式の引数型の推論 * C++14では、ラムダ式の引数の型にも<code>[[#auto|auto]]</code>を使うことができ、より簡潔に記述できるようになりました。 :<syntaxhighlight lang=c++ copy>auto sum = [](auto a, auto b) { return a + b; }; // 任意の型の引数を受け入れるラムダ式 std::cout << sum(3, 4) << std::endl; // 7 std::cout << sum(3.5, 4.5) << std::endl; // 8.0</syntaxhighlight> * この例では、<code>[[#sum|sum]]</code>ラムダ式は異なる型の引数に対応し、適切な型の演算を行います。 '''C++17''':<code>[[#auto|auto]]</code>による返り値の型推論 * C++17では、関数の返り値型にも<code>[[#auto|auto]]</code>を使い、より簡潔にコードを書くことができるようになりました。<code>[[#auto|auto]]</code>を使うことで、関数の返り値の型をコンパイラに推論させることができます。 :<syntaxhighlight lang=c++ copy>auto get_value() { return 42; // int型として推論される }</syntaxhighlight> * <code>get_value()</code>は<code>[[#int|int]]</code>型の値を返すとコンパイラが推論します。 '''C++20''':<code>[[#auto|auto]]</code>の使用範囲がさらに拡大 * C++20では、<code>[[#auto|auto]]</code>を使った引数型の推論がより強力になり、コンパイル時に型を確定させる際の柔軟性が向上しました。特に、コンストラクタやメンバ関数での<code>[[#auto|auto]]</code>使用が可能になり、便利さが増しました。 :<syntaxhighlight lang=c++ copy>auto add(auto a, auto b) { return a + b; }</syntaxhighlight> '''<code>[[#auto|auto]]</code>の主な用途''': # 型を自動的に推論してコードを簡潔にする # テンプレートや型が複雑な場合に型指定を省略する # ラムダ式で引数型を簡単に推論する # 関数の返り値の型を自動で決定する '''現代のC++では、<code>[[#auto|auto]]</code>は以下のような場面で重要な役割を果たします''': * 複雑な型の記述を避けてコードを簡潔に保つ * テンプレートを使った汎用的なコードを記述する際に、型を明示的に記述する負担を減らす * 異なる型の引数を持つラムダ式や関数を簡単に定義できる * 型推論により、開発者がより抽象的なレベルでコードを記述できる '''注意点''': * <code>[[#auto|auto]]</code>を使用する際には、型が明示的に推論されるため、意図しない型が推論される場合があります。特に、ポインタや参照を使う場合には注意が必要です。 * <code>[[#auto|auto]]</code>の型推論はコンパイル時に決定されるため、実行時に変わることはありません。そのため、型の予測ができる範囲で使うべきです。 :<syntaxhighlight lang=c++ copy>auto i = 5; // iはint型 auto ptr = &i; // ptrはint*型 auto& ref = i; // refはint&型</syntaxhighlight> * ここでは、<code>[[#auto|auto]]</code>によって変数<code>[[#i|i]]</code>の型は<code>[[#int|int]]</code>、<code>[[#ptr|ptr]]</code>の型は<code>int*</code>、<code>[[#ref|ref]]</code>の型は<code>int&</code>と推論されます。 <code>[[#auto|auto]]</code>は、特に複雑な型を扱う場合にコードの簡潔性と可読性を向上させ、開発者が型を気にせずにより抽象的なコードを書くことを可能にします。 ==== decltype ==== '''<code>[[#decltype|decltype]]</code>'''は、C++11で導入されたキーワードで、式の型を推論するために使用されます。<code>[[#decltype|decltype]]</code>は、変数や式の型を確認したり、その型を別の変数の宣言に利用したりする際に非常に便利です。型推論の柔軟性を提供し、特にテンプレートや型が不明な場合に役立ちます。 C++での'''<code>[[#decltype|decltype]]</code>'''の主な用途と進化: '''C++11''':<code>[[#decltype|decltype]]</code>の導入 * <code>[[#decltype|decltype]]</code>は、式や変数の型を静的に取得するために使用されます。式を指定すると、その型を推論して返します。 :<syntaxhighlight lang=c++ copy>int x = 5; decltype(x) y = 10; // yはint型として推論される</syntaxhighlight> * 上記の例では、<code>decltype(x)</code>により、変数<code>[[#x|x]]</code>の型である<code>[[#int|int]]</code>が推論され、変数<code>[[#y|y]]</code>が<code>[[#int|int]]</code>型として宣言されます。 '''C++14''':<code>decltype(auto)</code>の導入 * C++14では、<code>decltype(auto)</code>が導入され、関数の返り値の型として<code>[[#decltype|decltype]]</code>を使う場合に、参照やポインタの型を正確に推論できるようになりました。 :<syntaxhighlight lang=c++ copy>int&& getValue() { return 42; } decltype(auto) val = getValue(); // valはint&&型として推論される</syntaxhighlight> * ここで、<code>getValue()</code>が右辺値参照を返すため、<code>decltype(auto)</code>によって変数<code>[[#val|val]]</code>も<code>int&&</code>型として推論されます。 '''C++17''':<code>[[#decltype|decltype]]</code>の使用範囲の拡大 * C++17では、<code>[[#decltype|decltype]]</code>がより多くの場面で活用されるようになり、より多様な型推論に対応しました。特に、<code>[[#if constexpr|if constexpr]]</code>やテンプレートによる型推論が広がり、<code>[[#decltype|decltype]]</code>の利用が増えました。 :<syntaxhighlight lang=c++ copy>template <typename T> decltype(auto) multiply(T a, T b) { return a * b; }</syntaxhighlight> * <code>[[#multiply|multiply]]</code>関数では、引数の型に基づいて返り値の型が自動的に決定されます。 '''<code>[[#decltype|decltype]]</code>の主な用途''': # 式や変数の型を明示的に取得する # 型推論を用いた変数の宣言を柔軟に行う # テンプレートやラムダ式の型推論をサポートする # 複雑な型を正確に推論して返す '''現代のC++では、<code>[[#decltype|decltype]]</code>は以下のような場面で重要な役割を果たします''': * 型を正確に推論してコードを簡潔に保つ * テンプレートでの型の依存を処理する際に利用する * 複雑な型を扱う場合に、型の明示的な指定を避ける '''注意点''': * <code>[[#decltype|decltype]]</code>は指定した式や変数の型をそのまま取得するため、式が右辺値の場合、右辺値型として推論されることがあります。参照やポインタ型を扱う場合、<code>decltype(auto)</code>などを使って型を精密に管理する必要があります。 :<syntaxhighlight lang=c++ copy>int x = 10; int& ref = x; decltype(ref) y = x; // yはint&型として推論される decltype(x) z = 20; // zはint型として推論される</syntaxhighlight> * ここでは、<code>[[#ref|ref]]</code>が参照型の<code>int&</code>を持っているため、<code>decltype(ref)</code>で<code>int&</code>が推論され、<code>[[#z|z]]</code>は<code>[[#int|int]]</code>型として推論されます。 <code>[[#decltype|decltype]]</code>は、型推論の精度を高め、C++におけるコードの柔軟性を大きく向上させる機能です。特にテンプレートや型の不確定性が高い場合に非常に有用で、型に依存する操作を柔軟かつ効率的に行うことができます。 ==== dynamic_cast ==== '''<code>[[#dynamic_cast|dynamic_cast]]</code>'''は、C++で使用されるキャスト演算子の一つで、主にポインタや参照型の間で安全に型変換を行うために使用されます。<code>[[#dynamic_cast|dynamic_cast]]</code>は、特に多態性(ポリモーフィズム)を利用する際に、基底クラスから派生クラスへのキャストを実行するために使用され、ランタイムで型安全性を確保します。 C++での'''<code>[[#dynamic_cast|dynamic_cast]]</code>'''の主な用途と進化: '''C++98''':<code>[[#dynamic_cast|dynamic_cast]]</code>の導入 * <code>[[#dynamic_cast|dynamic_cast]]</code>は、基底クラスポインタまたは参照を派生クラスにキャストするために使用され、成功するとキャストされた型に適合したポインタまたは参照が返されます。失敗した場合には、<code>[[#nullptr|nullptr]]</code>が返される(ポインタ型の場合)または例外がスローされる(参照型の場合)ことがあります。 :<syntaxhighlight lang=c++ copy>class Base { virtual void foo() {} // 仮想関数が必要 }; class Derived : public Base {}; Base* base = new Derived(); Derived* derived = dynamic_cast<Derived*>(base); // 正常にキャストされる</syntaxhighlight> * この例では、<code>[[#dynamic_cast|dynamic_cast]]</code>を使用して、<code>Base</code>型のポインタを<code>Derived</code>型にキャストしています。<code>Base</code>クラスに仮想関数が存在するため、<code>[[#dynamic_cast|dynamic_cast]]</code>は実行時に正しく型を特定できます。 '''C++11''':型変換の強化 * <code>[[#dynamic_cast|dynamic_cast]]</code>は、特に多態性を持つクラス階層内でのキャストにおいて、型安全を提供します。また、<code>[[#dynamic_cast|dynamic_cast]]</code>はポインタまたは参照に対して動作しますが、失敗した場合の挙動が異なります。ポインタの場合は<code>[[#nullptr|nullptr]]</code>が返され、参照の場合は<code>std::bad_cast</code>例外がスローされます。 :<syntaxhighlight lang=c++ copy>Base* base = new Base(); Derived* derived = dynamic_cast<Derived*>(base); if (derived == nullptr) { std::cout << "キャスト失敗\n"; }</syntaxhighlight> * 上記の例では、<code>Base</code>型のポインタを<code>Derived</code>型にキャストしようとしていますが、<code>Base</code>には<code>Derived</code>型のオブジェクトが格納されていないため、<code>[[#derived|derived]]</code>は<code>[[#nullptr|nullptr]]</code>となり、キャストが失敗したことがわかります。 '''<code>[[#dynamic_cast|dynamic_cast]]</code>の主な用途''': # 基底クラスポインタや参照を派生クラスのポインタや参照に安全にキャストする # 多態性を持つクラスでの型変換を行う # 型変換が成功したかどうかをランタイムで確認する # 型情報を失わず、仮想関数を通じて動的にキャストを行う '''現代のC++では、<code>[[#dynamic_cast|dynamic_cast]]</code>は以下のような場面で重要な役割を果たします''': * ポリモーフィズムを利用した型変換で型安全を確保 * 型を確実に判定し、予期しない動作を防ぐ * コンパイル時に型が不確定な場合でも、実行時に正確な型変換を行う '''注意点''': * <code>[[#dynamic_cast|dynamic_cast]]</code>は、クラスが少なくとも1つの仮想関数を持っている場合にのみ有効です。これにより、クラスの型情報がランタイムに保持され、キャストが可能になります。 * <code>[[#dynamic_cast|dynamic_cast]]</code>は、失敗時に<code>[[#nullptr|nullptr]]</code>(ポインタ型の場合)を返し、参照型の場合は<code>std::bad_cast</code>例外をスローします。失敗時の処理を適切に行う必要があります。 :<syntaxhighlight lang=c++ copy>try { Base& baseRef = *base; Derived& derivedRef = dynamic_cast<Derived&>(baseRef); // 失敗時に例外がスローされる } catch (const std::bad_cast& e) { std::cout << "キャスト失敗: " << e.what() << std::endl; }</syntaxhighlight> * ここでは、参照型に対する<code>[[#dynamic_cast|dynamic_cast]]</code>が失敗した場合に<code>std::bad_cast</code>例外がスローされ、その内容が表示されます。 <code>[[#dynamic_cast|dynamic_cast]]</code>は、安全な型変換を提供し、ポリモーフィックなクラス階層内での型チェックを実行時に行うため、特に複雑なオブジェクト指向プログラミングにおいて重要な役割を果たします。 ==== static_cast ==== '''<code>[[#static_cast|static_cast]]</code>'''は、C++において型変換を行うためのキャスト演算子の一つで、コンパイル時に型安全を提供し、明示的にキャストする必要がある場合に使用されます。<code>[[#static_cast|static_cast]]</code>は、通常、明確に型変換を行いたいときに使い、コンパイル時に型がチェックされます。<code>[[#static_cast|static_cast]]</code>は、安全なキャストを保証しますが、適切な型変換を行うためには、キャストが合法であることがコンパイル時に確認される必要があります。 C++での'''<code>[[#static_cast|static_cast]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#static_cast|static_cast]]</code>は、通常の型変換のために使用され、動的な型変換ではなく、コンパイル時に型の互換性をチェックします。これは、型が互換性を持っている場合に有効です。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void foo() {} }; class Derived : public Base {}; Base* base = new Derived(); Derived* derived = static_cast<Derived*>(base); // 正しい型変換</syntaxhighlight> * 上記のコードでは、<code>Base</code>型のポインタを<code>Derived</code>型のポインタにキャストしています。このようなキャストは、クラス階層で型が適合している場合に有効です。 '''C++11''':機能拡張 * C++11では、<code>[[#static_cast|static_cast]]</code>は、より厳密な型変換を提供し、特に基底クラスと派生クラスの間でのキャストに役立ちます。また、C++11以降のバージョンでは、より厳密な型安全性が強化されています。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void foo() {} }; class Derived : public Base { public: void bar() {} }; Base* base = new Derived(); Derived* derived = static_cast<Derived*>(base); // 正しいキャスト</syntaxhighlight> * <code>[[#static_cast|static_cast]]</code>は、ポインタ型の変換において、実行時のチェックなしで型変換を行います。そのため、キャストが合法であることが保証されていない場合に使用することは避けるべきです。 '''<code>[[#static_cast|static_cast]]</code>の主な用途''': # 明示的な型変換を行う # 基底クラスと派生クラス間での型変換 # 基本的なデータ型間(例えば、<code>[[#int|int]]</code>から<code>[[#float|float]]</code>など)のキャスト # ポインタの型変換を行う(ポインタ型と参照型のキャスト) 現代のC++では、<code>[[#static_cast|static_cast]]</code>は以下のような場面で重要な役割を果たします: * 明示的に型変換を行う際の使用 * クラス階層での型変換 * 型変換がコンパイル時にチェックされるため、安全性が高い * C++の最適化機能を活用したキャスト操作 '''注意点''': * <code>[[#static_cast|static_cast]]</code>は、型変換がコンパイル時に明確である場合にのみ使用されます。無効なキャストを行うと、コンパイルエラーが発生します。 * <code>[[#dynamic_cast|dynamic_cast]]</code>のように、<code>[[#static_cast|static_cast]]</code>は実行時に型を確認しないため、型変換が正しくない場合に予期しない結果を引き起こす可能性があります。 :<syntaxhighlight lang=c++ copy>int a = 5; double b = static_cast<double>(a); // intからdoubleへのキャスト</syntaxhighlight> * ここでは、<code>[[#static_cast|static_cast]]</code>を使用して<code>[[#int|int]]</code>型を<code>[[#double|double]]</code>型に変換しています。この場合、コンパイル時に正しいキャストが行われ、型が安全に変換されます。 <code>[[#static_cast|static_cast]]</code>は、C++の型変換演算子の中で最も一般的に使用されるものの一つであり、特にコンパイル時に型変換が明確な場合に便利です。また、<code>[[#dynamic_cast|dynamic_cast]]</code>とは異なり、実行時に型安全性を保証するものではないため、適切な状況で使用することが求められます。 ==== reinterpret_cast ==== '''<code>[[#reinterpret_cast|reinterpret_cast]]</code>'''は、C++における型変換演算子の一つで、最も強力かつ危険な型変換を提供します。このキャストは、型のビットパターンをそのまま別の型に再解釈するために使用されます。通常、<code>[[#reinterpret_cast|reinterpret_cast]]</code>は、ポインタ型や参照型間で型変換を行うために用いられますが、型安全性がほとんど保証されません。そのため、不適切な使用は未定義動作を引き起こす可能性があるため、注意が必要です。 C++での'''<code>[[#reinterpret_cast|reinterpret_cast]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>は、型間での低レベルなビットパターンの変換を行います。通常、ポインタ型や参照型、整数型間のキャストに使用されます。 :<syntaxhighlight lang=c++ copy>int a = 10; char* p = reinterpret_cast<char*>(&a); // int* を char* に変換 // メモリのビットパターンを直接操作する for (int i = 0; i < sizeof(a); ++i) { std::cout << *(p + i); // 文字列として表示する場合 }</syntaxhighlight> * 上記のコードでは、<code>[[#int|int]]</code>型のポインタを<code>[[#char|char]]</code>型のポインタに変換し、ポインタが指すメモリの内容をそのまま解釈しています。これは通常、低レベルなメモリ操作やバイナリデータの操作に使われます。 '''C++11''':機能拡張 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>は、ポインタ型同士や、ポインタと整数型の間でのキャストが可能になり、さらなる低レベル操作が可能となりました。 * このキャストは、特にハードウェアやシステムプログラミングで有用で、メモリのビットパターンを直接操作する必要がある場面で使われますが、慎重に使用しなければなりません。 :<syntaxhighlight lang=c++ copy>void* ptr = malloc(10); int* intPtr = reinterpret_cast<int*>(ptr); // void* を int* にキャスト</syntaxhighlight> * 上記のように、<code>[[#reinterpret_cast|reinterpret_cast]]</code>は<code>void*</code>型のポインタを他の型のポインタに変換するためにも使用されます。 '''<code>[[#reinterpret_cast|reinterpret_cast]]</code>の主な用途''': # ポインタ型や参照型、整数型間での低レベルな型変換 # メモリのビットパターンをそのまま別の型として扱う # システムプログラミングやハードウェア制御における特殊なキャスト # 低レベルなバイナリ操作やデータシリアライズに使用 現代のC++では、<code>[[#reinterpret_cast|reinterpret_cast]]</code>は以下のような場面で重要な役割を果たします: * システムプログラミングやデバイス制御、OSの内部でのメモリ操作 * バイナリデータを異なる型として解釈する場合 * ハードウェアやネットワークプロトコルにおけるデータ変換 '''注意点''': * <code>[[#reinterpret_cast|reinterpret_cast]]</code>は型のビットパターンを無理やり変換するため、キャストが不正であってもコンパイルエラーは発生しません。そのため、適切に使用しないと未定義動作を引き起こす可能性があります。 * 特にポインタ型を異なる型にキャストするときは、元の型との整合性がない場合に不具合が生じることがあります。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>は非常に強力なキャストですが、通常は他のキャスト(例えば<code>[[#static_cast|static_cast]]</code>や<code>[[#dynamic_cast|dynamic_cast]]</code>)を使うことが推奨され、最終手段として使用するべきです。 :<syntaxhighlight lang=c++ copy>int a = 10; void* ptr = reinterpret_cast<void*>(&a); // int* を void* に変換</syntaxhighlight> * 上記のコードでは、<code>[[#int|int]]</code>型のポインタを<code>void*</code>型に変換しています。このような変換は、メモリ操作やポインタの汎用性を持たせる場合に使用されます。 <code>[[#reinterpret_cast|reinterpret_cast]]</code>は、型の再解釈を行う強力なキャスト演算子であり、低レベルプログラミングにおいて有用ですが、誤用は危険です。型変換が安全であることを確認し、慎重に使用する必要があります。 ==== const_cast ==== '''<code>[[#const_cast|const_cast]]</code>は、C++における型変換演算子の一つで、オブジェクトのconst修飾'''を付け外しするために使用されます。このキャストは、'''const'''または'''volatile'''指定子を持つポインタや参照を、逆にして変更できるようにするために使われます。主に、<code>[[#const|const]]</code>を外すことで、変更可能なポインタにアクセスするために使用されますが、'''constの安全性を破壊する'''可能性があるため、使用には注意が必要です。 C++での'''<code>[[#const_cast|const_cast]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#const_cast|const_cast]]</code>は、ポインタや参照から<code>[[#const|const]]</code>指定子を除去するために使用されます。<code>[[#const_cast|const_cast]]</code>によって<code>[[#const|const]]</code>指定子を削除することはできますが、実際にオブジェクトが不変である場合、変更を行うことは未定義動作につながるため注意が必要です。 :<syntaxhighlight lang=c++ copy>const int x = 10; int* p = const_cast<int*>(&x); // constを外して変更可能なポインタに変換 *p = 20; // これは未定義動作です</syntaxhighlight> * 上記のコードはコンパイルは通りますが、<code>[[#x|x]]</code>が<code>[[#const|const]]</code>であるため、<code>[[#p|p]]</code>を使ってその値を変更するのは未定義動作を引き起こします。 '''C++11''':機能拡張 * <code>[[#const_cast|const_cast]]</code>は引き続き<code>[[#const|const]]</code>指定子を操作するために使用されますが、<code>[[#const|const]]</code>を外してポインタの値を変更することは依然として危険です。<code>[[#const_cast|const_cast]]</code>は、'''constの安全性'''を維持するためには慎重に使用する必要があります。 :<syntaxhighlight lang=c++ copy>const int a = 10; const int* p1 = &a; int* p2 = const_cast<int*>(p1); // constのポインタをconstでないポインタに変換 // p2を使って値を変更するのは未定義動作です</syntaxhighlight> '''<code>[[#const_cast|const_cast]]</code>の主な用途''': # '''const修飾の取り外し''':<code>[[#const|const]]</code>または<code>[[#volatile|volatile]]</code>修飾されたポインタや参照から、それらを外して変更可能にするために使用します。 # '''関数パラメータの調整''':関数が<code>[[#const|const]]</code>修飾された引数を受け取る場合でも、<code>[[#const|const]]</code>を外して変更できるポインタに変換する際に使用されます。 # '''<code>[[#const|const]]</code>の制約を回避''':<code>[[#const_cast|const_cast]]</code>を使うことで、<code>[[#const|const]]</code>なオブジェクトに対する変更が許可される場面で使用されます。 '''現代のC++での<code>[[#const_cast|const_cast]]</code>の使用例''': * <code>[[#const_cast|const_cast]]</code>は関数の引数が<code>[[#const|const]]</code>であっても、その引数を変更したい場合に使われますが、常にその変更が適切であるかどうかを確認する必要があります。たとえば、ライブラリ関数などで、外部APIに従って<code>[[#const|const]]</code>修飾を強制している場面で便利です。 :<syntaxhighlight lang=c++ copy>void modifyValue(const int& x) { int& ref = const_cast<int&>(x); // const参照を変更可能な参照にキャスト ref = 20; // xの値を変更(実際には不正な操作の場合、未定義動作) } const int val = 10; modifyValue(val); // 未定義動作の危険</syntaxhighlight> * 上記のコードでは、<code>[[#const|const]]</code>参照を<code>[[#const_cast|const_cast]]</code>を使って非<code>[[#const|const]]</code>参照に変換し、その値を変更しようとしていますが、これは未定義動作につながる可能性があるため、慎重に使用する必要があります。 '''<code>[[#const_cast|const_cast]]</code>の主な注意点''': * '''constオブジェクトを変更しない''':<code>[[#const_cast|const_cast]]</code>を使っても、実際に<code>[[#const|const]]</code>オブジェクトが変更されるべきではありません。変更することで未定義動作が発生する可能性があります。 * '''constの安全性を破壊する可能性''':<code>[[#const_cast|const_cast]]</code>は<code>[[#const|const]]</code>指定子を取り外すことができますが、これはプログラムの論理的な安全性を損なうことになるため、注意深く使用する必要があります。 :<syntaxhighlight lang=c++ copy>const int x = 100; const int* p1 = &x; int* p2 = const_cast<int*>(p1); // const指定子を外す *p2 = 50; // 未定義動作(変更してはいけない)</syntaxhighlight> * 上記のコードは<code>[[#const_cast|const_cast]]</code>を用いて<code>[[#const|const]]</code>指定子を外していますが、変更が不正であるため、未定義動作を引き起こす危険があります。 <code>[[#const_cast|const_cast]]</code>は、主にポインタや参照において<code>[[#const|const]]</code>修飾子を取り外すために使用されますが、その使用には慎重さが必要です。<code>[[#const|const]]</code>オブジェクトを変更することは未定義動作を引き起こす可能性があり、<code>[[#const_cast|const_cast]]</code>の使用は必要最小限に抑えるべきです。 ==== sizeof ==== '''<code>[[#sizeof|sizeof]]</code>'''は、C++における演算子の一つで、オブジェクトや型のサイズ(バイト単位)をコンパイル時に取得するために使用されます。<code>[[#sizeof|sizeof]]</code>は、C言語から引き継がれた演算子で、型情報を静的に評価するため、プログラムの実行時には影響を与えません。<code>[[#sizeof|sizeof]]</code>は、型のサイズを取得するだけでなく、ポインタのサイズや配列の要素数を計算するためにも広く使用されます。 C++での'''<code>[[#sizeof|sizeof]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#sizeof|sizeof]]</code>演算子は、型や変数に対してそのサイズをバイト単位で返します。C++98では、主に型のサイズや、配列の要素数、ポインタのサイズを計算するために使用されます。 :<syntaxhighlight lang=c++ copy>int x = 10; std::cout << "Size of int: " << sizeof(x) << " bytes" << std::endl; // intのサイズを表示</syntaxhighlight> * 上記のコードでは、<code>sizeof(x)</code>が<code>[[#x|x]]</code>の型である<code>[[#int|int]]</code>型のサイズ(通常は4バイト)を返します。 :<syntaxhighlight lang=c++ copy>int arr[10]; std::cout << "Size of array: " << sizeof(arr) << " bytes" << std::endl; // 配列のサイズを表示 std::cout << "Number of elements: " << sizeof(arr) / sizeof(arr[0]) << std::endl; // 配列の要素数</syntaxhighlight> * 配列に対して<code>[[#sizeof|sizeof]]</code>を使用すると、配列全体のサイズが返され、配列の要素数を得るためには配列のサイズを個々の要素のサイズで割ることで計算できます。 '''C++11以降''':機能拡張 * C++11では、<code>[[#sizeof|sizeof]]</code>演算子は依然として変わらず使用されますが、型推論や<code>[[#decltype|decltype]]</code>との組み合わせによる動的型情報の取得が進化しました。<code>[[#sizeof|sizeof]]</code>は型に関する詳細な情報を得るための基本的なツールとなっています。 :<syntaxhighlight lang=c++ copy>auto lambda = [](auto x) { std::cout << "Size of parameter: " << sizeof(x) << " bytes" << std::endl; }; lambda(10); // 引数にintを渡すと、sizeof(x)はintのサイズ(4バイト)を表示 lambda(3.14); // 引数にdoubleを渡すと、sizeof(x)はdoubleのサイズ(8バイト)を表示</syntaxhighlight> * 上記のコードでは、ラムダ式内で<code>[[#sizeof|sizeof]]</code>を使って、<code>[[#x|x]]</code>の型(<code>[[#int|int]]</code>や<code>[[#double|double]]</code>など)のサイズを出力しています。 '''<code>[[#sizeof|sizeof]]</code>の主な用途''': # '''型サイズの取得''':<code>[[#sizeof|sizeof]]</code>は、特定の型(基本型や構造体、クラスなど)のサイズを取得するために使います。これにより、メモリ管理や効率的なデータ処理が可能になります。 # '''配列のサイズ計算''':配列のサイズを計算したり、配列の要素数を取得するために使います。特に、配列とポインタの違いを理解するために重要です。 # '''構造体やクラスのメモリ配置確認''':構造体やクラスのメモリレイアウトを確認するために<code>[[#sizeof|sizeof]]</code>を使用することがあります。これにより、パディングやアライメントの影響を理解できます。 '''現代のC++での<code>[[#sizeof|sizeof]]</code>の使用例''': * <code>[[#sizeof|sizeof]]</code>は、メモリ管理や最適化のために、特に低レベルなプログラムにおいて重要な役割を果たします。例えば、データ構造の設計において、メモリ使用量を確認したり、アルゴリズムの効率を調整する際に活用できます。 :<syntaxhighlight lang=c++ copy>struct MyStruct { int a; char b; double c; }; std::cout << "Size of MyStruct: " << sizeof(MyStruct) << " bytes" << std::endl;</syntaxhighlight> * 上記の例では、<code>MyStruct</code>という構造体のサイズを<code>[[#sizeof|sizeof]]</code>を使って取得しています。構造体のサイズはメンバの型のサイズの合計ではなく、アライメントやパディングによって異なる場合があります。 :<syntaxhighlight lang=c++ copy>std::cout << "Size of pointer: " << sizeof(void*) << " bytes" << std::endl; // ポインタのサイズ</syntaxhighlight> * ポインタ型に対して<code>[[#sizeof|sizeof]]</code>を使うと、ポインタのサイズ(通常は4バイトまたは8バイト)を取得できます。これは、ポインタが指し示すデータの型とは無関係です。 '''<code>[[#sizeof|sizeof]]</code>の主な注意点''': # '''配列とポインタの違い''':配列に対して<code>[[#sizeof|sizeof]]</code>を使うと、配列の全体のサイズを返しますが、ポインタに対して使うとポインタ自体のサイズ(通常は4バイトまたは8バイト)を返します。このため、ポインタを使って配列のサイズを間違えて計算することがないように注意が必要です。 :<syntaxhighlight lang=c++ copy>int arr[10]; int* p = arr; std::cout << "Size of array: " << sizeof(arr) << " bytes" << std::endl; // 配列のサイズ std::cout << "Size of pointer: " << sizeof(p) << " bytes" << std::endl; // ポインタのサイズ</syntaxhighlight> * 上記のコードでは、<code>sizeof(arr)</code>が配列全体のサイズを返しますが、<code>sizeof(p)</code>はポインタ自体のサイズ(通常4バイトまたは8バイト)を返します。 # '''構造体のパディング''':構造体のサイズが、構造体メンバの型サイズの合計より大きくなることがあります。これは、メンバのアライメント要求やパディングによるものです。 :<syntaxhighlight lang=c++ copy>struct AlignedStruct { char c; int i; }; std::cout << "Size of AlignedStruct: " << sizeof(AlignedStruct) << " bytes" << std::endl;</syntaxhighlight> * 上記のコードでは、<code>AlignedStruct</code>のサイズが<code>[[#char|char]]</code>(1バイト)と<code>[[#int|int]]</code>(4バイト)の合計ではなく、アライメントを考慮したサイズが返されます。 '''まとめ''': <code>[[#sizeof|sizeof]]</code>は、C++で非常に重要な演算子で、型のサイズ、配列の要素数、構造体やクラスのメモリレイアウトを確認するために広く使用されます。C++98からC++11以降にかけて、型推論やラムダ式などの新しい機能と組み合わせて、さらに強力なツールとなっています。 ==== typeid ==== '''<code>[[#typeid|typeid]]</code>'''は、C++における演算子の一つで、オブジェクトまたは型の実際の型情報を取得するために使用されます。<code>[[#typeid|typeid]]</code>は、C++RTTI(Run-Time Type Information)の一部であり、実行時にオブジェクトの型を調べることができます。特に、ポインタや参照を使って動的型を確認する場合に有用です。 C++での'''<code>[[#typeid|typeid]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#typeid|typeid]]</code>演算子は、オブジェクトまたは型に対して、その実際の型情報を得るために使用されます。この演算子は、動的型付けが可能なクラス階層において特に有用です。 :<syntaxhighlight lang=c++ copy>#include <iostream> #include <typeinfo> class Base { }; class Derived : public Base { }; auto main() -> int { Base* basePtr = new Derived(); // 基本クラスポインタから派生クラスを指している場合 std::cout << "Type of basePtr: " << typeid(*basePtr).name() << std::endl; delete basePtr; return 0; }</syntaxhighlight> * 上記のコードでは、<code>typeid(*basePtr)</code>が<code>basePtr</code>が指しているオブジェクトの実際の型情報を返します。<code>[[#typeid|typeid]]</code>はポインタや参照を使って動的型情報を取得でき、クラス階層を考慮した型識別が可能です。 '''C++11以降''':機能拡張 * C++11では、<code>[[#typeid|typeid]]</code>はさらに強力な機能を持つようになり、<code>[[#typeid|typeid]]</code>を使ってコンパイル時および実行時の型情報を調べるための方法が進化しました。特に、<code>[[#typeid|typeid]]</code>演算子は、ポリモーフィズムを使った型の特定に重要な役割を果たします。 :<syntaxhighlight lang=c++ copy>#include <iostream> #include <typeinfo> class Shape { public: virtual void draw() const { std::cout << "Drawing Shape" << std::endl; } virtual ~Shape() = default; }; class Circle : public Shape { public: void draw() const override { std::cout << "Drawing Circle" << std::endl; } }; auto main() -> int { Shape* shape = new Circle(); std::cout << "Type of shape: " << typeid(*shape).name() << std::endl; delete shape; return 0; }</syntaxhighlight> * この例では、<code>typeid(*shape)</code>は実際に<code>Circle</code>オブジェクトが指されていることを示します。<code>[[#typeid|typeid]]</code>を使うことで、ポリモーフィックなクラスでも実行時に動的な型を確認することができます。 '''<code>[[#typeid|typeid]]</code>の主な用途''': # '''動的型の取得''':<code>[[#typeid|typeid]]</code>は、ポインタや参照を使って実行時にオブジェクトの型を調べるために使います。これは、基底クラスポインタを使って派生クラスの情報を得る場合に有用です。 # '''型情報の比較''':<code>[[#typeid|typeid]]</code>を使って、異なる型同士の比較を行うことができます。特に、クラス階層で異なる型かどうかを調べるために利用されます。 # '''デバッグや型チェック''':型に関する情報をデバッグ時に確認したり、型チェックのために使用されることが多いです。 :<syntaxhighlight lang=c++ copy>#include <iostream> #include <typeinfo> class Base {}; class Derived : public Base {}; auto main() -> int { Base* basePtr = new Derived(); if (typeid(*basePtr) == typeid(Derived)) { std::cout << "basePtr is of type Derived" << std::endl; } else { std::cout << "basePtr is not of type Derived" << std::endl; } delete basePtr; return 0; }</syntaxhighlight> * 上記のコードでは、<code>[[#typeid|typeid]]</code>を使って<code>basePtr</code>が実際に指している型が<code>Derived</code>であるかどうかを比較しています。このように、型が一致するかどうかを簡単に確認することができます。 '''現代のC++での<code>[[#typeid|typeid]]</code>の使用例''': * <code>[[#typeid|typeid]]</code>は、特に動的型のチェックやポリモーフィズムの動作を理解するために不可欠です。クラス階層の型確認や型識別を行う際に、非常に便利なツールです。 :<syntaxhighlight lang=c++ copy>#include <iostream> #include <typeinfo> class Base { virtual void f() {} }; class Derived : public Base {}; auto main() -> int { Base* basePtr = new Derived(); std::cout << "Type of basePtr: " << typeid(*basePtr).name() << std::endl; // Derived型の情報が出力される // 型比較 if (typeid(*basePtr) == typeid(Derived)) { std::cout << "basePtr is of type Derived" << std::endl; } delete basePtr; return 0; }</syntaxhighlight> * このコードでは、<code>typeid(*basePtr)</code>を使って、<code>basePtr</code>が指し示すオブジェクトの型が<code>Derived</code>であることを確認しています。 '''<code>[[#typeid|typeid]]</code>の主な注意点''': # '''ポリモーフィズムが必要''':<code>[[#typeid|typeid]]</code>は、動的型情報を取得するためにポリモーフィックな型(少なくとも仮想関数を持つ型)に依存します。非ポリモーフィックなクラスに対して<code>[[#typeid|typeid]]</code>を使用しても、静的な型情報しか得られません。 # '''<code>[[#typeid|typeid]]</code>の比較''':<code>[[#typeid|typeid]]</code>の結果を比較する際、<code>[[#typeid|typeid]]</code>が返す型情報は、型に関する詳細な情報を含んでいますが、同じ型でも異なる名前が出力される場合があることに注意が必要です(特に異なるコンパイラ間で)。 '''まとめ''': <code>[[#typeid|typeid]]</code>は、C++で型情報を動的に取得するための重要なツールです。特にポリモーフィックな型において、実行時にオブジェクトの型を調べたり、型の比較を行ったりするために広く利用されます。C++98からC++11以降にかけて、<code>[[#typeid|typeid]]</code>は型情報を扱うための重要な演算子として進化し、より強力で柔軟な機能を提供しています。 === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 ==== try ==== ==== catch ==== ==== throw ==== ==== noexcept ==== === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ==== namespace ==== ==== using ==== ==== typedef ==== ==== using ==== ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] 80kei3z3scyye3v9kfm541rv9qmw5d9 264194 264191 2024-11-25T11:54:10Z Ef3 694 /* 例外関連指定子 */ try、throw、catch、noexceptは、C++における例外処理を扱うための重要な構成要素です。これらのキーワードは、プログラム内でエラーや異常事態が発生した際に、その処理方法を指定するために使用されます。例外処理は、プログラムの堅牢性を向上させ、異常時に適切な対応を行うための機能を提供します。 264194 wikitext text/x-wiki == 指定子 == C++ にはさまざまな指定子があります。それらは主に、変数、関数、クラス、メンバーの挙動を制御するために使用されます。以下に、C++でよく使用される指定子をカテゴリー別に一覧にしました。 === アクセス制御指定子 === これらはクラスのメンバーのアクセス制御を行うための指定子です。 * <code>[[#public|public]]</code>:メンバーが外部からアクセス可能。 * <code>[[#private|private]]</code>:メンバーがクラス内からのみアクセス可能。 * <code>[[#protected|protected]]</code>:メンバーがクラス内と派生クラスからアクセス可能。 C++のアクセス指定子({{Anchors|public|protected|private}})は、'''C++の最初の規格'''であるC++98から存在していました。 ただし、これらの概念自身は実際にはもっと前からありました: * Bjarne Stroustrupが開発した "C with Classes"(1979年)の時点で既にprivateとpublicの概念が導入されていました * protectedはその後、C++が開発される過程で継承をサポートするために追加されました 基本的な使用例: :<syntaxhighlight lang=c++ copy> class Example { private: // クラス内部からのみアクセス可能 int privateVar; protected: // 自クラスと派生クラスからアクセス可能 int protectedVar; public: // どこからでもアクセス可能 int publicVar; }; </syntaxhighlight> なお、structとclassの唯一の違いは、指定子を省略した場合のデフォルトの可視性です: * structの場合:デフォルトで[[#public|public]] * classの場合:デフォルトで[[#private|private]] これらのアクセス指定子は、オブジェクト指向プログラミングにおけるカプセル化の基本的な機能として、C++言語の最も初期から組み込まれていました。 === メモリ管理関連指定子 === これらはメモリ管理や最適化に関連する指定子です。 * <code>[[#mutable|mutable]]</code>:定数メンバー関数内でも変更可能なメンバー。 * <code>[[#static|static]]</code>:変数や関数の静的(クラス固有)な属性を指定。 * <code>[[#thread_local|thread_local]]</code>:スレッド固有の変数。 * <code>[[#constexpr|constexpr]]</code>:コンパイル時に計算可能な定数として指定。 * <code>[[#inline|inline]]</code>:関数をインライン展開することを示唆。 ==== mutable ==== C++の<code>mutable</code>指定子は'''C++98'''から導入されました。 <code>mutable</code>の主な用途は、constメンバ関数内でも変更可能なメンバ変数を定義することです: :<syntaxhighlight lang=c++ copy> class Example { private: mutable int counter; // constメンバ関数内でも変更可能 std::string data; public: void doSomething() const { counter++; // OK: mutableなので const メソッド内でも変更可能 // data = "test"; // エラー: constメソッド内では変更不可 } }; </syntaxhighlight> 主な使用ケース: * キャッシュの実装 * ミューテックスやロックなどの同期プリミティブ * 参照カウンタ * ロギング機能 C++11以降では、ラムダ式でも<code>mutable</code>キーワードが使用可能になり、キャプチャした値をラムダ内部で変更できるようになりました: :<syntaxhighlight lang=c++ copy> int value = 42; auto lambda = [value]() mutable { value++; // OK: mutableなのでキャプチャした値を変更可能 return value; }; </syntaxhighlight> このように、<code>mutable</code>は主にconst正当性(const correctness)を維持しながら、必要な内部状態の変更を可能にするために使用されます。 ==== static ==== C++の<code>static</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。ただし、概念自体はCからの継承であり、C言語の時代(1970年代)から存在していました。 C++での<code>static</code>の主な用途: # クラスメンバの静的宣言(C++固有): #:<syntaxhighlight lang=c++ copy> class Example { static int count; // 静的メンバ変数 static void func(); // 静的メンバ関数 public: Example() { count++; } // インスタンスごとにカウント static int getCount() { return count; } }; // 静的メンバ変数の定義(クラス外で必要) int Example::count = 0; </syntaxhighlight> # ファイルスコープの制限(Cからの継承): #:<syntaxhighlight lang=c++ copy> static void helperFunction() { // この関数は同じファイル内でのみ見える // ... } static int globalVar; // この変数は同じファイル内でのみ見える </syntaxhighlight> # 関数内の静的変数(Cからの継承): #:<syntaxhighlight lang=c++ copy> void func() { static int counter = 0; // 初回呼び出し時のみ初期化され、値は保持される counter++; } </syntaxhighlight> C++11以降の追加機能: * スレッドローカルストレージ(<code>[[#Thread local|thread_local]]</code>)の導入により、<code>static</code>とスレッド安全性の関係が明確化 * 静的メンバの初期化順序の保証の強化 このように、<code>static</code>は言語の最も基本的な機能の1つとして、C言語の時代から存在し、C++に引き継がれて拡張されました。 ==== thread_local ==== C++の<code>thread_local</code>指定子は'''C++11'''から導入されました。 <code>thread_local</code>は各スレッドが独自のコピーを持つ変数を宣言するために使用されます: :<syntaxhighlight lang=c++ copy> // グローバルスコープでの使用 thread_local int global_counter = 0; class Example { // クラスメンバとしての使用 static thread_local int member_counter; void func() { // 関数内での使用 thread_local int local_counter = 0; local_counter++; // このスレッド固有の値が増加 } }; void threadFunc() { global_counter++; // 各スレッドが独自のコピーを持つ std::cout << global_counter; // 各スレッドで独立してカウント } </syntaxhighlight> <code>thread_local</code>の主な特徴: * 変数はスレッドの開始時に初期化 * スレッドの終了時に破棄 * 各スレッドで独立した記憶領域を持つ * staticやexternと組み合わせ可能 使用例: * スレッド固有のキャッシュ * スレッドローカルなカウンタやバッファ * スレッド固有の一時データの保持 これは従来の<code>static</code>変数をマルチスレッド環境で安全に使用するための重要な拡張となりました。 ==== constexpr ==== C++の<code>constexpr</code>指定子は以下のような段階的な進化を遂げています: '''C++11''':初期導入 * 基本的な<code>constexpr</code>関数とコンストラクタのサポート * 制限が厳しく、関数本体は基本的に1つのreturn文のみ許可 :<syntaxhighlight lang=c++ copy> // C++11での例 constexpr int square(int x) { return x * x; // 単純なreturn文のみ許可 } constexpr int value = square(5); // コンパイル時に計算 </syntaxhighlight> '''C++14''':大幅な制限緩和 * 複数の文を許可 * ローカル変数の使用を許可 * for文やif文などの制御構文を許可 :<syntaxhighlight lang=c++ copy> // C++14での例 constexpr int factorial(int n) { int result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result; } </syntaxhighlight> '''C++17''':さらなる機能追加 * <code>if constexpr</code>の導入 * ラムダ式での<code>constexpr</code>を許可 :<syntaxhighlight lang=c++ copy> // C++17での例 template <typename T> auto process(T value) { if constexpr (std::is_integral_v<T>) { return value * 2; } else { return value + 2; } } constexpr auto lambda = [](int n) constexpr { return n * n; }; </syntaxhighlight> '''C++20''':仮想関数とtry-catchの許可 * <code>constexpr</code>仮想関数のサポート * <code>constexpr</code>でのtry-catch構文の許可 * <code>constexpr std::vector</code>などの標準ライブラリコンテナの<code>constexpr</code>化 :<syntaxhighlight lang=c++ copy> // C++20での例 constexpr bool contains_negative() { std::vector<int> v = {1, -2, 3}; // constexprなvector return std::any_of(v.begin(), v.end(), [](int x) { return x < 0; }); } </syntaxhighlight> このように、<code>constexpr</code>は導入以降、コンパイル時計算の機能を徐々に拡張してきました。 ==== inline ==== <!-- C++のinline指定子は規格年次的にいつから? --> C++の<code>inline</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。実際にはそれ以前から、Cプリプロセッサのマクロの代替として、より型安全な方法を提供するために使用されていました。 時系列で見た<code>inline</code>の進化: '''C++98''':初期導入 :<syntaxhighlight lang=c++ copy> inline int square(int x) { return x * x; } class Example { int value; public: // クラス定義内で定義されたメンバ関数は暗黙的にinline int getValue() { return value; } }; </syntaxhighlight> '''C++17''':変数への<code>inline</code>指定子サポート * ヘッダーファイルで定義されるグローバル変数やstatic変数に対して使用可能に :<syntaxhighlight lang=c++ copy> // header.h inline int globalCounter = 0; // ODR違反を防ぐ inline constexpr int MAX_VALUE = 100; class Logger { static inline int instanceCount = 0; // クラス内static変数の定義が可能に }; </syntaxhighlight> <code>inline</code>の主な特徴: * コンパイラへの最適化のヒント * One Definition Rule (ODR)の例外を提供 ** 同じ定義が複数の翻訳単位に現れることを許可 ** ヘッダーファイルでの関数定義を可能に 現代的な使用: # パフォーマンス最適化よりも、ODR違反を避けるために使用 # ヘッダーオンリーライブラリの実装に重要 # テンプレートの実装でよく使用 コンパイラは<code>inline</code>指定子を最適化のヒントとして扱いますが、実際のインライン展開は指定子の有無に関わらずコンパイラが判断します。 === 型指定子 === これらは型の変換や、型に関連する指定子です。 * <code>[[#const|const]]</code>:変数の値を変更できないように指定。 * <code>[[#volatile|volatile]]</code>:変数が外部から変更される可能性があることを示す。 * <code>[[#signed|signed]]</code>:符号付き整数型。 * <code>[[#unsigned|unsigned]]</code>:符号なし整数型。 * <code>[[#long|long]]</code>:長整数型。 * <code>[[#short|short]]</code>:短整数型。 * <code>[[#long long|long long]]</code>:長長整数型(64ビットの整数型)。 ==== const ==== C++の<code>[[#const|const]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語にも1989年のANSI C(C89)で導入され、C++はその概念を拡張して採用しました。 C++での<code>[[#const|const]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy> // 基本的なconst変数 const int MAX_VALUE = 100; // constポインタとポインタのconst const int* p1; // データがconst int* const p2 = &x; // ポインタ自体がconst const int* const p3; // 両方がconst class Example { int value; public: // constメンバ関数 int getValue() const { return value; } // constパラメータ void setValue(const int& newValue) { value = newValue; } }; </syntaxhighlight> '''C++11''':機能拡張 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数との関係が明確化 * ラムダ式でのconstメンバ関数のサポート :<syntaxhighlight lang=c++ copy> auto lambda = [](int x) const { return x * x; }; </syntaxhighlight> <code>[[#const|const]]</code>の主な用途: # 値の不変性を保証 # コンパイル時のエラー検出 # 最適化の機会を提供 # インターフェースの安全性を確保 # const正当性(const correctness)の実現 現代のC++では、<code>[[#const|const]]</code>は以下のような場面で重要な役割を果たします: * データの不変性の保証 * APIの設計 * スレッド安全性の向上 * コードの意図の明確化 * パフォーマンスの最適化 また、<code>[[#const|const]]</code>は他の指定子(<code>[[#volatile|volatile]]</code>、<code>[[#mutable|mutable]]</code>など)と組み合わせて使用することで、より細かい制御が可能です。 ==== volatile ==== C++の<code>[[#volatile|volatile]]</code>指定子は、'''C++98'''から導入され、C言語の<code>[[#volatile|volatile]]</code>(C89)に基づいています。この指定子は、変数がコンパイラによって最適化されないようにするために使用されます。主にハードウェアレジスタやシグナル、割り込みハンドラでの使用が一般的です。 C++での<code>[[#volatile|volatile]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// volatile変数 volatile int flag = 0; void interruptHandler() { // 割り込みハンドラ内での変数の変更 flag = 1; } void checkFlag() { // flagが変更されるまで待機 while (flag == 0) { // 何か処理 } }</syntaxhighlight> '''C++11''':進化と変更 * <code>[[#volatile|volatile]]</code>の使い方は基本的にC++98と変わらないが、<code>std::atomic</code>や<code>[[#constexpr|constexpr]]</code>といった新しい機能が追加され、<code>[[#volatile|volatile]]</code>の使用が制限されることもある。 <code>[[#volatile|volatile]]</code>の主な用途: # ハードウェアのレジスタやメモリマップドI/O領域での変数の使用 # 割り込みハンドラやシグナル処理における変数の制御 # 外部の状態変化を監視する場合 # 変数の変更をコンパイラに知らせ、最適化を防ぐ 現代のC++では、<code>[[#volatile|volatile]]</code>の使用は慎重に行う必要があります。<code>[[#volatile|volatile]]</code>は、主に外部のハードウェアや割り込みの影響を受ける変数に対して使用されますが、マルチスレッドの安全性や同期を保証するための方法としては、<code>std::atomic</code>や<code>std::mutex</code>などの機能を使用することが推奨されます。 また、<code>[[#volatile|volatile]]</code>は<code>[[#const|const]]</code>や<code>[[#mutable|mutable]]</code>といった他の指定子と組み合わせて使用されることもありますが、その使い方には注意が必要です。<code>[[#volatile|volatile]]</code>はコンパイラの最適化を制御するためのものであり、スレッド間でのデータ競合や整合性を保証するものではない点を理解することが重要です。 ==== signed ==== C++の<code>[[#signed|signed]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号ありを明示するために使用されます。 C++での<code>[[#signed|signed]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// signed整数型の使用 signed int a = -10; // 符号ありのint(デフォルト) unsigned int b = 10; // 符号なし // 明示的な指定 signed char c = -128; // 符号ありのchar unsigned char d = 255; // 符号なしのchar // 他の型との比較 short x = -32768; // デフォルトでsigned signed short y = 32767; // 符号ありのshort</syntaxhighlight> '''C++11以降''':型の精密化 * <code>std::int8_t</code>や<code>std::int32_t</code>など、固定幅整数型(<code><cstdint></code>)が追加され、符号あり・なしの型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int8_t e = -128; // 符号あり8ビット整数 uint32_t f = 4294967295; // 符号なし32ビット整数</syntaxhighlight> <code>[[#signed|signed]]</code>の主な用途: # 符号あり整数型を明示することでコードの意図を明確化 # 符号なし型(<code>[[#unsigned|unsigned]]</code>)との対比で使用 # プラットフォーム間で型の挙動を統一 # 型キャストやオーバーフロー処理の際に役立つ 現代のC++では、<code>[[#signed|signed]]</code>を明示的に使う場面は少なく、<code>[[#int|int]]</code>や<code>[[#short|short]]</code>などの型はデフォルトで符号ありとして扱われます。しかし、以下のようなケースで使用されることがあります: * <code>[[#unsigned|unsigned]]</code>型との整合性を保つため * 符号あり型を明示し、可読性や意図を強調するため * 特定のプラットフォームやコンパイラの仕様に依存しないコードを書くため <code>[[#signed|signed]]</code>は他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することが可能です。また、型の正確な挙動を必要とする場合には、C++11以降の固定幅整数型(<code>std::intXX_t</code>)を優先することが推奨されます。 ==== unsigned ==== C++の<code>[[#unsigned|unsigned]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在していました。これはC言語(C89)にも導入されており、整数型に符号なしを明示するために使用されます。 C++での<code>[[#unsigned|unsigned]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// unsigned整数型の使用 unsigned int a = 42; // 符号なしint unsigned short b = 65535; // 符号なしshort unsigned long c = 4294967295; // 符号なしlong // unsigned char unsigned char d = 255; // 0〜255の範囲</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>std::uint8_t</code>など)が追加され、符号なし型をより明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> uint8_t e = 255; // 符号なし8ビット整数 uint64_t f = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#unsigned|unsigned]]</code>の主な用途: # 符号なし整数型を使用して負数を排除 # 範囲が0以上であることを明示 # 値の範囲を広げる(符号ビットをデータビットに転用) # ビット演算での使用 # ハードウェアとの整合性確保 現代のC++では、<code>[[#unsigned|unsigned]]</code>は以下のような場面で重要な役割を果たします: * ビット演算やシフト演算での正確な挙動保証 * 配列インデックスやカウント変数としての使用(負値を持たない場合) * 明確な意図の示唆(符号なし型を使用する理由を伝える) 注意点: * <code>[[#unsigned|unsigned]]</code>型同士または<code>[[#signed|signed]]</code>型との演算での型変換ルールに留意する必要があります。 * 範囲外の値を扱うとオーバーフローが発生するが、未定義動作にはならず、結果はラップアラウンドします。 :<syntaxhighlight lang=c++ copy>unsigned int x = 0; x--; // 結果は最大値</syntaxhighlight> 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>など)と組み合わせて使用することも可能ですが、コードの意図を明確にするため、C++11以降では<code>std::uintXX_t</code>を活用することが推奨されます。 ==== long ==== C++の<code>[[#long|long]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#long|long]]</code>は、基本的な整数型<code>[[#int|int]]</code>よりも大きな範囲の値を扱うために使用されます。 C++での<code>[[#long|long]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// long整数型の使用 long a = 100000L; // 符号ありlong(デフォルト) unsigned long b = 4294967295UL; // 符号なしlong // long long(非標準として一部のコンパイラでサポート) long long c = 123456789LL;</syntaxhighlight> '''C++11''':<code>[[#long long|long long]]</code>の標準化 * C++11で<code>[[#long long|long long]]</code>が標準に追加され、より大きな範囲の整数を扱うことが可能に。 * <code><cstdint></code>で固定幅型(<code>int64_t</code>など)が利用可能になり、より正確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t d = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t e = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long|long]]</code>の主な用途: # <code>[[#int|int]]</code>より大きな範囲の整数を扱う # プラットフォーム間で値の範囲を統一 # ハードウェアレジスタや大きな値を必要とする計算で使用 # サイズが明確でない場合の柔軟な型指定(特にC++98以前) 現代のC++では、<code>[[#long|long]]</code>の使用は以下のような場面で重要です: * <code>[[#long long|long long]]</code>による64ビット整数型のサポート * 過去のコードやAPIとの互換性 * 値の範囲を広げる必要がある場合 注意点: * <code>[[#long|long]]</code>や<code>[[#long long|long long]]</code>のサイズは環境依存で、32ビットまたは64ビットとなることが一般的。 * 明確な型のサイズが必要な場合、C++11以降では<code>std::intXX_t</code>や<code>std::uintXX_t</code>を使用することが推奨されます。 他の指定子(<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>、<code>[[#const|const]]</code>など)と組み合わせて柔軟に使用可能です。特に、プラットフォーム間でコードの可読性と移植性を高めるため、固定幅整数型の利用を検討することが重要です。 ==== short ==== C++の<code>[[#short|short]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しており、C言語(C89)に基づいています。<code>[[#short|short]]</code>は、<code>[[#int|int]]</code>よりも小さな範囲の値を扱うために使用され、通常、メモリの節約が必要な場合に用いられます。 C++での<code>[[#short|short]]</code>の主な用途と進化: '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>// short整数型の使用 short a = 32767; // 符号ありshort(デフォルト) unsigned short b = 65535; // 符号なしshort // 明示的に指定する例 signed short c = -32768; // 符号あり unsigned short d = 0; // 符号なし</syntaxhighlight> '''C++11以降''':型の精密化 * <code><cstdint></code>で固定幅整数型(<code>int16_t</code>など)が導入され、<code>[[#short|short]]</code>と同じサイズの型を明確に指定可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int16_t e = -32768; // 符号あり16ビット整数 uint16_t f = 65535; // 符号なし16ビット整数</syntaxhighlight> <code>[[#short|short]]</code>の主な用途: # メモリ使用量の節約 # 小さな範囲の整数値を扱う場合に適切 # ハードウェアとの整合性(特定のビット幅を必要とする場合) # レガシーコードやAPIとの互換性 現代のC++では、<code>[[#short|short]]</code>は以下のような場面で役立ちます: * 入力データが小さな整数範囲で済む場合 * データ構造のサイズを最小化する必要がある場合(組み込みシステムなど) * プラットフォームのネイティブサイズを利用する際の柔軟性 注意点: * <code>[[#short|short]]</code>のサイズは環境依存で、通常16ビットですが、環境によって異なる場合があります。 * 計算時に暗黙的に<code>[[#int|int]]</code>に昇格するため、オーバーフローや意図しない動作に注意が必要。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて使用可能です。また、固定幅型(<code>std::int16_t</code>や<code>std::uint16_t</code>)を使用することで、プラットフォーム間の挙動を一貫させることが推奨されます。 ==== long long ==== C++の<code>[[#long long|long long]]</code>指定子は、'''C++11'''で正式に標準化されました。それ以前では多くのコンパイラで拡張としてサポートされていました。<code>[[#long long|long long]]</code>は、<code>[[#long|long]]</code>よりもさらに大きな範囲の整数を扱うために使用されます。 C++での<code>[[#long long|long long]]</code>の主な用途と進化: '''C++11以前''':非標準の拡張として一部のコンパイラでサポート :<syntaxhighlight lang=c++ copy>// 非標準のlong long型 long long a = 123456789LL; // 符号あり unsigned long long b = 987654321ULL; // 符号なし</syntaxhighlight> '''C++11以降''':標準化と精密な型指定の拡充 * <code>[[#long long|long long]]</code>が正式に導入され、符号あり・符号なしともに使用可能。 * <code><cstdint></code>で固定幅整数型(<code>int64_t</code>など)が利用可能になり、サイズが明確な型指定が可能。 :<syntaxhighlight lang=c++ copy>#include <cstdint> int64_t c = 9223372036854775807LL; // 符号あり64ビット整数 uint64_t d = 18446744073709551615ULL; // 符号なし64ビット整数</syntaxhighlight> <code>[[#long long|long long]]</code>の主な用途: # 極めて大きな範囲の整数を扱う必要がある場合 # 64ビット整数型としての使用(特にハードウェアやファイルサイズ処理) # パフォーマンスを犠牲にせずに大きな値を扱う # 大規模な計算や暗号アルゴリズム 現代のC++では、<code>[[#long long|long long]]</code>は以下の場面で役立ちます: * ファイルオフセットやメモリサイズの表現 * 高精度な整数演算 * 型の範囲に対する明確な意図を示す 注意点: * <code>[[#long long|long long]]</code>のサイズはほとんどのプラットフォームで64ビットですが、標準では「少なくとも<code>[[#long|long]]</code>と同じサイズ」と定義されています。 * 計算や型変換時に他の型と組み合わせる場合、暗黙的な昇格や範囲外エラーに注意が必要です。 他の指定子(<code>[[#const|const]]</code>、<code>[[#volatile|volatile]]</code>、<code>[[#signed|signed]]</code>、<code>[[#unsigned|unsigned]]</code>など)と組み合わせて柔軟に使用可能です。また、サイズが固定された整数型(<code>std::int64_t</code>や<code>std::uint64_t</code>)を利用することで、プラットフォーム間の移植性を高めることが推奨されます。 === 関数・変数の修飾指定子 === これらは関数や変数の振る舞いを制御する指定子です。 * <code>[[#explicit|explicit]]</code>:コンストラクタや変換演算子に暗黙の型変換を禁止。 * <code>[[#friend|friend]]</code>:他のクラスや関数にクラスの内部にアクセスする権限を与える。 * <code>[[#virtual|virtual]]</code>:メンバー関数を仮想関数として指定し、動的バインディングを実現。 * <code>[[#override|override]]</code>:仮想関数をオーバーライドすることを指定。 * <code>[[#final|final]]</code>:仮想関数がオーバーライドされないことを指定。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを示す。 ==== explicit ==== C++の<code>[[#explicit|explicit]]</code>指定子は、'''C++98'''で導入されました。これはコンストラクタや変換演算子において、暗黙的な型変換を防ぐために使用され、コードの安全性と可読性を向上させます。 C++での<code>[[#explicit|explicit]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 暗黙的な型変換を禁止するための指定子。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit Example(int value) {} // 暗黙変換を禁止 }; Example e1 = 10; // エラー Example e2(10); // OK</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#explicit|explicit]]</code>を変換演算子にも適用可能に。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit operator bool() const { return true; } }; Example e; if (e) {} // OK(明示的変換) bool flag = e; // エラー(暗黙的変換は禁止)</syntaxhighlight> '''C++20''':条件付き<code>[[#explicit|explicit]]</code>の導入 * コンパイル時条件に基づき<code>[[#explicit|explicit]]</code>の適用を切り替え可能。 :<syntaxhighlight lang=c++ copy>class Example { public: explicit((sizeof(int) > 2)) Example(int value) {} };</syntaxhighlight> <code>[[#explicit|explicit]]</code>の主な用途: # 暗黙的な型変換によるバグを防止 # コンストラクタや変換演算子の意図を明確化 # コードの可読性とメンテナンス性を向上 現代のC++では、<code>[[#explicit|explicit]]</code>は以下の場面で重要な役割を果たします: * 型の安全性を確保するためのAPI設計 * 意図しない型変換を防ぐ * 条件に基づく柔軟な指定 注意点: * <code>[[#explicit|explicit]]</code>を付け忘れると、予期しない暗黙的な型変換が発生する可能性があります。 * 暗黙変換が必要な場合には、あえて<code>[[#explicit|explicit]]</code>を省略する設計が必要です。 <code>[[#explicit|explicit]]</code>はクラス設計の一部として、他の指定子(<code>[[#constexpr|constexpr]]</code>や<code>[[#virtual|virtual]]</code>など)と組み合わせて使用されることが多く、コードの意図をより明確にするために不可欠な機能です。 ==== friend ==== C++の<code>[[#friend|friend]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しています。これは、クラスのプライベートメンバやプロテクテッドメンバに外部の関数や他のクラスからアクセスできるようにするために使用されます。 C++での<code>[[#friend|friend]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 関数やクラスを「友達」にすることでアクセスを許可。 :<syntaxhighlight lang=c++ copy>class Example { private: int value; public: Example(int v) : value(v) {} friend void printValue(const Example& e); // フレンド関数 }; void printValue(const Example& e) { std::cout << e.value << std::endl; // プライベートメンバにアクセス可能 }</syntaxhighlight> '''C++11以降''':機能の応用 * テンプレートとの組み合わせで柔軟性が向上。 :<syntaxhighlight lang=c++ copy>template <typename T> class Container { private: T data; public: Container(T d) : data(d) {} template <typename U> friend void printData(const Container<U>& c); // フレンドテンプレート }; template <typename U> void printData(const Container<U>& c) { std::cout << c.data << std::endl; }</syntaxhighlight> <code>[[#friend|friend]]</code>の主な用途: # クラスの内部データへの制限的なアクセスを提供 # 操作のために外部関数を許可 # テンプレートとの組み合わせで汎用性の向上 現代のC++では、<code>[[#friend|friend]]</code>は以下の場面で役立ちます: * 特定の外部関数にアクセス権を与える(例:入出力演算子の実装) * 相互アクセスが必要なクラス間の連携を実現 * プライベートメンバの安全な操作を可能に 注意点: * フレンド関数を多用するとカプセル化が損なわれる可能性があります。 * 乱用を避け、必要最小限の範囲に限定すべきです。 <code>[[#friend|friend]]</code>は、API設計や特定のユースケースで重要な役割を果たしますが、設計上の責任を明確にすることが求められます。他の指定子(<code>[[#const|const]]</code>や<code>[[#explicit|explicit]]</code>など)と併用して、安全かつ明確な設計を心がけることが重要です。 ==== virtual ==== C++の<code>[[#virtual|virtual]]</code>指定子は、'''C++の最初の規格'''(C++98)から存在しています。これは多態性(ポリモーフィズム)を実現するために使用され、派生クラスで関数をオーバーライドできるようにします。 C++での<code>[[#virtual|virtual]]</code>の主な用途と進化: '''C++98''':基本的な機能 * 仮想関数を定義し、動的な関数呼び出しを実現。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() const override { // オーバーライド std::cout << "Derived class" << std::endl; } }; Base* b = new Derived(); b->show(); // "Derived class"(動的ディスパッチ)</syntaxhighlight> '''C++11''':機能の拡張 * <code>[[#override|override]]</code>と<code>[[#final|final]]</code>の導入により、意図の明確化と誤り防止が可能に。 :<syntaxhighlight lang=c++ copy>class Derived : public Base { public: void show() const override { /* ... */ } // 明示的オーバーライド }; class FinalDerived final : public Derived { // これ以上派生不可 void show() const override final { /* ... */ } // これ以上オーバーライド不可 };</syntaxhighlight> '''C++17'''以降:仮想関数テーブルの効率化や最適化が進化。 <code>[[#virtual|virtual]]</code>の主な用途: # 基底クラスの関数を派生クラスでオーバーライド可能に # 動的ポリモーフィズムを実現 # インターフェースの設計 # 共通の基底型での多態的な操作 現代のC++では、<code>[[#virtual|virtual]]</code>は以下の場面で重要な役割を果たします: * 抽象クラスの設計(純粋仮想関数によるインターフェースの提供) :<syntaxhighlight lang=c++ copy>class Abstract { public: virtual void doWork() const = 0; // 純粋仮想関数 };</syntaxhighlight> * 派生クラス間の動的な振る舞い * クラス階層の柔軟性を向上 注意点: * 仮想関数はランタイムでのオーバーヘッドが発生します。 * 仮想デストラクタを正しく定義することで、動的メモリ解放時の未定義動作を防ぐ。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual ~Base() {} // 仮想デストラクタ };</syntaxhighlight> <code>[[#virtual|virtual]]</code>は、C++のオブジェクト指向プログラミングの中核を担う指定子であり、正確な設計と適切な使用が求められます。他の指定子(<code>[[#override|override]]</code>、<code>[[#final|final]]</code>)と組み合わせることで、コードの安全性と可読性をさらに向上させます。 ==== override ==== C++の<code>[[#override|override]]</code>指定子は、'''C++11'''で導入されました。これは、仮想関数を派生クラスでオーバーライドする際に、意図を明確にし、間違いを防ぐために使用されます。 C++での<code>[[#override|override]]</code>の主な用途と進化: '''C++11''':基本的な機能 * 基底クラスの仮想関数を正しくオーバーライドしているかをコンパイル時にチェック。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() const override { // 正しいオーバーライド std::cout << "Derived class" << std::endl; } // void Show() const override; // エラー:関数名が異なる };</syntaxhighlight> '''C++17以降''':コンパイラのチェック機能がさらに洗練。 * <code>[[#override|override]]</code>の使用が推奨されるようになり、コードの安全性が向上。 <code>[[#override|override]]</code>の主な用途: # 基底クラスの仮想関数を正しくオーバーライドしていることを保証 # 関数名のタイポやシグネチャの不一致によるバグを防止 # コードの意図を明確化 現代のC++では、<code>[[#override|override]]</code>は以下の場面で重要です: * 仮想関数の正しい継承と動作確認 * 明示的な意図を示すことで、可読性と保守性を向上 注意点: * <code>[[#override|override]]</code>は、基底クラスの仮想関数に対してのみ使用可能。 * 基底クラスに仮想関数が存在しない場合、エラーが発生。 :<syntaxhighlight lang=c++ copy>class Base { void show() const {} // 仮想関数ではない }; class Derived : public Base { void show() const override {} // エラー:仮想関数でない };</syntaxhighlight> <code>[[#override|override]]</code>は、動的ポリモーフィズムを正確に実装するための必須要素であり、特に複雑なクラス階層での設計ミスを防ぐために重要です。<code>[[#final|final]]</code>と組み合わせることで、さらなる安全性と制御が可能です。 ==== final ==== C++の<code>[[#final|final]]</code>指定子は、'''C++11'''で導入されました。これは、クラスや仮想関数がさらに継承やオーバーライドされないことを明示するために使用されます。 C++での<code>[[#final|final]]</code>の主な用途と進化: '''C++11''':基本的な機能 * クラスや関数に対して継承やオーバーライドを禁止。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void show() const {} }; class Derived final : public Base { // これ以上継承不可 void show() const override final { // これ以上オーバーライド不可 std::cout << "Derived class" << std::endl; } }; // class SubDerived : public Derived {}; // エラー:Derivedがfinal</syntaxhighlight> '''C++17以降''':最適化の恩恵がさらに強調される。 * <code>[[#final|final]]</code>指定子は仮想関数テーブルの効率化にも寄与。 <code>[[#final|final]]</code>の主な用途: # クラスや関数の設計意図を明示 # 継承やオーバーライドを防ぐことでコードを安定化 # 意図しない派生や仮想関数の再定義を防止 現代のC++では、<code>[[#final|final]]</code>は以下の場面で重要です: * 特定のクラスや関数を完全に固定化したい場合 * セキュリティやパフォーマンスを重視した設計 注意点: * クラスに<code>[[#final|final]]</code>を付与すると、それを基底クラスとして使用できません。 * 仮想関数に<code>[[#final|final]]</code>を付けた場合、それを派生クラスでオーバーライドするとエラーが発生。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void display() const {} }; class Derived : public Base { public: void display() const final {} // これ以上オーバーライド不可 }; // class SubDerived : public Derived { // void display() const {} // エラー:displayがfinal // };</syntaxhighlight> <code>[[#final|final]]</code>は設計時の意図を明確にし、予期しない動作や拡張を防ぐための強力なツールです。他の指定子(<code>[[#override|override]]</code>など)と併用することで、コードの安全性と可読性を向上させます。 ==== noexcept ==== C++の<code>[[#noexcept|noexcept]]</code>指定子は、'''C++11'''で導入され、関数が例外を投げないことを示すために使用されます。この指定子を使用することで、関数が例外をスローしないという保証をコンパイラに伝え、最適化の機会を提供します。 C++での<code>[[#noexcept|noexcept]]</code>の主な用途と進化: '''C++11''':基本的な機能 * 関数が例外を投げないことを宣言し、コンパイラによる最適化を促進。 :<syntaxhighlight lang=c++ copy>void foo() noexcept { // 例外を投げない関数 // 例外をスローしない } void bar() { // noexcept指定なし // 例外をスローする可能性がある }</syntaxhighlight> '''C++17''':<code>[[#noexcept|noexcept]]</code>の推論強化 * コンパイラが関数が例外を投げるかどうかを自動的に推論できるように強化されました。 :<syntaxhighlight lang=c++ copy>void func() noexcept(noexcept(foo())) { // foo()がnoexceptかどうかに基づいて決定 // 処理 }</syntaxhighlight> '''C++20''':<code>[[#noexcept|noexcept]]</code>と条件付きで最適化される場合が強調される。 * より複雑な関数やラムダ式にも対応。 :<syntaxhighlight lang=c++ copy>auto lambda = []() noexcept { // 例外を投げないラムダ };</syntaxhighlight> <code>[[#noexcept|noexcept]]</code>の主な用途: # 関数が例外をスローしないことを保証 # コンパイラによる最適化の支援(特に関数ポインタやラムダの使用時) # コードの意図を明確化(例外を投げない関数と投げる関数を明示的に区別) 現代のC++では、<code>[[#noexcept|noexcept]]</code>は以下の場面で重要です: * 最適化の機会を提供(例外処理の回避) * API設計における意図の明示(例外を投げないことを保証) * パフォーマンスの向上(特に例外処理を伴うコードにおいて) 注意点: * <code>[[#noexcept|noexcept]]</code>指定を持つ関数が実際に例外を投げると、<code>std::terminate()</code>が呼ばれ、プログラムが終了します。 * 既存のコードに対して<code>[[#noexcept|noexcept]]</code>を付ける際には、関数の内部で実際に例外を投げないことを確認する必要があります。 :<syntaxhighlight lang=c++ copy>void example() noexcept { throw std::runtime_error("This will cause std::terminate()"); // エラー:noexcept関数内で例外を投げてはいけない }</syntaxhighlight> <code>[[#noexcept|noexcept]]</code>は、コードの安全性を確保し、例外を投げない関数を設計する際に非常に有用です。また、例外を投げない関数がパフォーマンス向上に寄与するため、最適化が可能となります。 === クラス・構造体に関連する指定子 === これらはクラスや構造体の定義に関連する指定子です。 * <code>[[#class|class]]</code>:クラスを定義する。 * <code>[[#struct|struct]]</code>:構造体を定義する。 * <code>[[#union|union]]</code>:共用体を定義する。 * <code>[[#enum|enum]]</code>:列挙型を定義する。 ==== class ==== C++の<code>[[#class|class]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、オブジェクト指向プログラミングの基盤となる構造体を定義するために使用されます。<code>[[#class|class]]</code>は、データと関数を1つの単位としてまとめ、カプセル化を提供します。 C++での<code>[[#class|class]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#class|class]]</code>はデータメンバとメンバ関数を持つ型を定義するために使用されます。デフォルトでは、<code>[[#class|class]]</code>のメンバは<code>[[#private|private]]</code>です。 :<syntaxhighlight lang=c++ copy>class Person { private: std::string name; // データメンバ(private) int age; // データメンバ(private) public: // コンストラクタ Person(std::string n, int a) : name(n), age(a) {} // メンバ関数 void setName(std::string n) { name = n; } std::string getName() const { return name; } void setAge(int a) { age = a; } int getAge() const { return age; } };</syntaxhighlight> '''C++11''':機能拡張 * コンストラクタの初期化リストの簡素化や、<code>[[#explicit|explicit]]</code>指定子、<code>[[#override|override]]</code>や<code>[[#final|final]]</code>などが導入されました。 :<syntaxhighlight lang=c++ copy>class Employee { public: std::string name; explicit Employee(std::string n) : name(std::move(n)) {} void printName() const { std::cout << name << std::endl; } };</syntaxhighlight> '''C++17''':<code>[[#class|class]]</code>のデータメンバの型推論(<code>[[#auto|auto]]</code>)が追加される。 * <code>[[#auto|auto]]</code>を使った型推論が可能になり、コンパイル時に型が決定されます。 :<syntaxhighlight lang=c++ copy>class Container { auto value = 42; // 型は自動的にintと推測される public: auto getValue() const { return value; } };</syntaxhighlight> '''C++20''':コンセプト(<code>[[#concepts|concepts]]</code>)とともに、型の制約をクラスのメンバ関数に適用する方法が強化されました。 :<syntaxhighlight lang=c++ copy>template <typename T> class Box { public: T value; Box(T val) : value(val) {} auto getValue() const { return value; } };</syntaxhighlight> <code>[[#class|class]]</code>の主な用途: # データのカプセル化と保護(<code>[[#private|private]]</code>メンバ) # 関数やメンバの動作を隠蔽(<code>[[#private|private]]</code>メンバ関数) # オブジェクト指向プログラミングの基本概念(継承、ポリモーフィズム、カプセル化) # 型安全を提供(メンバ関数とデータの結びつき) 現代のC++では、<code>[[#class|class]]</code>は以下の場面で重要です: * 複雑なデータ構造の定義と操作のカプセル化 * 継承とポリモーフィズムによるコードの再利用 * データの安全なアクセス管理(アクセス制御、メンバ関数の使用) * コンストラクタ、デストラクタによるオブジェクトの初期化・クリーンアップ 注意点: * <code>[[#class|class]]</code>と<code>[[#struct|struct]]</code>は非常に似ていますが、<code>[[#class|class]]</code>のデフォルトアクセス修飾子は<code>[[#private|private]]</code>であり、<code>[[#struct|struct]]</code>のデフォルトは<code>[[#public|public]]</code>です。 * <code>[[#class|class]]</code>は通常、データとメソッドを隠蔽するために使われ、<code>[[#struct|struct]]</code>はデータ構造として用いられることが多いです。 :<syntaxhighlight lang=c++ copy>class MyClass { private: int x; // デフォルトでprivate public: void setX(int val) { x = val; } }; struct MyStruct { int x; // デフォルトでpublic };</syntaxhighlight> <code>[[#class|class]]</code>はC++のオブジェクト指向設計の中心的な要素であり、強力な機能と柔軟性を提供します。データの隠蔽、継承、ポリモーフィズムを活用し、複雑なシステムを管理しやすくします。 ==== struct ==== C++の<code>[[#struct|struct]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、主にデータ構造を定義するために使用されます。<code>[[#struct|struct]]</code>は、C言語から継承されたもので、C++の<code>[[#class|class]]</code>と非常に似ていますが、デフォルトのアクセス修飾子が異なります。 C++での<code>[[#struct|struct]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#struct|struct]]</code>はデータメンバを持つ型を定義するために使用されます。デフォルトでは、<code>[[#struct|struct]]</code>のメンバは<code>[[#public|public]]</code>です。 :<syntaxhighlight lang=c++ copy>struct Person { std::string name; // データメンバ(public) int age; // データメンバ(public) // コンストラクタ Person(std::string n, int a) : name(n), age(a) {} // メンバ関数 void setName(std::string n) { name = n; } std::string getName() const { return name; } void setAge(int a) { age = a; } int getAge() const { return age; } };</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#struct|struct]]</code>でもメンバ関数を定義したり、コンストラクタ、デストラクタを使ったりすることができるようになり、<code>[[#class|class]]</code>とほぼ同等の機能が使えるようになりました。 * <code>[[#explicit|explicit]]</code>指定子や<code>[[#override|override]]</code>、<code>[[#final|final]]</code>などの機能も<code>[[#struct|struct]]</code>に適用できるようになりました。 :<syntaxhighlight lang=c++ copy>struct Employee { std::string name; explicit Employee(std::string n) : name(std::move(n)) {} void printName() const { std::cout << name << std::endl; } };</syntaxhighlight> '''C++17''':<code>[[#struct|struct]]</code>で<code>[[#auto|auto]]</code>を使った型推論がサポートされるようになりました。 * <code>[[#auto|auto]]</code>を使うことで、<code>[[#struct|struct]]</code>のデータメンバの型推論が可能になります。 :<syntaxhighlight lang=c++ copy>struct Container { auto value = 42; // 型は自動的にintと推測される public: auto getValue() const { return value; } };</syntaxhighlight> '''C++20''':構造体でも<code>[[#concepts|concepts]]</code>(型制約)を使うことができるようになり、<code>[[#struct|struct]]</code>内でもテンプレート型に制約を付けることができました。 :<syntaxhighlight lang=c++ copy>template <typename T> struct Box { T value; explicit Box(T val) : value(val) {} auto getValue() const { return value; } };</syntaxhighlight> <code>[[#struct|struct]]</code>の主な用途: # 単純なデータ構造の定義(例えば、複数の関連データを1つにまとめる) # オブジェクト指向のカプセル化(<code>[[#struct|struct]]</code>でもメンバ関数、コンストラクタなどを使用可能) # ユーザー定義の型を作成 # 他のクラスとの簡単なインターフェース(<code>[[#struct|struct]]</code>は<code>[[#class|class]]</code>とほぼ同等の機能を持つ) 現代のC++では、<code>[[#struct|struct]]</code>は以下の場面で重要です: * シンプルなデータ構造を作成 * APIやライブラリでのデータパッケージング * 高度なオブジェクト指向設計にも使用可能(ただし、<code>[[#struct|struct]]</code>のデフォルトメンバは<code>[[#public|public]]</code>であるため、カプセル化が必要な場合は<code>[[#class|class]]</code>が選ばれることが多い) 注意点: * <code>[[#struct|struct]]</code>と<code>[[#class|class]]</code>の違いは、デフォルトのアクセス修飾子の違いだけです。<code>[[#struct|struct]]</code>のメンバはデフォルトで<code>[[#public|public]]</code>、<code>[[#class|class]]</code>のメンバはデフォルトで<code>[[#private|private]]</code>です。 * <code>[[#struct|struct]]</code>は、通常はシンプルなデータ構造を定義するために使用されますが、<code>[[#class|class]]</code>と同様にメンバ関数やコンストラクタ、デストラクタを持つことができます。 :<syntaxhighlight lang=c++ copy>struct Point { int x; // デフォルトでpublic int y; // デフォルトでpublic // コンストラクタ Point(int a, int b) : x(a), y(b) {} // メンバ関数 void move(int dx, int dy) { x += dx; y += dy; } };</syntaxhighlight> <code>[[#struct|struct]]</code>は、C++においてシンプルなデータ構造の定義を行うために非常に便利ですが、<code>[[#class|class]]</code>と異なり、デフォルトでアクセス修飾子が<code>[[#public|public]]</code>であるため、カプセル化を意識した設計が求められます。 ==== union ==== C++の<code>[[#union|union]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、異なる型のデータを同じメモリ領域に格納するために使用されます。<code>[[#union|union]]</code>は、1つのメモリブロックを複数の異なる型で使い回すことで、メモリの使用効率を高めます。各メンバは同じメモリ領域を共有し、そのサイズは最大のメンバ型に合わせられます。 C++での<code>[[#union|union]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#union|union]]</code>を使用することで、異なるデータ型を同じメモリ空間で扱います。複数の型のデータを必要に応じて格納できますが、同時に格納できるのは1つだけです。 :<syntaxhighlight lang=c++ copy>union Data { int i; float f; char c; }; Data d; d.i = 10; // 整数を格納 d.f = 3.14f; // 浮動小数点数を格納(以前のデータは上書きされる) d.c = 'A'; // 文字を格納(以前のデータは再び上書きされる)</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#union|union]]</code>内でもコンストラクタ、デストラクタ、メンバ関数を定義できるようになりました。 * C++11では、<code>[[#union|union]]</code>内での<code>[[#constexpr|constexpr]]</code>の使用が可能になり、コンパイル時の定数を扱うことができるようになりました。 :<syntaxhighlight lang=c++ copy>union Example { int i; float f; constexpr Example(int x) : i(x) {} // C++11以降、コンストラクタが使える };</syntaxhighlight> '''C++14''':さらに機能強化 * C++14では、<code>[[#union|union]]</code>内に非静的なメンバ関数を定義できるようになり、メンバの使い方が柔軟になりました。 * また、<code>[[#union|union]]</code>のメンバに<code>[[#delete|delete]]</code>や<code>[[#default|default]]</code>を使うことも可能になりました。 :<syntaxhighlight lang=c++ copy>union MyUnion { int i; double d; MyUnion() = delete; // unionのデフォルトコンストラクタを削除 };</syntaxhighlight> '''C++17''':新しい機能 * <code>std::variant</code>が導入され、<code>[[#union|union]]</code>の代替として型安全な方法で異なる型のデータを扱えるようになりました。<code>std::variant</code>は型情報を保持し、<code>[[#union|union]]</code>のようにメモリを上書きせずに異なる型を安全に取り扱うことができます。 :<syntaxhighlight lang=c++ copy>#include <variant> std::variant<int, float, char> var; var = 3; // int var = 3.14f; // float var = 'A'; // char</syntaxhighlight> <code>[[#union|union]]</code>の主な用途: # メモリ効率の向上(異なる型を同じメモリ領域に格納) # 型が異なるデータを1つのデータ構造内で取り扱う # データの互換性がある場合に複数の型を使い分ける # 特定のデータ型が必要な場合に使う(例:ビットフィールドやネットワーク通信のデータ処理) 現代のC++では、<code>[[#union|union]]</code>は以下の場面で重要な役割を果たします: * メモリ効率が重要な場面(特にリソース制約が厳しい環境) * 複数の異なる型のデータを共有メモリ空間で管理する必要がある場合 * 型が明確で、同時に格納しないことが保証されている場合 '''注意点''': * <code>[[#union|union]]</code>の各メンバは同じメモリ空間を共有しており、1度に1つのメンバだけが有効です。他のメンバに格納されたデータは上書きされます。 * <code>[[#union|union]]</code>を使う場合、どのメンバが現在有効であるかを把握するために、追加の管理コードが必要になる場合があります。 * <code>[[#union|union]]</code>内でポインタ型を使う際は、データ型の整合性を確保することが重要です。ポインタが指すメモリ領域の内容が異なる可能性があるためです。 :<syntaxhighlight lang=c++ copy>union IntFloat { int i; float f; }; IntFloat u; u.i = 42; std::cout << u.i << std::endl; // 出力: 42 u.f = 3.14f; std::cout << u.i << std::endl; // 出力: データが上書きされているので予測不可能</syntaxhighlight> 現代のC++では、<code>[[#union|union]]</code>よりも<code>std::variant</code>や<code>std::optional</code>などの型安全な代替手段が好まれることが多いですが、メモリ効率が重要な低レベルプログラミングや、特定のデータ構造の設計では引き続き利用されることがあります。 ==== enum ==== C++の<code>[[#enum|enum]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、名前付きの整数型定数をグループ化するための機能です。<code>[[#enum|enum]]</code>を使用することで、コードの可読性やメンテナンス性が向上します。また、<code>[[#enum|enum]]</code>には定数のセットを定義するだけでなく、その定義に基づいて変数を宣言することができます。 C++での<code>[[#enum|enum]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#enum|enum]]</code>を使って、整数値に名前を付けてグループ化することができます。デフォルトでは、最初の定数には0が割り当てられ、以降は1ずつ増加します。 :<syntaxhighlight lang=c++ copy>enum Color { Red, // 0 Green, // 1 Blue // 2 }; Color c = Red; // Color型の変数cにRedを代入</syntaxhighlight> '''C++11''':機能拡張 * <code>[[#enum class|enum class]]</code>の導入により、<code>[[#enum|enum]]</code>は名前空間で囲まれ、型の安全性が強化されました。これにより、<code>[[#enum|enum]]</code>の値が異なる<code>[[#enum|enum]]</code>型間で誤って使用されることを防げるようになりました。 :<syntaxhighlight lang=c++ copy>enum class Color { Red, // 値は自動的に整数型で、Redは0 Green, // Greenは1 Blue // Blueは2 }; Color c = Color::Red; // 名前空間を使って指定</syntaxhighlight> '''C++14''':改善された機能 * <code>[[#enum class|enum class]]</code>で型を指定することができ、さらに可読性を向上させるために、基になる型を指定することができます。 :<syntaxhighlight lang=c++ copy>enum class Color : unsigned int { Red, Green, Blue };</syntaxhighlight> '''C++17''':新しい機能 * <code>[[#enum class|enum class]]</code>に関する変更は特になく、引き続き強力な型安全機能がサポートされています。 <code>[[#enum|enum]]</code>の主な用途: # 定数のグループ化 # 可読性の向上(数字の代わりに意味のある名前を使用) # 名前空間やスコープの管理(<code>[[#enum class|enum class]]</code>を使用することで、グローバルな名前の衝突を防止) # 型安全な列挙型を作成する(<code>[[#enum class|enum class]]</code>) 現代のC++では、<code>[[#enum|enum]]</code>は以下の場面で重要な役割を果たします: * 定数の集合を定義することで、コードの可読性や保守性を向上させる * 状態やオプションのフラグを管理する * 列挙型の値が予測可能であることを保証するため、<code>[[#enum class|enum class]]</code>による型安全を活用する * 数値を直接扱わず、意味のある名前を使うことで意図を明確に伝える :<syntaxhighlight lang=c++ copy>enum class Status { OK = 0, Warning = 1, Error = 2 }; Status status = Status::OK; if (status == Status::Error) { // エラーハンドリング }</syntaxhighlight> '''注意点''': * <code>[[#enum|enum]]</code>の値はデフォルトで整数型として扱われ、必要に応じて明示的に型を指定できます。 * <code>[[#enum|enum]]</code>は型安全ではなく、他の<code>[[#enum|enum]]</code>型の値を誤って使用することが可能ですが、C++11以降は<code>[[#enum class|enum class]]</code>を使用することで型安全が提供されます。 * <code>[[#enum class|enum class]]</code>は、名前空間を提供することで異なる<code>[[#enum|enum]]</code>の衝突を避けることができます。 :<syntaxhighlight lang=c++ copy>enum class Color { Red, Green, Blue }; enum class Direction { North, South, East, West }; Color color = Color::Red; Direction dir = Direction::North;</syntaxhighlight> <code>[[#enum|enum]]</code>は、特に状態を管理するためや、特定のオプションを明確にするために、非常に便利な構文です。C++11以降では、型安全性が高まり、コードの誤使用を防ぐための機能が強化されました。 === 名前空間関連指定子 === 名前空間を制御するための指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間を定義する。 * <code>[[#using|using]]</code>:名前空間を使用するためにエイリアスを作成。 ==== namespace ==== ==== using ==== === テンプレート関連指定子 === テンプレートに関連する指定子です。 * <code>[[#template|template]]</code>:テンプレートを定義する。 * <code>[[#typename|typename]]</code>:テンプレートの型引数を指定するために使用。 * <code>[[#class|class]]</code>:テンプレートの型引数として使用される場合、<code>[[#typename|typename]]</code> の代わりに使用できる(テンプレートパラメータの型を指定)。 * <code>[[#concept|concept]]</code>:テンプレートの引数に対して制約を設ける。 ==== template ==== C++の<code>[[#template|template]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、型や値に依存しないコードの再利用を可能にする機能です。<code>[[#template|template]]</code>を使うことで、同じコードを異なるデータ型に対して適用することができ、汎用的なアルゴリズムやデータ構造を作成することができます。これにより、コードの可読性と保守性が向上します。 C++での<code>[[#template|template]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#template|template]]</code>は、関数やクラスに対して、型を指定せずに再利用可能なコードを記述するための機能です。 :<syntaxhighlight lang=c++ copy>// 関数テンプレートの例 template <typename T> T add(T a, T b) { return a + b; } int main() { int x = add(1, 2); // int型 double y = add(1.1, 2.2); // double型 }</syntaxhighlight> * <code>[[#template|template]]</code>を使用することで、異なる型に対して同じ関数を再利用できます。 '''C++11''':機能拡張 * <code>[[#auto|auto]]</code>キーワードとラムダ式により、テンプレートの使い方が簡略化され、可読性が向上しました。 * <code>[[#constexpr|constexpr]]</code>の導入により、コンパイル時定数をテンプレートで使用することが可能になりました。 :<syntaxhighlight lang=c++ copy>template <typename T> constexpr T square(T x) { return x * x; }</syntaxhighlight> * テンプレートの引数にデフォルト値を指定することも可能になりました。 :<syntaxhighlight lang=c++ copy>template <typename T = int> T multiply(T a, T b) { return a * b; }</syntaxhighlight> '''C++14''':機能拡張 * 変数テンプレートの導入により、テンプレート引数として変数も扱えるようになりました。 :<syntaxhighlight lang=c++ copy>template <typename T> T max_value = T(10); // デフォルトでT型の最大値を設定</syntaxhighlight> '''C++17''':新しい機能 * <code>[[#if constexpr|if constexpr]]</code>の導入により、コンパイル時の条件によってテンプレートの選択ができるようになりました。 :<syntaxhighlight lang=c++ copy>template <typename T> void print(T value) { if constexpr (std::is_integral<T>::value) { std::cout << "整数型の値: " << value << std::endl; } else { std::cout << "その他の型の値: " << value << std::endl; } }</syntaxhighlight> '''C++20''':機能拡張 * コンセプト(Concepts)の導入により、テンプレートの引数に制約を付けることができ、テンプレートの使い方に制限を加えることができました。 :<syntaxhighlight lang=c++ copy>template <typename T> concept Incrementable = requires(T a) { { ++a } -> std::same_as<T&>; }; template <Incrementable T> T increment(T value) { return ++value; }</syntaxhighlight> <code>[[#template|template]]</code>の主な用途: # 型に依存しないコードの再利用 # 汎用的なアルゴリズムやデータ構造の作成 # コンパイル時に型の確認を行い、エラーを早期に発見 # 型に対する制約(C++20のコンセプト)や条件による分岐 現代のC++では、<code>[[#template|template]]</code>は以下の場面で重要な役割を果たします: * 汎用的な関数やクラスを作成するために使用 * 同じ処理を異なる型に適用する際に再利用 * 型制約やコンセプトを活用して、安全で明確なコードを実現 * コンパイル時定数や条件付きテンプレートを活用して、最適化やエラーチェックを行う :<syntaxhighlight lang=c++ copy>template <typename T> T max(T a, T b) { return (a > b) ? a : b; } int main() { std::cout << max(3, 5) << std::endl; // int型 std::cout << max(3.14, 2.71) << std::endl; // double型 }</syntaxhighlight> '''注意点''': * テンプレートは型に依存しないため、同じコードを異なる型に対して適用できますが、テンプレートのインスタンス化はコンパイル時に行われるため、非常に大きなコードを生成する可能性があることに注意が必要です。 * C++20で導入されたコンセプトや、条件付きテンプレートを使うことで、より柔軟で型安全なコードを記述することができます。 テンプレートは、汎用的なアルゴリズムやデータ構造を作成する際に非常に便利な機能であり、C++の強力なツールの一つです。 ==== typename ==== C++の<code>[[#typename|typename]]</code>は、'''C++の最初の規格'''(C++98)から存在しており、テンプレートの定義や特殊化で型を明示するために使用されるキーワードです。<code>[[#typename|typename]]</code>は、テンプレートの型パラメータを指定したり、型依存式を解決するために重要な役割を果たします。また、<code>[[#typename|typename]]</code>は型の名前をコンパイラに示すため、より明確で安全なコードを提供します。 C++での<code>[[#typename|typename]]</code>の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#typename|typename]]</code>は、テンプレートパラメータとして型を指定するために使用されます。テンプレートの引数に型を指定することで、汎用的な関数やクラスを作成することができます。 :<syntaxhighlight lang=c++ copy>// テンプレート引数としてtypenameを使う template <typename T> T add(T a, T b) { return a + b; } int main() { int x = add(1, 2); // int型 double y = add(1.1, 2.2); // double型 }</syntaxhighlight> * また、型を指定することで、コンパイル時に型の不一致を防ぐことができます。 '''C++11''':機能拡張 * 型依存式の解決に<code>[[#typename|typename]]</code>が必要となる場面が増えました。たとえば、テンプレートのメンバ型にアクセスする場合に、<code>[[#typename|typename]]</code>を使う必要があります。 :<syntaxhighlight lang=c++ copy>template <typename T> void print_first(T t) { typename T::value_type first = t.front(); // Tがコンテナ型のとき std::cout << first << std::endl; }</syntaxhighlight> * <code>[[#typename|typename]]</code>は、コンテナクラスやテンプレートのメンバ型を明示的に指示するためにも使われます。 '''C++14'''以降:型の依存式の解決と可読性の向上 * 型依存式における明示的な指定の際、<code>[[#typename|typename]]</code>の使い方がさらに重要となり、より多くの場面で型を明確にするために利用されます。 '''C++17''':機能拡張 * <code>[[#if constexpr|if constexpr]]</code>の導入により、<code>[[#typename|typename]]</code>が不要な場合もありますが、依然として型依存式の解決において重要です。 :<syntaxhighlight lang=c++ copy>template <typename T> void print(T value) { if constexpr (std::is_integral<T>::value) { std::cout << "整数型の値: " << value << std::endl; } else { std::cout << "その他の型の値: " << value << std::endl; } }</syntaxhighlight> <code>[[#typename|typename]]</code>の主な用途: # テンプレート引数として型を指定 # 型依存式の解決(例えば、メンバ型や型の名前にアクセスする際) # テンプレートメタプログラミングにおける型の明示的指定 # 型を指定することでコンパイル時エラーを防ぐ 現代のC++では、<code>[[#typename|typename]]</code>は以下の場面で重要な役割を果たします: * テンプレート引数を使用して汎用的なコードを作成 * 型依存式の解決 * より複雑なテンプレートメタプログラミングを実現 * コンパイラに型名を明示することで、型の不一致やエラーを防ぐ :<syntaxhighlight lang=c++ copy>template <typename T> void display_first_element(const T& container) { typename T::value_type first = container.front(); std::cout << first << std::endl; }</syntaxhighlight> '''注意点''': * <code>[[#typename|typename]]</code>は、型依存式を解決する際に必要であり、型名を明示することでコンパイラが型を正しく認識できるようにします。 * 型の依存関係やメンバ型へのアクセス時に使用されるため、テンプレートプログラミングや型を扱うコードでは欠かせないキーワードです。 <code>[[#typename|typename]]</code>は、C++における型安全性とコードの柔軟性を高めるために重要な役割を果たします。 ==== class ==== C++におけるテンプレートの型引数としての'''<code>[[#class|class]]</code>'''は、'''C++98'''から存在し、テンプレートを定義する際に型引数を指定するためのキーワードの1つです。<code>[[#class|class]]</code>は、テンプレート引数に型(クラス、構造体、あるいは任意の型)を指定するために使用され、<code>[[#typename|typename]]</code>とほぼ同じ意味を持ちます。ただし、<code>[[#class|class]]</code>は型を示すために使用され、<code>[[#typename|typename]]</code>は型名を明示的に指定する場面で使われます。 C++でのテンプレートの型引数としての'''<code>[[#class|class]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#class|class]]</code>をテンプレートの型引数として使用することで、テンプレートを型に対して汎用的に適用できます。これは、特定の型に依存せず、任意の型に対して動作する関数やクラスを作成するために利用されます。 :<syntaxhighlight lang=c++ copy>// classをテンプレート型引数として使用 template <class T> T add(T a, T b) { return a + b; } int main() { int x = add(1, 2); // int型 double y = add(1.1, 2.2); // double型 }</syntaxhighlight> * このように、<code>[[#class|class]]</code>は型を引数として受け取り、関数やクラスの定義を汎用化します。 '''C++11''':機能拡張 * C++11では、<code>[[#class|class]]</code>は引き続き型を指定するために使われるものの、<code>[[#typename|typename]]</code>との違いが明確になります。実際には、<code>[[#class|class]]</code>と<code>[[#typename|typename]]</code>は互換的に使用できるため、両者の使用には特に大きな違いはありません。しかし、<code>[[#class|class]]</code>は一般的に「クラス」という意味合いが強いため、直感的に「型」として理解されます。 :<syntaxhighlight lang=c++ copy>template <class T> void print(const T& obj) { std::cout << obj << std::endl; }</syntaxhighlight> * <code>[[#typename|typename]]</code>と違い、<code>[[#class|class]]</code>というキーワードは、主にクラス型を引数にする場合に使われることが多いですが、実際には任意の型に対しても利用可能です。 '''C++17'''以降:さらなる進化 * <code>[[#class|class]]</code>は依然として型引数として使用されますが、<code>[[#typename|typename]]</code>と同じ意味で使用される場面が増えています。特にテンプレート引数で型を指定する際、<code>[[#class|class]]</code>を使うことは非常に一般的であり、<code>[[#typename|typename]]</code>と差異はほとんどありません。 :<syntaxhighlight lang=c++ copy>template <class T> void display_type(const T& obj) { std::cout << typeid(obj).name() << std::endl; }</syntaxhighlight> '''C++20''':新しい機能に対応 * C++20でも、<code>[[#class|class]]</code>は引き続きテンプレートの型引数として使用されますが、テンプレートの制約や概念(<code>[[#concepts|concepts]]</code>)の導入により、テンプレート型引数に関する新しいアプローチが登場しました。例えば、特定の型に対して制約を追加することができます。 :<syntaxhighlight lang=c++ copy>template <class T> concept Incrementable = requires(T x) { ++x; }; template <Incrementable T> T increment(T value) { return ++value; }</syntaxhighlight> <code>[[#class|class]]</code>の主な用途: # 型引数として使用し、テンプレートを汎用的に定義 # 任意の型を引数に取り、異なる型で動作する関数やクラスを実装 # <code>[[#typename|typename]]</code>と同様に、型依存式やメンバ型の解決に使用 現代のC++では、<code>[[#class|class]]</code>は以下の場面で重要な役割を果たします: * テンプレート引数に型を指定し、汎用的な関数やクラスを作成 * 型に依存しないコードを提供するため、任意の型で動作する関数やクラスを作成 * <code>[[#typename|typename]]</code>と同様に、型依存式の解決や、より安全で明確な型指定を行う :<syntaxhighlight lang=c++ copy>template <class T> T multiply(T a, T b) { return a * b; }</syntaxhighlight> '''注意点''': * <code>[[#class|class]]</code>は<code>[[#typename|typename]]</code>とほぼ同じ役割を果たしますが、C++98の初期では<code>[[#class|class]]</code>がより多く使われました。現在では、両者はほぼ同義で使われますが、<code>[[#typename|typename]]</code>の方が一般的になっています。 * <code>[[#class|class]]</code>は、特にクラス型のテンプレート引数を受け取る場合に使用されることが多いですが、任意の型に対しても使用可能です。 <code>[[#class|class]]</code>は、C++において汎用的なコードを作成するために重要な役割を果たしており、テンプレートの引数として使用することで、柔軟で再利用可能なコードを提供することができます。 ==== concept ==== C++20で導入された'''<code>[[concept|concept]]</code>'''は、テンプレートの引数に対して制約を設けるための新しい機能です。<code>[[concept|concept]]</code>を使用することで、テンプレート引数が特定の条件を満たしていることを保証でき、より安全で明確なコードを書くことができます。これにより、テンプレートの適用範囲を絞り込み、コンパイル時に型チェックを強化することができます。 C++での'''<code>[[concept|concept]]</code>'''の主な用途と進化: '''C++20''':新機能としての<code>[[concept|concept]]</code>の導入 * <code>[[concept|concept]]</code>は、テンプレート引数に対する制約を定義するために使用されます。これにより、テンプレートを適用する型が特定の条件を満たすかどうかを確認することができます。例えば、特定の型が加算可能であることを保証する<code>[[concept|concept]]</code>を定義することができます。 :<syntaxhighlight lang=c++ copy>// Conceptの定義 template <typename T> concept Addable = requires(T a, T b) { a + b; // Tが加算可能であることを要求 }; // Conceptを使ったテンプレート template <Addable T> T add(T a, T b) { return a + b; } int main() { int result = add(1, 2); // 正常 // add("hello", "world"); // コンパイルエラー: Addable制約に違反 }</syntaxhighlight> * <code>[[concept|concept]]</code>は、型が特定の操作をサポートしていることをコンパイル時にチェックするために使用されます。これにより、テンプレートの使用がより直感的になり、型の制約を明示的に表現できるようになりました。 '''C++20''':<code>[[concept|concept]]</code>を使った制約の具体例 * 例えば、<code>Addable</code>という<code>[[concept|concept]]</code>を使って、加算が可能な型のみを受け入れるテンプレート関数を定義することができます。 :<syntaxhighlight lang=c++ copy>template <typename T> concept Addable = requires(T a, T b) { a + b; }; template <Addable T> T add(T a, T b) { return a + b; } int main() { int sum = add(3, 4); // OK, 加算可能な型 // double result = add("a", "b"); // コンパイルエラー: Addableに一致しない型 }</syntaxhighlight> * <code>[[concept|concept]]</code>は、テンプレート関数やクラスに適用される引数に対する制約を定義することで、より明確で安全なコードを提供します。 '''C++20以降''':<code>[[concept|concept]]</code>の進化と活用 * C++20以降では、<code>[[concept|concept]]</code>を利用することで、テンプレート引数の制約をより簡単に記述できるようになり、特定の型が満たすべき条件を直感的に表現できます。例えば、<code>std::integral</code>や<code>std::floating_point</code>など、標準ライブラリには様々な組み込みの<code>[[concept|concept]]</code>が追加されています。これにより、コードの安全性と可読性が向上し、バグを未然に防ぐことができます。 :<syntaxhighlight lang=c++ copy>#include <concepts> template <std::integral T> T add(T a, T b) { return a + b; } int main() { int result = add(5, 10); // OK, integral型 // add(3.5, 2.5); // コンパイルエラー: integralに適合しない型 }</syntaxhighlight> <code>[[concept|concept]]</code>の主な用途: # 型に対する制約を定義し、テンプレートの適用範囲を絞り込む # コンパイル時に型が特定の条件を満たすかを検査し、エラーを早期に検出 # テンプレート引数に対して明確な要求を示し、意図が明確なコードを実現 # より安全で可読性の高いコードを提供 現代のC++では、<code>[[concept|concept]]</code>は以下の場面で重要な役割を果たします: * テンプレート関数やクラスにおける型の制約を明示化 * 型が満たすべき条件を正確に定義することで、テンプレートの使用をより直感的に * より強力なコンパイル時チェックにより、バグの予防とエラーの早期発見 '''注意点''': * <code>[[concept|concept]]</code>はC++20から導入された新しい機能であり、それ以前のバージョンのC++では使用できません。コンパイラによっては、C++20以降の仕様をサポートしていないものもあるため、使用する際はコンパイラのバージョンに注意が必要です。 * <code>[[concept|concept]]</code>を使うことで、型の制約をより直感的に表現できるため、テンプレートの使用が簡潔になります。 :<syntaxhighlight lang=c++ copy>template <typename T> concept Comparable = requires(T a, T b) { { a == b } -> std::same_as<bool>; }; template <Comparable T> bool is_equal(const T& a, const T& b) { return a == b; }</syntaxhighlight> <code>[[concept|concept]]</code>はC++における強力な型チェックツールであり、特にテンプレートを利用した汎用的なプログラムにおいて、コードの安全性と可読性を向上させるために重要な役割を果たします。 === その他の指定子 === その他の特殊な指定子です。 * <code>[[#alignas|alignas]]</code>:メモリのアライメントを指定。 * <code>[[#alignof|alignof]]</code>:型や変数のアライメントを取得。 * <code>[[#auto|auto]]</code>:型推論。 * <code>[[#decltype|decltype]]</code>:式の型を取得。 * <code>[[#dynamic_cast|dynamic_cast]]</code>:動的型キャスト。 * <code>[[#static_cast|static_cast]]</code>:静的型キャスト。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>:低レベルな型キャスト。 * <code>[[#const_cast|const_cast]]</code>:<code>[[#const|const]]</code> 修飾子を取り除くキャスト。 * <code>[[#sizeof|sizeof]]</code>:型または変数のサイズを取得。 * <code>[[#typeid|typeid]]</code>:型情報を取得。 ==== alignas ==== '''<code>[[#alignas|alignas]]</code>'''は、C++11で導入されたキーワードで、変数や型に対して特定のアライメント(配置境界)を指定するために使用されます。アライメントは、メモリ内でデータがどのように配置されるかを制御するもので、特定のアライメントに合わせて変数を配置することで、パフォーマンスの向上やハードウェアの要件に適合させることができます。 C++での'''<code>[[#alignas|alignas]]</code>'''の主な用途と進化: '''C++11''':<code>[[#alignas|alignas]]</code>の導入 * <code>[[#alignas|alignas]]</code>は、型や変数に対して特定のアライメントを要求するために使用されます。これにより、データが特定の境界に配置されるように強制できます。例えば、SSE命令を利用するために、特定のアライメントにデータを配置することが求められる場合などです。 :<syntaxhighlight lang=c++ copy>// 16バイト境界に配置する alignas(16) int arr[4]; auto main() -> int { std::cout << "Alignment of arr: " << alignof(arr) << std::endl; }</syntaxhighlight> * <code>[[#alignas|alignas]]</code>を使用すると、データ型のアライメントを変更でき、特に低レベルなパフォーマンス最適化に役立ちます。データが正しいアライメントを持つことは、メモリアクセスの効率を向上させることがあり、ハードウェアによってはアライメント違反がパフォーマンス低下を引き起こす場合もあります。 '''C++11''':<code>[[#alignas|alignas]]</code>を使ったクラスや構造体のアライメント指定 * 構造体やクラスのメンバに対しても、<code>[[#alignas|alignas]]</code>を使ってアライメントを指定できます。これにより、特定の境界に合わせてデータを配置することができます。 :<syntaxhighlight lang=c++ copy>struct alignas(32) MyStruct { int a; double b; };</syntaxhighlight> * 上記の例では、<code>MyStruct</code>構造体全体が32バイトのアライメント境界で配置されることを要求します。 '''C++11以降''':<code>[[#alignof|alignof]]</code>との併用 * <code>[[#alignas|alignas]]</code>とともに、<code>[[#alignof|alignof]]</code>を使うことで、型のアライメントを取得することができます。これにより、どのようなアライメントが適用されているのかを確認することができます。 :<syntaxhighlight lang=c++ copy>std::cout << "Alignment of int: " << alignof(int) << std::endl;</syntaxhighlight> '''C++14以降''':さらに使いやすく * C++14以降でも<code>[[#alignas|alignas]]</code>は引き続き使用されており、特にハードウェアの制約やパフォーマンス最適化を行う際に重要です。 '''<code>[[#alignas|alignas]]</code>の主な用途''': # メモリ配置の最適化:パフォーマンス向上やハードウェア要件に応じた最適な配置 # 特定のアライメントを必要とするデータ型の設定(例えば、SSE命令を使用する際など) # 構造体やクラスのメンバに対するアライメント設定 # メモリのアライメント違反を防ぎ、パフォーマンスを向上させる '''現代のC++では、<code>[[#alignas|alignas]]</code>は以下のような場面で重要な役割を果たします''': * ハードウェアや特定の命令セットに対して最適化されたデータ配置 * パフォーマンス向上のためのデータのアライメント設定 * メモリの正しい配置を確保することで、データの整合性を保つ * 特に低レベルなプログラミングやシステムプログラミングで活用される '''注意点''': * <code>[[#alignas|alignas]]</code>はC++11から導入されたため、それ以前のバージョンのC++では使用できません。使用するにはC++11以降に対応したコンパイラが必要です。 * アライメントの指定は、プラットフォームやコンパイラの制約に依存するため、最適化がプラットフォーム間で異なる場合があります。 :<syntaxhighlight lang=c++ copy>alignas(64) int data[100];</syntaxhighlight> このコードは、<code>[[#data|data]]</code>配列が64バイト境界で配置されるように要求します。このように、<code>[[#alignas|alignas]]</code>はメモリのアライメントを直接指定する手段を提供し、特定のハードウェアアーキテクチャに最適化されたコードを記述するために重要です。 ==== alignof ==== '''<code>[[#alignof|alignof]]</code>'''は、C++11で導入された演算子で、指定された型やオブジェクトのアライメントをバイト単位で取得するために使用されます。アライメントとは、メモリ上で変数がどのように配置されるかを示すもので、特にパフォーマンスやハードウェア要件に影響を与える要素です。<code>[[#alignof|alignof]]</code>を使うことで、特定の型がどのアライメント境界に配置されるかを調べることができます。 C++での'''<code>[[#alignof|alignof]]</code>'''の主な用途と進化: '''C++11''':<code>[[#alignof|alignof]]</code>の導入 * <code>[[#alignof|alignof]]</code>演算子は、型やオブジェクトがどのアライメント境界に配置されるべきかを返します。具体的には、指定した型またはオブジェクトが必要とするアライメントの最小バイト数を返します。 :<syntaxhighlight lang=c++ copy>std::cout << "Alignment of int: " << alignof(int) << std::endl;</syntaxhighlight> * このコードは、<code>[[#int|int]]</code>型のアライメントを取得して表示します。通常、<code>[[#int|int]]</code>のアライメントは4バイトですが、プラットフォームによって異なることがあります。 '''C++11''':<code>[[#alignof|alignof]]</code>を使った構造体やクラスのアライメント確認 * <code>[[#alignof|alignof]]</code>は、クラスや構造体のアライメントも確認できます。例えば、構造体のメンバや、構造体全体のアライメントを調べることができます。 :<syntaxhighlight lang=c++ copy>struct MyStruct { int a; double b; }; std::cout << "Alignment of MyStruct: " << alignof(MyStruct) << std::endl;</syntaxhighlight> * この場合、<code>MyStruct</code>のアライメントが表示されます。<code>[[#double|double]]</code>型のメンバ<code>[[#b|b]]</code>に合わせて、構造体全体のアライメントが決まることが多いです。 '''C++14以降''':<code>[[#alignof|alignof]]</code>を使った動的オブジェクトのアライメント確認 * <code>[[#alignof|alignof]]</code>は、動的メモリ確保によって作られたオブジェクトにも使用できます。 :<syntaxhighlight lang=c++ copy>int* p = new int; std::cout << "Alignment of *p: " << alignof(*p) << std::endl;</syntaxhighlight> * このコードは、ポインタ<code>[[#p|p]]</code>が指すオブジェクトのアライメントを調べます。 '''<code>[[#alignof|alignof]]</code>の主な用途''': # 型やオブジェクトのメモリアライメントを調べる # 特定のアライメントを要求するデータ構造を設計する # メモリ最適化やパフォーマンス向上のために、アライメントがどのように影響するかを理解する # ハードウェアの要件に応じた最適なデータ配置を実現する '''現代のC++では、<code>[[#alignof|alignof]]</code>は以下のような場面で重要な役割を果たします''': * ハードウェアアーキテクチャに特化した最適化 * メモリ配置やアライメントを意識したデータ構造の設計 * データの整合性を保ちながらパフォーマンスを向上させるための調整 * 動的メモリのアライメントを確認するために、<code>[[#alignof|alignof]]</code>を利用したデバッグや最適化 '''注意点''': * <code>[[#alignof|alignof]]</code>は、C++11以降の機能なので、それ以前のバージョンのC++では使用できません。C++11以降に対応したコンパイラを使用する必要があります。 * <code>[[#alignof|alignof]]</code>が返す値は、型に対する最小のアライメントを示しており、プラットフォームによって異なる場合があります。特に、64ビットシステムと32ビットシステムではアライメントが異なることが一般的です。 :<syntaxhighlight lang=c++ copy>std::cout << "Alignment of MyStruct: " << alignof(MyStruct) << std::endl;</syntaxhighlight> このコードでは、<code>MyStruct</code>型のアライメントを取得して表示します。<code>[[#alignof|alignof]]</code>を使うことで、型のアライメントを簡単に取得でき、特に低レベルプログラミングやハードウェアに関連した開発で非常に便利です。 ==== auto ==== '''<code>[[#auto|auto]]</code>'''は、C++11で導入されたキーワードで、変数の型を自動的に推論するために使用されます。これにより、プログラマが型を明示的に指定する手間を省き、コードの可読性と保守性が向上します。<code>[[#auto|auto]]</code>は、特にテンプレートや複雑な型が絡む場合に役立ちます。 C++での'''<code>[[#auto|auto]]</code>'''の主な用途と進化: '''C++11''':<code>[[#auto|auto]]</code>の導入 * <code>[[#auto|auto]]</code>は、変数の型をコンパイラが自動的に推論することを意味します。これにより、型を明示的に書かなくても、コンパイラが変数の型を解析して適切に決定します。 :<syntaxhighlight lang=c++ copy>auto x = 42; // xはint型と推論される auto y = 3.14; // yはdouble型と推論される</syntaxhighlight> * このコードでは、<code>[[#x|x]]</code>は<code>[[#int|int]]</code>型、<code>[[#y|y]]</code>は<code>[[#double|double]]</code>型として推論されます。 '''C++14''':<code>[[#auto|auto]]</code>によるラムダ式の引数型の推論 * C++14では、ラムダ式の引数の型にも<code>[[#auto|auto]]</code>を使うことができ、より簡潔に記述できるようになりました。 :<syntaxhighlight lang=c++ copy>auto sum = [](auto a, auto b) { return a + b; }; // 任意の型の引数を受け入れるラムダ式 std::cout << sum(3, 4) << std::endl; // 7 std::cout << sum(3.5, 4.5) << std::endl; // 8.0</syntaxhighlight> * この例では、<code>[[#sum|sum]]</code>ラムダ式は異なる型の引数に対応し、適切な型の演算を行います。 '''C++17''':<code>[[#auto|auto]]</code>による返り値の型推論 * C++17では、関数の返り値型にも<code>[[#auto|auto]]</code>を使い、より簡潔にコードを書くことができるようになりました。<code>[[#auto|auto]]</code>を使うことで、関数の返り値の型をコンパイラに推論させることができます。 :<syntaxhighlight lang=c++ copy>auto get_value() { return 42; // int型として推論される }</syntaxhighlight> * <code>get_value()</code>は<code>[[#int|int]]</code>型の値を返すとコンパイラが推論します。 '''C++20''':<code>[[#auto|auto]]</code>の使用範囲がさらに拡大 * C++20では、<code>[[#auto|auto]]</code>を使った引数型の推論がより強力になり、コンパイル時に型を確定させる際の柔軟性が向上しました。特に、コンストラクタやメンバ関数での<code>[[#auto|auto]]</code>使用が可能になり、便利さが増しました。 :<syntaxhighlight lang=c++ copy>auto add(auto a, auto b) { return a + b; }</syntaxhighlight> '''<code>[[#auto|auto]]</code>の主な用途''': # 型を自動的に推論してコードを簡潔にする # テンプレートや型が複雑な場合に型指定を省略する # ラムダ式で引数型を簡単に推論する # 関数の返り値の型を自動で決定する '''現代のC++では、<code>[[#auto|auto]]</code>は以下のような場面で重要な役割を果たします''': * 複雑な型の記述を避けてコードを簡潔に保つ * テンプレートを使った汎用的なコードを記述する際に、型を明示的に記述する負担を減らす * 異なる型の引数を持つラムダ式や関数を簡単に定義できる * 型推論により、開発者がより抽象的なレベルでコードを記述できる '''注意点''': * <code>[[#auto|auto]]</code>を使用する際には、型が明示的に推論されるため、意図しない型が推論される場合があります。特に、ポインタや参照を使う場合には注意が必要です。 * <code>[[#auto|auto]]</code>の型推論はコンパイル時に決定されるため、実行時に変わることはありません。そのため、型の予測ができる範囲で使うべきです。 :<syntaxhighlight lang=c++ copy>auto i = 5; // iはint型 auto ptr = &i; // ptrはint*型 auto& ref = i; // refはint&型</syntaxhighlight> * ここでは、<code>[[#auto|auto]]</code>によって変数<code>[[#i|i]]</code>の型は<code>[[#int|int]]</code>、<code>[[#ptr|ptr]]</code>の型は<code>int*</code>、<code>[[#ref|ref]]</code>の型は<code>int&</code>と推論されます。 <code>[[#auto|auto]]</code>は、特に複雑な型を扱う場合にコードの簡潔性と可読性を向上させ、開発者が型を気にせずにより抽象的なコードを書くことを可能にします。 ==== decltype ==== '''<code>[[#decltype|decltype]]</code>'''は、C++11で導入されたキーワードで、式の型を推論するために使用されます。<code>[[#decltype|decltype]]</code>は、変数や式の型を確認したり、その型を別の変数の宣言に利用したりする際に非常に便利です。型推論の柔軟性を提供し、特にテンプレートや型が不明な場合に役立ちます。 C++での'''<code>[[#decltype|decltype]]</code>'''の主な用途と進化: '''C++11''':<code>[[#decltype|decltype]]</code>の導入 * <code>[[#decltype|decltype]]</code>は、式や変数の型を静的に取得するために使用されます。式を指定すると、その型を推論して返します。 :<syntaxhighlight lang=c++ copy>int x = 5; decltype(x) y = 10; // yはint型として推論される</syntaxhighlight> * 上記の例では、<code>decltype(x)</code>により、変数<code>[[#x|x]]</code>の型である<code>[[#int|int]]</code>が推論され、変数<code>[[#y|y]]</code>が<code>[[#int|int]]</code>型として宣言されます。 '''C++14''':<code>decltype(auto)</code>の導入 * C++14では、<code>decltype(auto)</code>が導入され、関数の返り値の型として<code>[[#decltype|decltype]]</code>を使う場合に、参照やポインタの型を正確に推論できるようになりました。 :<syntaxhighlight lang=c++ copy>int&& getValue() { return 42; } decltype(auto) val = getValue(); // valはint&&型として推論される</syntaxhighlight> * ここで、<code>getValue()</code>が右辺値参照を返すため、<code>decltype(auto)</code>によって変数<code>[[#val|val]]</code>も<code>int&&</code>型として推論されます。 '''C++17''':<code>[[#decltype|decltype]]</code>の使用範囲の拡大 * C++17では、<code>[[#decltype|decltype]]</code>がより多くの場面で活用されるようになり、より多様な型推論に対応しました。特に、<code>[[#if constexpr|if constexpr]]</code>やテンプレートによる型推論が広がり、<code>[[#decltype|decltype]]</code>の利用が増えました。 :<syntaxhighlight lang=c++ copy>template <typename T> decltype(auto) multiply(T a, T b) { return a * b; }</syntaxhighlight> * <code>[[#multiply|multiply]]</code>関数では、引数の型に基づいて返り値の型が自動的に決定されます。 '''<code>[[#decltype|decltype]]</code>の主な用途''': # 式や変数の型を明示的に取得する # 型推論を用いた変数の宣言を柔軟に行う # テンプレートやラムダ式の型推論をサポートする # 複雑な型を正確に推論して返す '''現代のC++では、<code>[[#decltype|decltype]]</code>は以下のような場面で重要な役割を果たします''': * 型を正確に推論してコードを簡潔に保つ * テンプレートでの型の依存を処理する際に利用する * 複雑な型を扱う場合に、型の明示的な指定を避ける '''注意点''': * <code>[[#decltype|decltype]]</code>は指定した式や変数の型をそのまま取得するため、式が右辺値の場合、右辺値型として推論されることがあります。参照やポインタ型を扱う場合、<code>decltype(auto)</code>などを使って型を精密に管理する必要があります。 :<syntaxhighlight lang=c++ copy>int x = 10; int& ref = x; decltype(ref) y = x; // yはint&型として推論される decltype(x) z = 20; // zはint型として推論される</syntaxhighlight> * ここでは、<code>[[#ref|ref]]</code>が参照型の<code>int&</code>を持っているため、<code>decltype(ref)</code>で<code>int&</code>が推論され、<code>[[#z|z]]</code>は<code>[[#int|int]]</code>型として推論されます。 <code>[[#decltype|decltype]]</code>は、型推論の精度を高め、C++におけるコードの柔軟性を大きく向上させる機能です。特にテンプレートや型の不確定性が高い場合に非常に有用で、型に依存する操作を柔軟かつ効率的に行うことができます。 ==== dynamic_cast ==== '''<code>[[#dynamic_cast|dynamic_cast]]</code>'''は、C++で使用されるキャスト演算子の一つで、主にポインタや参照型の間で安全に型変換を行うために使用されます。<code>[[#dynamic_cast|dynamic_cast]]</code>は、特に多態性(ポリモーフィズム)を利用する際に、基底クラスから派生クラスへのキャストを実行するために使用され、ランタイムで型安全性を確保します。 C++での'''<code>[[#dynamic_cast|dynamic_cast]]</code>'''の主な用途と進化: '''C++98''':<code>[[#dynamic_cast|dynamic_cast]]</code>の導入 * <code>[[#dynamic_cast|dynamic_cast]]</code>は、基底クラスポインタまたは参照を派生クラスにキャストするために使用され、成功するとキャストされた型に適合したポインタまたは参照が返されます。失敗した場合には、<code>[[#nullptr|nullptr]]</code>が返される(ポインタ型の場合)または例外がスローされる(参照型の場合)ことがあります。 :<syntaxhighlight lang=c++ copy>class Base { virtual void foo() {} // 仮想関数が必要 }; class Derived : public Base {}; Base* base = new Derived(); Derived* derived = dynamic_cast<Derived*>(base); // 正常にキャストされる</syntaxhighlight> * この例では、<code>[[#dynamic_cast|dynamic_cast]]</code>を使用して、<code>Base</code>型のポインタを<code>Derived</code>型にキャストしています。<code>Base</code>クラスに仮想関数が存在するため、<code>[[#dynamic_cast|dynamic_cast]]</code>は実行時に正しく型を特定できます。 '''C++11''':型変換の強化 * <code>[[#dynamic_cast|dynamic_cast]]</code>は、特に多態性を持つクラス階層内でのキャストにおいて、型安全を提供します。また、<code>[[#dynamic_cast|dynamic_cast]]</code>はポインタまたは参照に対して動作しますが、失敗した場合の挙動が異なります。ポインタの場合は<code>[[#nullptr|nullptr]]</code>が返され、参照の場合は<code>std::bad_cast</code>例外がスローされます。 :<syntaxhighlight lang=c++ copy>Base* base = new Base(); Derived* derived = dynamic_cast<Derived*>(base); if (derived == nullptr) { std::cout << "キャスト失敗\n"; }</syntaxhighlight> * 上記の例では、<code>Base</code>型のポインタを<code>Derived</code>型にキャストしようとしていますが、<code>Base</code>には<code>Derived</code>型のオブジェクトが格納されていないため、<code>[[#derived|derived]]</code>は<code>[[#nullptr|nullptr]]</code>となり、キャストが失敗したことがわかります。 '''<code>[[#dynamic_cast|dynamic_cast]]</code>の主な用途''': # 基底クラスポインタや参照を派生クラスのポインタや参照に安全にキャストする # 多態性を持つクラスでの型変換を行う # 型変換が成功したかどうかをランタイムで確認する # 型情報を失わず、仮想関数を通じて動的にキャストを行う '''現代のC++では、<code>[[#dynamic_cast|dynamic_cast]]</code>は以下のような場面で重要な役割を果たします''': * ポリモーフィズムを利用した型変換で型安全を確保 * 型を確実に判定し、予期しない動作を防ぐ * コンパイル時に型が不確定な場合でも、実行時に正確な型変換を行う '''注意点''': * <code>[[#dynamic_cast|dynamic_cast]]</code>は、クラスが少なくとも1つの仮想関数を持っている場合にのみ有効です。これにより、クラスの型情報がランタイムに保持され、キャストが可能になります。 * <code>[[#dynamic_cast|dynamic_cast]]</code>は、失敗時に<code>[[#nullptr|nullptr]]</code>(ポインタ型の場合)を返し、参照型の場合は<code>std::bad_cast</code>例外をスローします。失敗時の処理を適切に行う必要があります。 :<syntaxhighlight lang=c++ copy>try { Base& baseRef = *base; Derived& derivedRef = dynamic_cast<Derived&>(baseRef); // 失敗時に例外がスローされる } catch (const std::bad_cast& e) { std::cout << "キャスト失敗: " << e.what() << std::endl; }</syntaxhighlight> * ここでは、参照型に対する<code>[[#dynamic_cast|dynamic_cast]]</code>が失敗した場合に<code>std::bad_cast</code>例外がスローされ、その内容が表示されます。 <code>[[#dynamic_cast|dynamic_cast]]</code>は、安全な型変換を提供し、ポリモーフィックなクラス階層内での型チェックを実行時に行うため、特に複雑なオブジェクト指向プログラミングにおいて重要な役割を果たします。 ==== static_cast ==== '''<code>[[#static_cast|static_cast]]</code>'''は、C++において型変換を行うためのキャスト演算子の一つで、コンパイル時に型安全を提供し、明示的にキャストする必要がある場合に使用されます。<code>[[#static_cast|static_cast]]</code>は、通常、明確に型変換を行いたいときに使い、コンパイル時に型がチェックされます。<code>[[#static_cast|static_cast]]</code>は、安全なキャストを保証しますが、適切な型変換を行うためには、キャストが合法であることがコンパイル時に確認される必要があります。 C++での'''<code>[[#static_cast|static_cast]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#static_cast|static_cast]]</code>は、通常の型変換のために使用され、動的な型変換ではなく、コンパイル時に型の互換性をチェックします。これは、型が互換性を持っている場合に有効です。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void foo() {} }; class Derived : public Base {}; Base* base = new Derived(); Derived* derived = static_cast<Derived*>(base); // 正しい型変換</syntaxhighlight> * 上記のコードでは、<code>Base</code>型のポインタを<code>Derived</code>型のポインタにキャストしています。このようなキャストは、クラス階層で型が適合している場合に有効です。 '''C++11''':機能拡張 * C++11では、<code>[[#static_cast|static_cast]]</code>は、より厳密な型変換を提供し、特に基底クラスと派生クラスの間でのキャストに役立ちます。また、C++11以降のバージョンでは、より厳密な型安全性が強化されています。 :<syntaxhighlight lang=c++ copy>class Base { public: virtual void foo() {} }; class Derived : public Base { public: void bar() {} }; Base* base = new Derived(); Derived* derived = static_cast<Derived*>(base); // 正しいキャスト</syntaxhighlight> * <code>[[#static_cast|static_cast]]</code>は、ポインタ型の変換において、実行時のチェックなしで型変換を行います。そのため、キャストが合法であることが保証されていない場合に使用することは避けるべきです。 '''<code>[[#static_cast|static_cast]]</code>の主な用途''': # 明示的な型変換を行う # 基底クラスと派生クラス間での型変換 # 基本的なデータ型間(例えば、<code>[[#int|int]]</code>から<code>[[#float|float]]</code>など)のキャスト # ポインタの型変換を行う(ポインタ型と参照型のキャスト) 現代のC++では、<code>[[#static_cast|static_cast]]</code>は以下のような場面で重要な役割を果たします: * 明示的に型変換を行う際の使用 * クラス階層での型変換 * 型変換がコンパイル時にチェックされるため、安全性が高い * C++の最適化機能を活用したキャスト操作 '''注意点''': * <code>[[#static_cast|static_cast]]</code>は、型変換がコンパイル時に明確である場合にのみ使用されます。無効なキャストを行うと、コンパイルエラーが発生します。 * <code>[[#dynamic_cast|dynamic_cast]]</code>のように、<code>[[#static_cast|static_cast]]</code>は実行時に型を確認しないため、型変換が正しくない場合に予期しない結果を引き起こす可能性があります。 :<syntaxhighlight lang=c++ copy>int a = 5; double b = static_cast<double>(a); // intからdoubleへのキャスト</syntaxhighlight> * ここでは、<code>[[#static_cast|static_cast]]</code>を使用して<code>[[#int|int]]</code>型を<code>[[#double|double]]</code>型に変換しています。この場合、コンパイル時に正しいキャストが行われ、型が安全に変換されます。 <code>[[#static_cast|static_cast]]</code>は、C++の型変換演算子の中で最も一般的に使用されるものの一つであり、特にコンパイル時に型変換が明確な場合に便利です。また、<code>[[#dynamic_cast|dynamic_cast]]</code>とは異なり、実行時に型安全性を保証するものではないため、適切な状況で使用することが求められます。 ==== reinterpret_cast ==== '''<code>[[#reinterpret_cast|reinterpret_cast]]</code>'''は、C++における型変換演算子の一つで、最も強力かつ危険な型変換を提供します。このキャストは、型のビットパターンをそのまま別の型に再解釈するために使用されます。通常、<code>[[#reinterpret_cast|reinterpret_cast]]</code>は、ポインタ型や参照型間で型変換を行うために用いられますが、型安全性がほとんど保証されません。そのため、不適切な使用は未定義動作を引き起こす可能性があるため、注意が必要です。 C++での'''<code>[[#reinterpret_cast|reinterpret_cast]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>は、型間での低レベルなビットパターンの変換を行います。通常、ポインタ型や参照型、整数型間のキャストに使用されます。 :<syntaxhighlight lang=c++ copy>int a = 10; char* p = reinterpret_cast<char*>(&a); // int* を char* に変換 // メモリのビットパターンを直接操作する for (int i = 0; i < sizeof(a); ++i) { std::cout << *(p + i); // 文字列として表示する場合 }</syntaxhighlight> * 上記のコードでは、<code>[[#int|int]]</code>型のポインタを<code>[[#char|char]]</code>型のポインタに変換し、ポインタが指すメモリの内容をそのまま解釈しています。これは通常、低レベルなメモリ操作やバイナリデータの操作に使われます。 '''C++11''':機能拡張 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>は、ポインタ型同士や、ポインタと整数型の間でのキャストが可能になり、さらなる低レベル操作が可能となりました。 * このキャストは、特にハードウェアやシステムプログラミングで有用で、メモリのビットパターンを直接操作する必要がある場面で使われますが、慎重に使用しなければなりません。 :<syntaxhighlight lang=c++ copy>void* ptr = malloc(10); int* intPtr = reinterpret_cast<int*>(ptr); // void* を int* にキャスト</syntaxhighlight> * 上記のように、<code>[[#reinterpret_cast|reinterpret_cast]]</code>は<code>void*</code>型のポインタを他の型のポインタに変換するためにも使用されます。 '''<code>[[#reinterpret_cast|reinterpret_cast]]</code>の主な用途''': # ポインタ型や参照型、整数型間での低レベルな型変換 # メモリのビットパターンをそのまま別の型として扱う # システムプログラミングやハードウェア制御における特殊なキャスト # 低レベルなバイナリ操作やデータシリアライズに使用 現代のC++では、<code>[[#reinterpret_cast|reinterpret_cast]]</code>は以下のような場面で重要な役割を果たします: * システムプログラミングやデバイス制御、OSの内部でのメモリ操作 * バイナリデータを異なる型として解釈する場合 * ハードウェアやネットワークプロトコルにおけるデータ変換 '''注意点''': * <code>[[#reinterpret_cast|reinterpret_cast]]</code>は型のビットパターンを無理やり変換するため、キャストが不正であってもコンパイルエラーは発生しません。そのため、適切に使用しないと未定義動作を引き起こす可能性があります。 * 特にポインタ型を異なる型にキャストするときは、元の型との整合性がない場合に不具合が生じることがあります。 * <code>[[#reinterpret_cast|reinterpret_cast]]</code>は非常に強力なキャストですが、通常は他のキャスト(例えば<code>[[#static_cast|static_cast]]</code>や<code>[[#dynamic_cast|dynamic_cast]]</code>)を使うことが推奨され、最終手段として使用するべきです。 :<syntaxhighlight lang=c++ copy>int a = 10; void* ptr = reinterpret_cast<void*>(&a); // int* を void* に変換</syntaxhighlight> * 上記のコードでは、<code>[[#int|int]]</code>型のポインタを<code>void*</code>型に変換しています。このような変換は、メモリ操作やポインタの汎用性を持たせる場合に使用されます。 <code>[[#reinterpret_cast|reinterpret_cast]]</code>は、型の再解釈を行う強力なキャスト演算子であり、低レベルプログラミングにおいて有用ですが、誤用は危険です。型変換が安全であることを確認し、慎重に使用する必要があります。 ==== const_cast ==== '''<code>[[#const_cast|const_cast]]</code>は、C++における型変換演算子の一つで、オブジェクトのconst修飾'''を付け外しするために使用されます。このキャストは、'''const'''または'''volatile'''指定子を持つポインタや参照を、逆にして変更できるようにするために使われます。主に、<code>[[#const|const]]</code>を外すことで、変更可能なポインタにアクセスするために使用されますが、'''constの安全性を破壊する'''可能性があるため、使用には注意が必要です。 C++での'''<code>[[#const_cast|const_cast]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#const_cast|const_cast]]</code>は、ポインタや参照から<code>[[#const|const]]</code>指定子を除去するために使用されます。<code>[[#const_cast|const_cast]]</code>によって<code>[[#const|const]]</code>指定子を削除することはできますが、実際にオブジェクトが不変である場合、変更を行うことは未定義動作につながるため注意が必要です。 :<syntaxhighlight lang=c++ copy>const int x = 10; int* p = const_cast<int*>(&x); // constを外して変更可能なポインタに変換 *p = 20; // これは未定義動作です</syntaxhighlight> * 上記のコードはコンパイルは通りますが、<code>[[#x|x]]</code>が<code>[[#const|const]]</code>であるため、<code>[[#p|p]]</code>を使ってその値を変更するのは未定義動作を引き起こします。 '''C++11''':機能拡張 * <code>[[#const_cast|const_cast]]</code>は引き続き<code>[[#const|const]]</code>指定子を操作するために使用されますが、<code>[[#const|const]]</code>を外してポインタの値を変更することは依然として危険です。<code>[[#const_cast|const_cast]]</code>は、'''constの安全性'''を維持するためには慎重に使用する必要があります。 :<syntaxhighlight lang=c++ copy>const int a = 10; const int* p1 = &a; int* p2 = const_cast<int*>(p1); // constのポインタをconstでないポインタに変換 // p2を使って値を変更するのは未定義動作です</syntaxhighlight> '''<code>[[#const_cast|const_cast]]</code>の主な用途''': # '''const修飾の取り外し''':<code>[[#const|const]]</code>または<code>[[#volatile|volatile]]</code>修飾されたポインタや参照から、それらを外して変更可能にするために使用します。 # '''関数パラメータの調整''':関数が<code>[[#const|const]]</code>修飾された引数を受け取る場合でも、<code>[[#const|const]]</code>を外して変更できるポインタに変換する際に使用されます。 # '''<code>[[#const|const]]</code>の制約を回避''':<code>[[#const_cast|const_cast]]</code>を使うことで、<code>[[#const|const]]</code>なオブジェクトに対する変更が許可される場面で使用されます。 '''現代のC++での<code>[[#const_cast|const_cast]]</code>の使用例''': * <code>[[#const_cast|const_cast]]</code>は関数の引数が<code>[[#const|const]]</code>であっても、その引数を変更したい場合に使われますが、常にその変更が適切であるかどうかを確認する必要があります。たとえば、ライブラリ関数などで、外部APIに従って<code>[[#const|const]]</code>修飾を強制している場面で便利です。 :<syntaxhighlight lang=c++ copy>void modifyValue(const int& x) { int& ref = const_cast<int&>(x); // const参照を変更可能な参照にキャスト ref = 20; // xの値を変更(実際には不正な操作の場合、未定義動作) } const int val = 10; modifyValue(val); // 未定義動作の危険</syntaxhighlight> * 上記のコードでは、<code>[[#const|const]]</code>参照を<code>[[#const_cast|const_cast]]</code>を使って非<code>[[#const|const]]</code>参照に変換し、その値を変更しようとしていますが、これは未定義動作につながる可能性があるため、慎重に使用する必要があります。 '''<code>[[#const_cast|const_cast]]</code>の主な注意点''': * '''constオブジェクトを変更しない''':<code>[[#const_cast|const_cast]]</code>を使っても、実際に<code>[[#const|const]]</code>オブジェクトが変更されるべきではありません。変更することで未定義動作が発生する可能性があります。 * '''constの安全性を破壊する可能性''':<code>[[#const_cast|const_cast]]</code>は<code>[[#const|const]]</code>指定子を取り外すことができますが、これはプログラムの論理的な安全性を損なうことになるため、注意深く使用する必要があります。 :<syntaxhighlight lang=c++ copy>const int x = 100; const int* p1 = &x; int* p2 = const_cast<int*>(p1); // const指定子を外す *p2 = 50; // 未定義動作(変更してはいけない)</syntaxhighlight> * 上記のコードは<code>[[#const_cast|const_cast]]</code>を用いて<code>[[#const|const]]</code>指定子を外していますが、変更が不正であるため、未定義動作を引き起こす危険があります。 <code>[[#const_cast|const_cast]]</code>は、主にポインタや参照において<code>[[#const|const]]</code>修飾子を取り外すために使用されますが、その使用には慎重さが必要です。<code>[[#const|const]]</code>オブジェクトを変更することは未定義動作を引き起こす可能性があり、<code>[[#const_cast|const_cast]]</code>の使用は必要最小限に抑えるべきです。 ==== sizeof ==== '''<code>[[#sizeof|sizeof]]</code>'''は、C++における演算子の一つで、オブジェクトや型のサイズ(バイト単位)をコンパイル時に取得するために使用されます。<code>[[#sizeof|sizeof]]</code>は、C言語から引き継がれた演算子で、型情報を静的に評価するため、プログラムの実行時には影響を与えません。<code>[[#sizeof|sizeof]]</code>は、型のサイズを取得するだけでなく、ポインタのサイズや配列の要素数を計算するためにも広く使用されます。 C++での'''<code>[[#sizeof|sizeof]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#sizeof|sizeof]]</code>演算子は、型や変数に対してそのサイズをバイト単位で返します。C++98では、主に型のサイズや、配列の要素数、ポインタのサイズを計算するために使用されます。 :<syntaxhighlight lang=c++ copy>int x = 10; std::cout << "Size of int: " << sizeof(x) << " bytes" << std::endl; // intのサイズを表示</syntaxhighlight> * 上記のコードでは、<code>sizeof(x)</code>が<code>[[#x|x]]</code>の型である<code>[[#int|int]]</code>型のサイズ(通常は4バイト)を返します。 :<syntaxhighlight lang=c++ copy>int arr[10]; std::cout << "Size of array: " << sizeof(arr) << " bytes" << std::endl; // 配列のサイズを表示 std::cout << "Number of elements: " << sizeof(arr) / sizeof(arr[0]) << std::endl; // 配列の要素数</syntaxhighlight> * 配列に対して<code>[[#sizeof|sizeof]]</code>を使用すると、配列全体のサイズが返され、配列の要素数を得るためには配列のサイズを個々の要素のサイズで割ることで計算できます。 '''C++11以降''':機能拡張 * C++11では、<code>[[#sizeof|sizeof]]</code>演算子は依然として変わらず使用されますが、型推論や<code>[[#decltype|decltype]]</code>との組み合わせによる動的型情報の取得が進化しました。<code>[[#sizeof|sizeof]]</code>は型に関する詳細な情報を得るための基本的なツールとなっています。 :<syntaxhighlight lang=c++ copy>auto lambda = [](auto x) { std::cout << "Size of parameter: " << sizeof(x) << " bytes" << std::endl; }; lambda(10); // 引数にintを渡すと、sizeof(x)はintのサイズ(4バイト)を表示 lambda(3.14); // 引数にdoubleを渡すと、sizeof(x)はdoubleのサイズ(8バイト)を表示</syntaxhighlight> * 上記のコードでは、ラムダ式内で<code>[[#sizeof|sizeof]]</code>を使って、<code>[[#x|x]]</code>の型(<code>[[#int|int]]</code>や<code>[[#double|double]]</code>など)のサイズを出力しています。 '''<code>[[#sizeof|sizeof]]</code>の主な用途''': # '''型サイズの取得''':<code>[[#sizeof|sizeof]]</code>は、特定の型(基本型や構造体、クラスなど)のサイズを取得するために使います。これにより、メモリ管理や効率的なデータ処理が可能になります。 # '''配列のサイズ計算''':配列のサイズを計算したり、配列の要素数を取得するために使います。特に、配列とポインタの違いを理解するために重要です。 # '''構造体やクラスのメモリ配置確認''':構造体やクラスのメモリレイアウトを確認するために<code>[[#sizeof|sizeof]]</code>を使用することがあります。これにより、パディングやアライメントの影響を理解できます。 '''現代のC++での<code>[[#sizeof|sizeof]]</code>の使用例''': * <code>[[#sizeof|sizeof]]</code>は、メモリ管理や最適化のために、特に低レベルなプログラムにおいて重要な役割を果たします。例えば、データ構造の設計において、メモリ使用量を確認したり、アルゴリズムの効率を調整する際に活用できます。 :<syntaxhighlight lang=c++ copy>struct MyStruct { int a; char b; double c; }; std::cout << "Size of MyStruct: " << sizeof(MyStruct) << " bytes" << std::endl;</syntaxhighlight> * 上記の例では、<code>MyStruct</code>という構造体のサイズを<code>[[#sizeof|sizeof]]</code>を使って取得しています。構造体のサイズはメンバの型のサイズの合計ではなく、アライメントやパディングによって異なる場合があります。 :<syntaxhighlight lang=c++ copy>std::cout << "Size of pointer: " << sizeof(void*) << " bytes" << std::endl; // ポインタのサイズ</syntaxhighlight> * ポインタ型に対して<code>[[#sizeof|sizeof]]</code>を使うと、ポインタのサイズ(通常は4バイトまたは8バイト)を取得できます。これは、ポインタが指し示すデータの型とは無関係です。 '''<code>[[#sizeof|sizeof]]</code>の主な注意点''': # '''配列とポインタの違い''':配列に対して<code>[[#sizeof|sizeof]]</code>を使うと、配列の全体のサイズを返しますが、ポインタに対して使うとポインタ自体のサイズ(通常は4バイトまたは8バイト)を返します。このため、ポインタを使って配列のサイズを間違えて計算することがないように注意が必要です。 :<syntaxhighlight lang=c++ copy>int arr[10]; int* p = arr; std::cout << "Size of array: " << sizeof(arr) << " bytes" << std::endl; // 配列のサイズ std::cout << "Size of pointer: " << sizeof(p) << " bytes" << std::endl; // ポインタのサイズ</syntaxhighlight> * 上記のコードでは、<code>sizeof(arr)</code>が配列全体のサイズを返しますが、<code>sizeof(p)</code>はポインタ自体のサイズ(通常4バイトまたは8バイト)を返します。 # '''構造体のパディング''':構造体のサイズが、構造体メンバの型サイズの合計より大きくなることがあります。これは、メンバのアライメント要求やパディングによるものです。 :<syntaxhighlight lang=c++ copy>struct AlignedStruct { char c; int i; }; std::cout << "Size of AlignedStruct: " << sizeof(AlignedStruct) << " bytes" << std::endl;</syntaxhighlight> * 上記のコードでは、<code>AlignedStruct</code>のサイズが<code>[[#char|char]]</code>(1バイト)と<code>[[#int|int]]</code>(4バイト)の合計ではなく、アライメントを考慮したサイズが返されます。 '''まとめ''': <code>[[#sizeof|sizeof]]</code>は、C++で非常に重要な演算子で、型のサイズ、配列の要素数、構造体やクラスのメモリレイアウトを確認するために広く使用されます。C++98からC++11以降にかけて、型推論やラムダ式などの新しい機能と組み合わせて、さらに強力なツールとなっています。 ==== typeid ==== '''<code>[[#typeid|typeid]]</code>'''は、C++における演算子の一つで、オブジェクトまたは型の実際の型情報を取得するために使用されます。<code>[[#typeid|typeid]]</code>は、C++RTTI(Run-Time Type Information)の一部であり、実行時にオブジェクトの型を調べることができます。特に、ポインタや参照を使って動的型を確認する場合に有用です。 C++での'''<code>[[#typeid|typeid]]</code>'''の主な用途と進化: '''C++98''':基本的な機能 * <code>[[#typeid|typeid]]</code>演算子は、オブジェクトまたは型に対して、その実際の型情報を得るために使用されます。この演算子は、動的型付けが可能なクラス階層において特に有用です。 :<syntaxhighlight lang=c++ copy>#include <iostream> #include <typeinfo> class Base { }; class Derived : public Base { }; auto main() -> int { Base* basePtr = new Derived(); // 基本クラスポインタから派生クラスを指している場合 std::cout << "Type of basePtr: " << typeid(*basePtr).name() << std::endl; delete basePtr; return 0; }</syntaxhighlight> * 上記のコードでは、<code>typeid(*basePtr)</code>が<code>basePtr</code>が指しているオブジェクトの実際の型情報を返します。<code>[[#typeid|typeid]]</code>はポインタや参照を使って動的型情報を取得でき、クラス階層を考慮した型識別が可能です。 '''C++11以降''':機能拡張 * C++11では、<code>[[#typeid|typeid]]</code>はさらに強力な機能を持つようになり、<code>[[#typeid|typeid]]</code>を使ってコンパイル時および実行時の型情報を調べるための方法が進化しました。特に、<code>[[#typeid|typeid]]</code>演算子は、ポリモーフィズムを使った型の特定に重要な役割を果たします。 :<syntaxhighlight lang=c++ copy>#include <iostream> #include <typeinfo> class Shape { public: virtual void draw() const { std::cout << "Drawing Shape" << std::endl; } virtual ~Shape() = default; }; class Circle : public Shape { public: void draw() const override { std::cout << "Drawing Circle" << std::endl; } }; auto main() -> int { Shape* shape = new Circle(); std::cout << "Type of shape: " << typeid(*shape).name() << std::endl; delete shape; return 0; }</syntaxhighlight> * この例では、<code>typeid(*shape)</code>は実際に<code>Circle</code>オブジェクトが指されていることを示します。<code>[[#typeid|typeid]]</code>を使うことで、ポリモーフィックなクラスでも実行時に動的な型を確認することができます。 '''<code>[[#typeid|typeid]]</code>の主な用途''': # '''動的型の取得''':<code>[[#typeid|typeid]]</code>は、ポインタや参照を使って実行時にオブジェクトの型を調べるために使います。これは、基底クラスポインタを使って派生クラスの情報を得る場合に有用です。 # '''型情報の比較''':<code>[[#typeid|typeid]]</code>を使って、異なる型同士の比較を行うことができます。特に、クラス階層で異なる型かどうかを調べるために利用されます。 # '''デバッグや型チェック''':型に関する情報をデバッグ時に確認したり、型チェックのために使用されることが多いです。 :<syntaxhighlight lang=c++ copy>#include <iostream> #include <typeinfo> class Base {}; class Derived : public Base {}; auto main() -> int { Base* basePtr = new Derived(); if (typeid(*basePtr) == typeid(Derived)) { std::cout << "basePtr is of type Derived" << std::endl; } else { std::cout << "basePtr is not of type Derived" << std::endl; } delete basePtr; return 0; }</syntaxhighlight> * 上記のコードでは、<code>[[#typeid|typeid]]</code>を使って<code>basePtr</code>が実際に指している型が<code>Derived</code>であるかどうかを比較しています。このように、型が一致するかどうかを簡単に確認することができます。 '''現代のC++での<code>[[#typeid|typeid]]</code>の使用例''': * <code>[[#typeid|typeid]]</code>は、特に動的型のチェックやポリモーフィズムの動作を理解するために不可欠です。クラス階層の型確認や型識別を行う際に、非常に便利なツールです。 :<syntaxhighlight lang=c++ copy>#include <iostream> #include <typeinfo> class Base { virtual void f() {} }; class Derived : public Base {}; auto main() -> int { Base* basePtr = new Derived(); std::cout << "Type of basePtr: " << typeid(*basePtr).name() << std::endl; // Derived型の情報が出力される // 型比較 if (typeid(*basePtr) == typeid(Derived)) { std::cout << "basePtr is of type Derived" << std::endl; } delete basePtr; return 0; }</syntaxhighlight> * このコードでは、<code>typeid(*basePtr)</code>を使って、<code>basePtr</code>が指し示すオブジェクトの型が<code>Derived</code>であることを確認しています。 '''<code>[[#typeid|typeid]]</code>の主な注意点''': # '''ポリモーフィズムが必要''':<code>[[#typeid|typeid]]</code>は、動的型情報を取得するためにポリモーフィックな型(少なくとも仮想関数を持つ型)に依存します。非ポリモーフィックなクラスに対して<code>[[#typeid|typeid]]</code>を使用しても、静的な型情報しか得られません。 # '''<code>[[#typeid|typeid]]</code>の比較''':<code>[[#typeid|typeid]]</code>の結果を比較する際、<code>[[#typeid|typeid]]</code>が返す型情報は、型に関する詳細な情報を含んでいますが、同じ型でも異なる名前が出力される場合があることに注意が必要です(特に異なるコンパイラ間で)。 '''まとめ''': <code>[[#typeid|typeid]]</code>は、C++で型情報を動的に取得するための重要なツールです。特にポリモーフィックな型において、実行時にオブジェクトの型を調べたり、型の比較を行ったりするために広く利用されます。C++98からC++11以降にかけて、<code>[[#typeid|typeid]]</code>は型情報を扱うための重要な演算子として進化し、より強力で柔軟な機能を提供しています。 === 例外関連指定子 === 例外に関連する指定子です。 * <code>[[#try|try]]</code>:例外処理を行うブロックの開始。 * <code>[[#catch|catch]]</code>:例外をキャッチするためのブロック。 * <code>[[#throw|throw]]</code>:例外を投げる。 * <code>[[#noexcept|noexcept]]</code>:関数が例外をスローしないことを指定。 '''<code>[[#try|try]]</code>、<code>[[#throw|throw]]</code>、<code>[[#catch|catch]]</code>、<code>[[#noexcept|noexcept]]</code>'''は、C++における例外処理を扱うための重要な構成要素です。これらのキーワードは、プログラム内でエラーや異常事態が発生した際に、その処理方法を指定するために使用されます。例外処理は、プログラムの堅牢性を向上させ、異常時に適切な対応を行うための機能を提供します。 ; C++での、<code>{{Anchor|try}}</code>、<code>{{Anchor|throw}}</code>、<code>{{Anchor|catch}}</code><code>[[#noexcept|noexcept]]</code>の使い方と進化 '''C++98''':基本的な機能 :<syntaxhighlight lang=c++ copy>#include <iostream> #include <stdexcept> auto divide(int a, int b) -> void { if (b == 0) { throw std::runtime_error("Division by zero!"); // 例外を投げる } std::cout << "Result: " << a / b << std::endl; } auto main() -> int { try { divide(10, 0); // 例外を投げる } catch (const std::exception& e) { std::cout << "Caught exception: " << e.what() << std::endl; // 例外を処理 } }</syntaxhighlight> このコードでは、<code>divide</code>関数内で0による除算を行おうとした際に、<code>[[#throw|throw]]</code>キーワードを使って<code>std::runtime_error</code>例外を投げ、<code>[[#catch|catch]]</code>ブロックでその例外を捕まえています。<code>[[#try|try]]</code>ブロック内で例外が発生すると、制御が<code>[[#catch|catch]]</code>ブロックに移ります。 '''C++11''':機能強化 * '''<code>{{Anchor|noexcept}}</code>指定子'''が導入され、関数が例外を投げないことを宣言できるようになりました。これにより、コンパイラが最適化を行いやすくなります。 :<syntaxhighlight lang=c++ copy>auto safeFunction() -> void noexcept { // 例外を投げない関数 }</syntaxhighlight> * '''例外仕様(Exception Specification)'''が変更され、<code>[[#noexcept|noexcept]]</code>が導入されました。これにより、例外を投げない関数が明示的に指定でき、関数の安全性を保証します。 ; <code>[[#try|try]]</code>、<code>[[#throw|throw]]</code>、<code>[[#catch|catch]]</code>、<code>[[#noexcept|noexcept]]</code>の主な用途と利点 # '''エラー処理の集中化''': #* 例外処理を一箇所で行うことができ、異常が発生した際の処理がシンプルかつ一貫性を持って行えます。 # '''コードの可読性と堅牢性の向上''': #* 例外を使用することで、エラー処理のための複雑な条件分岐を避けることができ、コードが簡潔になります。また、<code>[[#try|try]]</code>と<code>[[#catch|catch]]</code>により、エラー処理のロジックを明確に分離できます。 # '''リソース管理の効率化''': #* 例外が発生した場合でも、リソースを適切に解放するために、RAII(Resource Acquisition Is Initialization)パターンを利用したリソース管理が容易になります。 # '''<code>[[#noexcept|noexcept]]</code>の使用によるパフォーマンス向上''': #* <code>[[#noexcept|noexcept]]</code>を使用すると、コンパイラは関数が例外を投げないことを認識し、より最適化されたコードを生成できます。 ; C++における例外処理の進化 '''C++98''':基本的な例外処理機構 * <code>[[#try|try]]</code>、<code>[[#throw|throw]]</code>、<code>[[#catch|catch]]</code>による基本的な例外処理が導入され、プログラム内でエラーや予期しない状況を適切に処理できるようになりました。 '''C++11''': * '''<code>[[#noexcept|noexcept]]</code>''':関数が例外を投げないことを宣言する<code>[[#noexcept|noexcept]]</code>指定子が導入され、関数の安全性を保証できるようになりました。これにより、コンパイラの最適化も進みました。 :<syntaxhighlight lang=c++ copy>auto foo() -> void noexcept { // この関数は例外を投げないことを保証 }</syntaxhighlight> '''C++17''': * '''<code>std::try_to_lock</code>''' など、並列処理やマルチスレッド環境でのエラーハンドリングのための機能が強化されました。スレッド間でのロック競合を防ぐためのメカニズムが提供され、より複雑なエラーハンドリングが可能になりました。 ; まとめ * '''<code>[[#try|try]]</code>''':例外が発生する可能性のあるコードを囲み、その後の処理を<code>[[#catch|catch]]</code>ブロックで行います。 * '''<code>[[#throw|throw]]</code>''':例外を発生させ、呼び出し元に処理を引き渡します。 * '''<code>[[#catch|catch]]</code>''':<code>[[#try|try]]</code>ブロック内で発生した例外を受け取り、処理します。 * '''<code>[[#noexcept|noexcept]]</code>''':関数が例外を投げないことを示す指定子で、パフォーマンス向上と関数の安全性を確保します。 これらのキーワードは、C++における堅牢なエラーハンドリング機能を提供し、予期しないエラーに対してもプログラムがクラッシュせずに適切に処理できるようになります。 === 名前の修飾 === 名前空間や関数名、変数名などの修飾に使用される指定子です。 * <code>[[#namespace|namespace]]</code>:名前空間の指定。 * <code>[[#using|using]]</code>:名前空間の指定。 * <code>[[#typedef|typedef]]</code>:型の別名を作成。 * <code>[[#using|using]]</code>:型のエイリアスを定義。 ==== namespace ==== ==== using ==== ==== typedef ==== ==== using ==== ---- この一覧はC++の主要な指定子を網羅していますが、C++の進化とともに新しい機能や指定子も追加されています。使用するC++のバージョンに応じて、追加の指定子がある場合もあるので、規格に準拠したドキュメントを参照することをおすすめします。 {{DEFAULTSORT:していし}} [[Category:C++]] 9xmz0cw9knn589figl4u5drpr7ir8jf