名前空間
変種
操作

代入演算子

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
一般
値カテゴリ (lvalue, rvalue, xvalue)
評価順序 (副作用完了点)
定数式
未評価式
一次式
ラムダ式(C++11)
リテラル
整数リテラル
浮動小数点リテラル
ブーリアンリテラル
文字リテラル および エスケープシーケンス
文字列リテラル
ヌルポインタリテラル(C++11)
ユーザ定義リテラル(C++11)
演算子
代入演算子: a=b, a+=b, a-=b, a*=b, a/=b, a%=b, a&=b, a|=b, a^=b, a<<=b, a>>=b
インクリメントとデクリメント: ++a, --a, a++, a--
算術演算子: +a, -a, a+b, a-b, a*b, a/b, a%b, ~a, a&b, a|b, a^b, a<<b, a>>b
論理演算子: a||b, a&&b, !a
比較演算子: a==b, a!=b, a<b, a>b, a<=b, a>=b, a<=>b(C++20)
メンバアクセス演算子: a[b], *a, &a, a->b, a.b, a->*b, a.*b
その他の演算子: a(...), a,b, a?b:c
デフォルト比較(C++20)
演算子の代替表現
優先順位と結合性
畳み込み式(C++17)
new 式
delete 式
throw 式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
演算子オーバーロード
変換
暗黙の変換
const_cast
static_cast
reinterpret_cast
dynamic_cast
明示的な変換 (T)a, T(a)
ユーザ定義変換
 

代入演算子はオブジェクトの値を変更します。

演算子名 構文 オーバーロード可能 プロトタイプの例 (class T に対して)
クラス定義の内側 クラス定義の外側
単純代入 a = b Yes T& T::operator =(const T2& b); N/A
加算代入 a += b Yes T& T::operator +=(const T2& b); T& operator +=(T& a, const T2& b);
減算代入 a -= b Yes T& T::operator -=(const T2& b); T& operator -=(T& a, const T2& b);
乗算代入 a *= b Yes T& T::operator *=(const T2& b); T& operator *=(T& a, const T2& b);
除算代入 a /= b Yes T& T::operator /=(const T2& b); T& operator /=(T& a, const T2& b);
剰余代入 a %= b Yes T& T::operator %=(const T2& b); T& operator %=(T& a, const T2& b);
ビット単位の論理積代入 a &= b Yes T& T::operator &=(const T2& b); T& operator &=(T& a, const T2& b);
ビット単位の論理和代入 a |= b Yes T& T::operator |=(const T2& b); T& operator |=(T& a, const T2& b);
ビット単位の排他的論理和代入 a ^= b Yes T& T::operator ^=(const T2& b); T& operator ^=(T& a, const T2& b);
ビット単位の左シフト代入 a <<= b Yes T& T::operator <<=(const T2& b); T& operator <<=(T& a, const T2& b);
ビット単位の右シフト代入 a >>= b Yes T& T::operator >>=(const T2& b); T& operator >>=(T& a, const T2& b);
ノート
  • すべての組み込みの代入演算子は *this を返し、ほとんどのユーザ定義のオーバーロードも組み込みと同じ方法で使用できるように *this を返します。 しかしユーザ定義の演算子オーバーロードでは戻り値の型として任意の型 (void を含む) を使用できます。
  • T2T を含む任意の型にできます。

目次

[編集] 説明

コピー代入演算子はオブジェクト a の内容を b の内容で置き換えます (b は変更されません)。 クラス型の場合、これは特別なメンバ関数であり、コピー代入演算子で説明されています。

ムーブ代入演算子はオブジェクト a の内容を b の内容で置き換えますが、可能であればコピーを回避します (b は変更されるかもしれません)。 クラス型の場合、これは特別なメンバ関数であり、 ムーブ代入演算子で説明されています。 (C++11以上)

非クラス型の場合、コピー代入とムーブ代入は区別できず、直接代入と呼ばれます。

複合代入演算子は、オブジェクト a の内容を、 a の以前の値と b の値の間の二項演算の結果で置き換えます。

[編集] 組み込みの直接代入

直接代入式は以下の形式を持ちます。

lhs = rhs (1)
lhs = {} (2) (C++11以上)
lhs = { rhs } (3) (C++11以上)

組み込みの演算子の場合、 lhs は任意の非 const スカラー型を使用でき、 rhslhs の型に暗黙に変換可能でなければなりません。

直接代入演算子は左の被演算子として変更可能な左辺値を、右の被演算子として右辺値式または波括弧初期化子リスト (C++11以上)を期待し、変更後の左の被演算子を表す左辺値を返します。

非クラス型の場合、右の被演算子はまず左の被演算子の cv 修飾されていない型に暗黙に変換され、その後その値が左の被演算子の表すオブジェクトにコピーされます。

左の被演算子が参照型のとき、代入演算子はその参照先のオブジェクトを変更します。

左右の被演算子が表しているオブジェクトがオーバーラップしている場合、動作は未定義です (そのオーバーラップがぴったりで型が同じ場合を除きます)。

右の被演算子が波括弧初期化子リストの場合、

  • E1 がスカラー型の場合、
  • E1 = {}E1 = T{} と同等です。 ただし TE1 の型です。
  • E1 = {E2}E1 = T{E2} と同等です。 ただし TE1 の型です。
  • E1 がクラス型の場合、構文 E1 = {args...}波括弧初期化子リストを引数として使用した代入演算子の呼び出しを生成します。 これはオーバーロード解決のルールにしたがって適切な代入演算子を選択します。 何らかの非クラス型からの非テンプレート代入演算子が利用可能な場合、 E1 = {} においてコピー/ムーブ代入よりも優先的に選択されることに注意してください。 {} から非クラスへの変換は恒等変換であり、 {} からクラス型へのユーザ定義変換より順位が上であるためです。
(C++11以上)

ユーザ定義の演算子に対するオーバーロード解決において、すべての型 T について、以下の関数シグネチャがオーバーロード解決に参加します。

T*& operator=(T*&, T*);
T*volatile & operator=(T*volatile &, T*);

すべての列挙型またはメンバポインタ型または volatile 修飾されたそれらの型 T について、以下の関数シグネチャがオーバーロード解決に参加します。

T& operator=(T&, T );

A1 が算術型または volatile 修飾された算術型であり、 A2 が昇格された算術型であるような、 A1 と A2 のすべての組について、以下の関数シグネチャがオーバーロード解決に参加します。

A1& operator=(A1&, A2);

[編集]

#include <iostream>
int main()
{
    int n = 0;   // 代入ではない
    n = 1;       // 直接代入
    std::cout << n << ' ';
    n = {};      // ゼロ初期化して代入
    std::cout << n << ' ';
    n = 'a';     // 整数昇格して代入
    std::cout << n << ' ';
    n = {'b'};   // 明示的なキャストをして代入
    std::cout << n << ' ';
    n = 1.0;     // 浮動小数点変換して代入
    std::cout << n << ' ';
//  n = {1.0};   // コンパイルエラー (縮小変換)
 
    int& r = n;  // 代入ではない
    int* p;
 
    r = 2;       // 参照を通した代入
    std::cout << n << '\n';
    p = &n;      // 直接代入
    p = nullptr; // ヌルポインタ変換して代入 
 
    struct {int a; std::string s;} obj;
    obj = {1, "abc"}; // 波括弧初期化子リストからの代入
    std::cout << obj.a << ':' << obj.s << '\n';
}

出力:

1 0 97 98 1 2
1:abc

[編集] 組み込みの複合代入

組み込みの複合代入式は以下の形式を持ちます。

lhs op rhs (1)
lhs op {} (2) (C++11以上)
lhs op { rhs } (3) (C++11以上)
op - *=, /= %=, += -=, <<=, >>=, &=, ^=, |= のいずれか
lhs - 組み込みの演算子の場合、 lhs は任意の算術型を使用できます。 op+= または -= のときは、 + および - と同じ制限付きでポインタ型も使用できます。
rhs - 組み込みの演算子の場合、 rhslhs に暗黙に変換可能でなければなりません。

すべての組み込みの複合代入式 E1 op= E2 (ただし E1 は変更可能な左辺値式で、 E2 は右辺値式または波括弧初期化子リスト (C++11以上)) の動作は、式 E1 = E1 op E2 の動作と、式 E1 が一度しか評価されないことと、不定に配列される関数呼び出しに関して単一の操作として動作する (例えば f(a += b, g()) の場合、 += は g() の内部から見てまったく開始されていないか完了しているかのいずれかです) ことを除いて、まったく同じです。

ユーザ定義の演算子に対するオーバーロード解決において、 A1 が算術型または volatile 修飾された算術型であり、 A2 が昇格した算術型であるような、 A1 と A2 のすべての組について、以下の関数シグネチャがオーバーロード解決に参加します。

A1& operator*=(A1&, A2);
A1& operator/=(A1&, A2);
A1& operator+=(A1&, A2);
A1& operator-=(A1&, A2);

I1 が整数型または volatile 修飾された整数型であり、 I2 が昇格した整数型であるような、 I1 と I2 のすべての組について、以下の関数シグネチャがオーバーロード解決に参加します。

I1& operator%=(I1&, I2);
I1& operator<<=(I1&, I2);
I1& operator>>=(I1&, I2);
I1& operator&=(I1&, I2);
I1& operator^=(I1&, I2);
I1& operator|=(I1&, I2);

オブジェクト型または cv 修飾されたオブジェクト型 T について、以下の関数シグネチャがオーバーロード解決に参加します。

T*& operator+=(T*&, std::ptrdiff_t);
T*& operator-=(T*&, std::ptrdiff_t);
T*volatile & operator+=(T*volatile &, std::ptrdiff_t);
T*volatile & operator-=(T*volatile &, std::ptrdiff_t);

[編集]

[編集] 関連項目

演算子の優先順位

演算子オーバーロード

一般的な演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバアクセス その他

a = b
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b
a <=> b

a[b]
*a
&a
a->b
a.b
a->*b
a.*b

a(...)
a, b
? :

特殊な演算子

static_cast は型を別の関連する型に変換します。
dynamic_cast は継承階層内で変換します。
const_castcv 修飾子を追加または削除します。
reinterpret_cast は型を無関係の型に変換します。
C スタイルのキャストstatic_cast, const_cast, reinterpret_cast の混合によって型を別の型に変換します。
new は動的記憶域期間を持つオブジェクトを作成します。
delete は以前に new 式によって作成されたオブジェクトを破棄し、取得したメモリ領域を解放します。
sizeof は型のサイズを照会します。
sizeof...パラメータパックのサイズを照会します。 (C++11以上)
typeid は型の型情報を照会します。
noexcept は式が例外を投げることができるかどうかを調べます。 (C++11以上)
alignof は型のアライメント要件を照会します。 (C++11以上)

代入演算子C言語リファレンス