🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
代入演算子=のオーバーロードを実行してみます どのようなときに代入演算子のオーバーロードは実行されるのでしょうか?
代入演算子=のオーバーロードを実行してみます どのようなときに代入演算子のオーバーロードは実行されるのでしょうか?
ソーラー「コピーコンストラクタの仕組みについて考察してきました
準備は整ったね
さあ、
いよいよ
代入演算子=のオーバーロードを実行してみよう
」
🌞 🌞 🌞 🌞 🌞 🌞
今度のファンタジアンさんは
代入演算子=さんです
🌞 🌞 🌞 🌞 🌞 🌞
ソーラー「
クラスSuutitoMojiに
コピーコンストラクタが設定されたプログラムを
見てきましたが
今度は
代入演算子=のオーバーロードを実行してみたいと思います」
int(イント)「代入演算子=のオーバーロードってなんのこと?」
ソーラー
「代入演算子=のオーバーロード(多重定義)とは
代入演算子=に新たな機能を追加するための定義をおこなうということなんですが
いままでの代入演算子=の機能をかきかえることもできます
そうですね
代入演算子=のオーバーロード
とは・・・
通常
int型の変数cには
int型の変数dを
c=d;
のように代入できます
代入演算子=の基本的な仕組みです
さあて
次のようなクラス
class SuutitoMoji{
public:
int x;
public:
char* i;
};
があるとします
このクラスSuutitoMojiを用いた
aのクラスSuutitoMoji型のオブジェクト宣言
SuutitoMoji a;
bのクラスSuutitoMoji型のオブジェクト宣言
SuutitoMoji b;
を実行し
クラスSuutitoMoji型のオブジェクトa
と
クラスSuutitoMoji型のオブジェクトb
を
作製します
さらに
b.x=1;
b.i=new char[50];
(b.iによってメモリ領域が動的に確保されました
b.iにはb.iによって動的に確保されたメモリ領域の先頭のメモリのアドレスが格納されます)
strcpy_s(b.i, 50, "にゃこ");
(b.iによって動的に確保されたメモリ領域に文字列データ"にゃこ"が
格納されます)
を実行した後
クラスSuutitoMoji型のオブジェクトa
に
クラスSuutitoMoji型のオブジェクトbの格納しているデータを代入する
a=b;
を実行してみます
通常
クラスSuutitoMoji型のオブジェクトa
に
クラスSuutitoMoji型のオブジェクトbの格納しているデータを代入する
a=b;
を実行したとき
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xの格納している数値データ1
が
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.xに代入され
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.i
に格納されているアドレスが
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.i
に代入されます
さて
ここで
😊うまい具合に😊
代入演算子=のオーバーロード
を実行すれば
a=b;
を実行したとき
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.x
には
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xの格納している数値データ1
が代入されて
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iには
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iに格納されているアドレスが
🌞代入されないようにすることもできます🌞
」
マックス「なにぃ
a=b;
を実行したとき
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.x
には
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xの格納している数値データ1
が
🌞代入されて🌞
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iには
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iに格納されているアドレスが
🌞代入されないようにすることができる🌞のか???
なんだ?
なんで?
なにがしたい?
なんか
トリッキーなかんじだな
そんなことができるのか?
かなり難しくないか?」
ソーラー「できるんだな~
代入演算子=のオーバーロードを実行すれば
代入演算子=
の機能を変更することができるんだけど
代入演算子=のオーバーロードの定義をうまく設定して
a=b;
を実行したとき
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.x
には
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xの格納している数値データ1
が代入されて
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iには
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iに格納されているアドレスが
🌞代入されないようにすることもできます🌞
そのオーバーロードの定義は難しくありません
では
なぜ
代入演算子=のオーバーロードを実行するのか?
どのようなときに
代入演算子のオーバーロードを実行するのか?
を
一緒に見ていきたいと思います
まず
次のクラスSuutitoMojiをご覧ください
👇
class SuutitoMoji{
public:
int x;
public:
char* i;
};
ソーラー「このクラスSuutitoMojiをもちいて
bのクラスSuutitoMoji型のオブジェクト宣言
SuutitoMoji b;
を実行してクラスSuutitoMoji型のオブジェクトbを作製し
生成される
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xに
b.x = 1;
により
1を代入したとします
そして
b.i = new char[50];
を実行することにより
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて
動的にメモリ領域を確保したとします
このとき
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iには動的に確保したメモリ領域の先頭のメモリのアドレスが
代入されることになります
そして
動的に確保したメモリ領域に文字列データを格納するには
strcpy_s関数を用いるのでしたね
strcpy_s(b.i,50, "にゃこ");
が実行されると
b.iによって動的に確保されたメモリ領域に
文字列データ
"にゃこ"
が格納されることになります
ところで
このとき
クラスSuutitoMoji型のオブジェクトaにクラスSuutitoMoji型のオブジェクトbを代入する
a = b;
を実行してみたいとおもいます
なぜ
クラスSuutitoMoji型のオブジェクトaにクラスSuutitoMoji型のオブジェクトbを代入する
a = b;
を実行する必要がある?と
みなさん
おもわれますか?」
マックス「それは(^^)/もちろん
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.xに
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xの格納している数値データ1を
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iに
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iの格納している動的に確保されたメモリ領域の先頭のメモリのアドレスを
代入するためだろう?
おっ
そうだ ひらめいた
だったら
a = b;
を実行しなくても
SuutitoMoji b ;
b.x = 1;
b.i = new char[50];
strcpy_s(b.i,50, "にゃこ");
のあと
SuutitoMoji a ;
a.x=b.x;
a.i=b.i;
を実行したらいいんじゃないか?」
ソーラー「そうですね
う~んん 実にいいアイデアですね
もちろんその通りです
もう解答が出ちゃったかな?」
マックス「にゃ??にゃんのこと?」
ソーラー「
ところで
次のように
クラスSuutitoMojiのメンバ変数が
24個あるとします
その時のクラスSuutitoMojiのクラス宣言はこんな感じです
👇
class SuutitoMoji{
public:
int c;
int d;
int e;
int f;
int g;
int h;
int j;(int i;はないです なぜなら char* iでiが使われているからです)
int k;
int l;
int m;
int n;
int o;
int p;
int q;
int r;
int s;
int t;
int u;
int v;
int w;
int x;
int y;
int y;
int z;
public:
char* i;
};
ソーラー「
このとき
このクラスSuutitoMojiを用いた
bのクラスSuutitoMoji型のオブジェクト宣言
SuutitoMoji b;
を行い
生成される
クラスSuutitoMoji型のオブジェクトbのメンバ変数
b.c
b.d
b.e
b.f
b.g
b.h
b.j
b.k
b.l
b.m
b.n
b.o
b.p
b.q
b.r
b.s
b.t
b.u
b.v
b.w
b.g
b.y
b.z
に
b.c=1;
b.d=2;
b.e=3;
b.f=4;
b.g=5;
b.h=6;
b.j=7;
b.k=8;
b.l=9;
b.m=10;
b.n=11;
b.o=12;
b.p=13;
b.q=14;
b.r=15;
b.s=16;
b.t=17;
b.u=18;
b.v=19;
b.w=20;
b.x=21;
b.y=22;
b.z=23;
を実行することにより
数値データ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
を
代入したとします
そして
b.i = new char[50];
を実行することにより
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて
動的にメモリ領域を確保したとします
このとき
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iには動的に確保したメモリ領域の先頭のメモリのアドレスが
代入されることになります
動的に確保したメモリ領域に文字列データを格納するには
strcpy_s関数を用いるのでしたね
strcpy_s(b.i,50, "にゃこ");
が実行されると
b.iによって動的に確保されたメモリ領域に
文字列データ
"にゃこ"
が格納されることになります
ここで
クラスSuutitoMoji型のオブジェクトa
に
クラスSuutitoMoji型のオブジェクトbを代入する
a=b;
を実行すれば
クラスSuutitoMoji型のオブジェクトaのメンバ変数
a.c
a.d
a.e
a.f
a.g
a.h
a.j
a.k
a.l
a.m
a.n
a.o
a.p
a.q
a.r
a.s
a.t
a.u
a.v
a.w
a.x
a.y
a.z
に
クラスSuutitoMoji型のオブジェクトbのメンバ変数
b.c
b.d
b.e
b.f
b.g
b.h
b.j
b.k
b.l
b.m
b.n
b.o
b.p
b.q
b.r
b.s
b.t
b.u
b.v
b.w
b.x
b.y
b.z
が代入され
クラスSuutitoMoji型のオブジェクトbのメンバ変数
b.c
b.d
b.e
b.f
b.g
b.h
b.j
b.k
b.l
b.m
b.n
b.o
b.p
b.q
b.r
b.s
b.t
b.u
b.v
b.w
b.x
b.y
b.z
が格納している
数値データ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
が
クラスSuutitoMoji型のオブジェクトaのメンバ変数
a.c
a.d
a.e
a.f
a.g
a.h
a.j
a.k
a.l
a.m
a.n
a.o
a.p
a.q
a.r
a.s
a.t
a.u
a.v
a.w
a.x
a.y
a.z
に代入されることになります
そして
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.i
には
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iが格納している(動的に確保されたメモリ領域の先頭のメモリの)アドレスが代入されることになります
a=b;
を実行すれば
簡単に
クラスSuutitoMoji型のオブジェクトbのメンバ変数が格納しているデータを
クラスSuutitoMoji型のオブジェクトaのメンバ変数に代入することができますね」
マックス「ふつうにそうだよなあ」
ソーラー「
クラスSuutitoMoji型のオブジェクトbのメンバ変数が格納しているデータを
クラスSuutitoMoji型のオブジェクトaのメンバ変数に代入するのに
a=b;
を実行するのでなく
SuutitoMoji b ;
b.x = 1;
b.i = new char[50];
strcpy_s(b.i,50, "にゃこ");
SuutitoMoji a ;
a.c=b.c;
a.d=b.d;
a.e=b.e;
a.f=b.f;
a.g=b.g;
a.h=b.h;
a.j=b.j;
a.k=b.j;
a.l=b.l;
a.m=b.m;
a.n=b.n;
a.o=b.o;
a.p=b.p;
a.q=b.q;
a.r=b.r;
a.s=b.s;
a.t=b.t;
a.u=b.u;
a.v=b,v;
a.w=b.w;
a.x=b.x;
a.y=b.y;
a.z=b.z;
a.i=b.i;
を実行する方法がありますが
とても手間ですね
そこで
a=b;
を実行するというわけです
この便利さが
a=b;
を実行する意味というわけだね
お話は変わって
ふたたび
最初に設定された
クラスSuutitoMojiをご覧ください」
👇
class SuutitoMoji{
public:
int x;
public:
char* i;
};
ソーラー「このクラスSuutitoMojiを用いて
bのクラスSuutitoMoji型のオブジェクト宣言
SuutitoMoji b;
を実行して
クラスSuutitoMoji型のオブジェクトbを生成し
b.x = 1;
により
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xに数値データ1を代入したとします
そして
b.i = new char[50];
を実行することにより
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて
動的にメモリ領域を確保したとします
このとき
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iには
動的に確保したメモリ領域の先頭のメモリのアドレスが
代入されることになります
動的に確保したメモリ領域に文字列データを格納するには
strcpy_s関数を用いるのでしたね
strcpy_s(b.i,50, "にゃこ");
が実行されると
b.iによって動的に確保されたメモリ領域に
文字列データ
"にゃこ"
が格納されることになります
このとき
クラスSuutitoMoji型のオブジェクトaにクラスSuutitoMoji型のオブジェクトbを代入する
a = b;
を実行すると
a.x=b.x;
a.i=b.i;
が実行されて
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.xには
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xが格納している数値データ1が
格納され
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iには
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iが格納しているアドレスが
つまり
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて動的に確保されたメモリ領域の先頭のメモリのアドレスが
格納されることになります
ところで
みなさん
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて動的にメモリを確保したのは
なぜだと思われますか?」
int(イント)「はいは~い😊
一般的にっ
動的にメモリ領域を確保するのは
メモリ領域に格納されたデータを利用したら
すぐに
動的に確保されたメモリ領域を解放して
コンピュータがそのメモリ領域を使用できるようにして
コンピュータが利用できるメモリ容量を増やすためなんでしょう
だから
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて動的にメモリ領域を確保したのは
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて
動的に確保されたメモリ領域に格納されたデータ
を利用したら
すぐに
動的に確保されたメモリ領域を解放して
コンピュータがそのメモリ領域を使用できるようにして
コンピュータが利用できるメモリ容量を増やすためなんでしょう😊」
ソーラー「そうなんです
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて
動的に確保されたメモリ領域に格納されたデータを
利用したら
コンピュータが利用できるメモリ容量をふやすため
すぐに
動的に確保されたメモリ領域を解放することになるのですが
そのとき
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて
動的に確保されたメモリ領域を解放する命令文は
delete b.i;
となります
delete b.i;
が実行されると
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.i自体p
は消去されませんが
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iによって動的に確保されたメモリ領域に格納された文字列データ
"にゃこ"
は
メモリ領域から消去されます
ですので
その解放されたメモリ領域は文字列データによって初期化されていないことになります
〇〇
通常
char*型のポインタ変数aを用いて
動的に確保されたメモリ領域を
delete a;
を実行して
解放すると
ポインタ変数a自体
は消去されませんが
ポインタ変数aを用いて
動的に確保されたメモリ領域に格納されたデータ
は消去されます
同様に
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて
動的に確保されたメモリ領域を
delete b.i;
を実行して解放する場合は
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.i
は消去されませんが
クラスSuutitoMoji型のオブジェクトbを用いて動的に確保されたメモリ領域に格納されているデータは消去されます
ですので
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iに格納されているアドレスのメモリを先頭とするメモリ領域に格納されている文字列データを表示する命令文
cout<<b.i<<"\n";
を実行しても
b.iによって確保されたメモリ領域には何もデータが代入されていないので(何らかのデータ情報は格納されています)
なんだかよくわからないデータが表示されることになります
(クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて
b.i = new char[50];
を実行し
動的に確保されたメモリ領域を
delete b.i;
を実行して解放する場合は
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iは消去されないので
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iが用いられた
cout<<b.i<<"\n";
を実行することはできます)
このとき
面白い現象がおこります
a,iにはb.iによって動的に確保されたメモリ領域の先頭のメモリのアドレスが格納されたままなので
cout<<a.i<<"\n";
を
実行すると
b.iによって動的に確保されたメモリ領域に格納されたデータが
表示されることになりますが
delete b.i;
により
b.iによって動的に確保されたメモリ領域に格納された文字列データ
"にゃこ"
は消去されているので
コマンドプロンプト画面には
にゃこ
ではなく
代わりに
b.iによって動的に確保されたメモリ領域にデータが代入されていないときのデータが
表示されることになります
そのことを示すプログラムはこちらです
👇
#include <iostream>
using namespace std;
class SuutitoMoji{
public:
int x;
public:
char* i;
};
int main() {
SuutitoMoji b;
b.x = 1;
b.i = new char[50];
strcpy_s(b.i, 50, "にゃこ");
SuutitoMoji a;
a = b;
cout << a.i << "\n";
cout << b.i << "\n";
delete b.i;
cout << a.i << "\n";
cout << b.i << "\n";
return 0;
}
ビルド実行結果
にゃこ
にゃこ
ンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンン^諏・D
ンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンン^諏・D
(👆どのような文字列データが表示されるかはメモリの使用状況により異なってきます)
ソーラー「このプログラムでは
bのクラスSuutitoMoji型のオブジェクト宣言
SuutitoMoji b;
を実行してクラスSuutitoMoji型のオブジェクトbを作製し
b.x = 1;
により
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xに1を代入しています
そして
b.i = new char[50];
を実行することにより
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて
動的にメモリを確保しています
このとき
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iには
動的に確保したメモリ領域の先頭のメモリのアドレスが
代入されることになります
動的に確保したメモリ領域に文字列データを格納するには
strcpy_s関数を用いるのでしたね
strcpy_s(b.i,50, "にゃこ");
が実行されると
b.iによって動的に確保されたメモリ領域に
文字列データ
"にゃこ"
が格納されることになります
このとき
クラスSuutitoMoji型のオブジェクトaにクラスSuutitoMoji型のオブジェクトbを代入する
a = b;
を実行すると
a.x=b.x;
a.i=b.i;
が実行されて
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.xには
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.xが格納している数値データ1が
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iには
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iが
つまり
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iには
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて動的に確保されたメモリ領域の先頭のメモリのアドレスが
格納されることになります」
マックス「
となると・・・
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて動的に確保したメモリ領域を
delete b.i;
を用いて
解放すると
b.iを用いて動的に確保したメモリ領域に格納された文字列データは
消去される・・・
そして・・・
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iは
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて動的に確保したメモリ領域の先頭のメモリのアドレスを格納しているので
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iを用いた
cout<<a.i<<"\n";
を実行した場合でも
コマンドプロンプト画面には
にゃこ
ではなく
代わりに
b.iによって動的に確保されたメモリ領域に文字列データが代入されていないときのデータ
ンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンン^諏・D
が
表示されることになるってわけか」
ソーラー「そうなんです
まあ 当然といえば
当然なんですが
delete b.i;
を実行して
b.iによって動的に確保されたメモリ領域が解放されるのはいいんですが
cout<<a.i<<"\n";
のビルド実行結果までが
にゃこ
から
ンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンンン^諏・D
になるのは
a = b;
を実行することにより
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.i
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.i
ともに
同じ
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.iを用いて動的に確保したメモリ領域の先頭のメモリのアドレスを
格納することになるからです
ここで
delete b.i;
を実行して
b.iによって動的に確保されたメモリ領域が解放されて
b.iによって動的に確保されたメモリ領域に格納された文字列データ"にゃこ"が消去されても
cout<<a.i<<"\n";
のビルド実行結果として
にゃこ
が表示されるようにするためには
a = b;
が実行されたとき
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.i
と
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.i
の格納しているアドレスが異なっていて
なおかつ
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iの格納しているアドレスのメモリを先頭とするメモリ領域に格納されている文字列データ
(クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iのアクセスするメモリ領域に格納されている文字列データ)
が
"にゃこ"
である必要があります
それなら
b.iによって動的に確保されたメモリ領域が解放されて
b.iによって動的に確保されたメモリ領域に格納された文字列データ"にゃこ"が消去されても
cout<<a.i<<"\n";
のビルド実行結果として
にゃこ
が表示されることになります
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iの格納しているアドレスのメモリを先頭とするメモリ領域に格納されている文字列データ
(クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iのアクセスするメモリ領域に格納されている文字列データ)
が
"にゃこ"
であるようにするためには
やはり
a=b;
を実行して
a.i=b.i;
が実行されるようにすればいい・・・と思う?
a.i=b.i;
が実行されれば
a.i
に
b.iを用いて動的に確保したメモリ領域の先頭のメモリのアドレスが
代入されるので
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.iをもちいた
cout<<a.i<<"\n";
のビルド実行結果として
にゃこ
が表示されることになります
しかし
クラスSuutitoMoji型のオブジェクトbのメンバ変数
b.iを用いて
動的にメモリ領域を確保した後
クラスSuutitoMoji型のオブジェクトaに
クラスSuutitoMoji型のオブジェクトbを代入する
a = b;
を
実行しているのに
つまり
a.i=b.i;
が実行されているのに
クラスSuutitoMoji型のオブジェクトaのメンバ変数a.i
と
クラスSuutitoMoji型のオブジェクトbのメンバ変数b.i
の格納しているアドレスが異なっているようにすることは
ふつうはできないはずです
そこで
代入演算子=の機能に手を加える
代入演算子=のオーバーロードの登場というわけです」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます