本文へスキップ
製品デスクトップツールTASTECAD図面の確認TASTEFILESファイル管理TASTEFTPファイル転送TASTESSHリモートワークスペースTASTEZIP圧縮と展開開発ツールTASTECODERust 統合開発環境TASTESTUDIO統合開発・テスト環境TASTEETLデータ統合(ETL)サーバーTASTEREMOTEリモートデスクトップサーバーTASTEGEO空間情報サーバーTASTEMAILメールワークスペースはじめるダウンロードドキュメント購入すべての製品
マーケットプレイス
ニュース
技術ニュース今日の開発ニュース開発ドキュメントプログラミング言語RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDartWebフロントエンド フレームワークNext.jsReactVue.js · NuxtSvelteKitAngularサーバー フレームワークSpring BootDjangoFastAPIASP.NET CoreNestJS · Expressアプリ・デスクトップ フレームワークTauriFlutterReact NativeElectronアルゴリズムアルゴリズムの基礎主要アルゴリズム発展アルゴリズム実務のアルゴリズム
コミュニティプロジェクト開発ログプロンプトAIツールの問題ショーケースコミュニティガイド
協業技術移転ウェブサイト構築デスクトップアプリ構築リリース・決済パイプライン販売パートナーお問い合わせ
サービスリモートデスクトップインストールパッケージのカスタマイズ
TASTEDEV
製品

デスクトップツール

TASTECAD複雑な図面を、軽やかにひらくTASTEFILES必要なファイルだけを、最速でTASTEFTPファイルが行き交う、いちばん端正な道TASTESSHサーバーとあなたを、より確かにつなぐTASTEZIPより速くまとめ、より安全にひらく

開発ツール

TASTECODERust アプリの編集・ビルド・デバッグ・テストまでひとつのウィンドウでTASTESTUDIO編集からリモートテスト、承認した AI 修正までTASTEETL値を見ながら、データを運ぶ

サーバー

TASTEREMOTE自社サーバーで運用するリモートデスクトップTASTEGEOGeoServer 互換の空間情報サーバーを Rust で作り直しますTASTEMAILメールの主導権を、もう一度自分の手に

はじめる

ダウンロード全製品の最新版ドキュメント各製品の使い方購入サブスクリプション・永久ライセンスすべての製品全製品を一覧で
すべての製品
マーケットプレイスニュース
技術

ニュース

今日の開発ニュース言語・フレームワーク・GitHub・AI の公式発表開発ドキュメント言語・フレームワーク・アルゴリズムのガイド

プログラミング言語

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

フレームワーク

Webフロントエンド フレームワークNext.jsReactVue.js · NuxtSvelteKitAngular
サーバー フレームワークSpring BootDjangoFastAPIASP.NET CoreNestJS · Express
アプリ・デスクトップ フレームワークTauriFlutterReact NativeElectron

アルゴリズム

アルゴリズムの基礎計算量解析 · ソート · 探索 · 基本データ構造 · 木構造とヒープ主要アルゴリズムグラフ探索 · 最短経路と最小全域木 · 動的計画法 · 貪欲法 · 分割統治法 · バックトラッキング発展アルゴリズム文字列アルゴリズム · 数学と整数論 · ビット演算 · セグメント木 · Union-Find実務のアルゴリズムコーディング面接対策 · LRUキャッシュ · レート制限 · コンシステントハッシュ法
開発ドキュメントをすべて見る
コミュニティ
プロジェクトビルダーと作品を探す開発ログ決定と試行錯誤プロンプト再利用できる指示AIツールの問題Claude・Codex・Gemini の問題と回避策ショーケース完成した成果コミュニティガイドオープンにつくる方法
協業
技術移転Rust・egui でネイティブアプリを作るウェブサイト構築10言語、アカウント、ドキュメントとダウンロードデスクトップアプリ構築Rust・egui、WebView なしリリース・決済パイプライン署名・MSI・deb・rpm・AppImage・ハッシュ販売パートナー紹介して決済額の30%お問い合わせ構築・提携・投資のご相談
サービス
リモートデスクトップブラウザから自分のパソコンへインストールパッケージのカスタマイズ必要な機能だけ、設定は事前に
購入
JA
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
ログイン
ログイン
TASTEDEV

小さなツールから、より良い開発へ。

support@tastedev.netTASTEDEVを支援
製品製品ラインナップ購入ドキュメントダウンロードマーケットプレイスサポート
コミュニティプロジェクト開発ログプロンプトAIツールの問題ショーケース
ポリシープライバシーポリシー利用規約サブスクリプション規約返金ポリシーコミュニティガイドライン
アカウントログイン新規登録
訪問者
今日
012345678901234567890123456789012345678901234567890123456789
昨日
012345678901234567890123456789012345678901234567890123456789
累計閲覧
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
商号
GXSOFT
代表者
CHOI YOUNG GU
事業者登録番号
853-44-00368
所在地
9F V24, 351 Gyeongin-ro, Michuhol-gu, Incheon, Republic of Korea
電話
+82-10-4404-1523
メール
whitecalvin@tastedev.net
個人情報保護責任者
CHOI YOUNG GU

© 2026 TASTEDEV製品情報は検証済みの開発ソースに基づいています。リリース・改善中

C++ ドキュメント
C++
Getting StartedSyntax BasicsTypes and DataModules and PackagesErrors and TestingKey Concepts
ディスカッション

C++ ガイド · 6/6

Key Concepts

この章は現在、英語でのみ提供しています。

Four ideas separate idiomatic modern C++ from "C with classes": RAII, smart pointers, move semantics and templates.

RAII

RAII (Resource Acquisition Is Initialization) means an object acquires a resource in its constructor and releases it in its destructor. A local object's destructor always runs when it leaves scope, even if an exception passes through, so resources owned this way cannot leak.

#include <cstdio>
#include <stdexcept>

class File {
public:
    File(const char* path, const char* mode) : handle_{std::fopen(path, mode)} {
        if (!handle_) throw std::runtime_error("could not open file");
    }
    ~File() { std::fclose(handle_); }      // closed automatically at end of scope

    File(const File&) = delete;            // no copies: never close the same handle twice
    File& operator=(const File&) = delete;

    std::FILE* get() const noexcept { return handle_; }
private:
    std::FILE* handle_;
};

void write_log() {
    File f{"log.txt", "w"};
    std::fputs("start\n", f.get());
    // even if something below throws, f's destructor closes the file
}

The standard library works the same way: std::vector and std::string own memory, std::ifstream owns a file, std::lock_guard owns a mutex lock. Modern code rarely needs a bare new or delete.

Smart pointers

Heap objects should be owned by a smart pointer from <memory>.

TypeOwnershipHow to create
std::unique_ptr<T>Sole owner. Movable, not copyablestd::make_unique<T>(...) (C++14)
std::shared_ptr<T>Shared ownership via a reference countstd::make_shared<T>(...)
std::weak_ptr<T>Non-owning observer, used to break reference cyclesCreated from a shared_ptr
#include <iostream>
#include <memory>
#include <string>
#include <vector>

struct Shape {
    virtual ~Shape() = default;
    virtual double area() const = 0;
};

struct Circle : Shape {
    explicit Circle(double r) : r{r} {}
    double area() const override { return 3.14159 * r * r; }
    double r;
};

int main() {
    std::vector<std::unique_ptr<Shape>> shapes;
    shapes.push_back(std::make_unique<Circle>(1.0));
    shapes.push_back(std::make_unique<Circle>(2.0));
    for (const auto& s : shapes) std::cout << s->area() << '\n';
    // every Circle is destroyed when shapes goes away

    auto config = std::make_shared<std::string>("debug");
    auto another = config;                       // reference count is now 2
    std::cout << config.use_count() << '\n';     // 2
}
この章について質問がありますか?
前の章Errors and Testing

Default to std::unique_ptr; use std::shared_ptr only when ownership is genuinely shared. A function that merely uses an object should take a reference (such as const Shape&) or a plain pointer, not a smart pointer.

Move semantics

C++11 added move operations, which transfer a resource instead of duplicating it. A temporary, or an object marked with std::move, can hand over its internal buffer, so an expensive copy becomes a few pointer assignments. std::move itself moves nothing; it is a cast meaning "you may move from this".

#include <iostream>
#include <string>
#include <utility>
#include <vector>

int main() {
    std::string big(1'000'000, 'x');
    std::vector<std::string> list;

    list.push_back(big);              // copy: big is untouched
    list.push_back(std::move(big));   // move: big's buffer is handed over
    // big is now valid but unspecified; assign a new value before relying on it
    big = "reused";

    std::cout << list.size() << '\n'; // 2
}

When returning a local, write return x;, not return std::move(x);: the compiler already applies copy elision or an implicit move. And if a class doesn't manage a resource directly, let the compiler generate its copy and move operations (the Rule of Zero).

Templates and generic programming

Templates are functions and classes parameterized by type; the compiler generates a concrete version for each type you use. The standard containers and algorithms are all templates.

#include <concepts>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

template <typename T>
T max_of(const T& a, const T& b) {
    return (a < b) ? b : a;
}

template <typename T>
class Stack {
public:
    void push(T value) { items_.push_back(std::move(value)); }
    T pop() { T top = std::move(items_.back()); items_.pop_back(); return top; }
    bool empty() const { return items_.empty(); }
private:
    std::vector<T> items_;
};

// C++20 concepts: only integer types are accepted
template <std::integral T>
T half(T value) { return value / 2; }

int main() {
    std::cout << max_of(3, 7) << '\n';                                    // 7
    std::cout << max_of(std::string{"a"}, std::string{"b"}) << '\n';      // b
    Stack<int> s;
    s.push(1);
    s.push(2);
    std::cout << s.pop() << ' ' << half(10) << '\n';                      // 2 5
    // half(1.5);  // error: double does not satisfy std::integral
}

Template definitions must be visible where they are used, so they usually live in headers. C++20 concepts name a template's requirements and turn pages of instantiation errors into a short, readable message.

Summary

  • RAII: give every resource an owning object and let its destructor clean up.
  • Create heap objects with std::make_unique, and use std::shared_ptr only for genuinely shared ownership.
  • std::move only permits a move; reassign a moved-from object before relying on it.
  • Templates give type-independent code; concepts state what it needs.

Further reading

  • cppreference.com: language and library reference, noting which standard added each feature.
  • C++ Core Guidelines: modern C++ guidance edited by Bjarne Stroustrup and Herb Sutter.
  • isocpp.org: the Standard C++ Foundation's site, with news and learning material.

コメント 0件

人気のコメント順新しい順

ログイン · ログインするとコメントできます。