基本的な言語機能②の勉強メモのつづき。
#クラス
「構造多+メンバー関数」的なものと理解した。つまり、クラスはデータに関連した処理もまとめて扱うことができる。インスタンス化等の用語は省略。
##アクセス指定子とメンバー関数
アクセス修飾子で、メンバー変数やメンバー関数に対して、クラスの外側から(インスタンスから直接呼べるか否か)アクセスできるかどうか設定できる。privateで非公開、publicで公開
具体的なメンバー関数の書き方は以下。今回はclass Aに関して、メンバー変数xの値を読み込むgetterと書き込むsetterを例にする。
書き方の構造として、メンバー関数はクラスの”内側”に書くのではなく、「クラス名::メンバー関数」としてクラスの外側で書くことに注意(追記:コメント参照「別に宣言と定義を同時に書くこともできるので違う」)
//Aクラス
class A{
int x//メンバー変数
//メンバー関数(getter/setterを作る)
public:
int get_x();//xのgetter
void set_x(int new_x)//xのsetter
}
//メンバー関数(getter)
int A::get_x(){//書き方注意
return x;//離れてると思ったメンバー変数にアクセスできるよ!
}
//メンバー関数(setter)
void A::set_x(int new_x){
x = new_x
}
#参照
変数に別名をつける行為といえる。
int& reference = value //変数valueへの参照
##ポインタとの違い
ポインタは変数の場所をアドレスとして保存する機能だった。また、ポインタは後から別の変数のポインタを再定義することとが可能だったが、参照は、初期化時に指定した変数以外への参照を変更することはできない。
参照型に何か別の変数を代入処理しても、参照型変数そのもののアドレスは変化しないことに注意。
int v1 = 1;
int v2 = 0;
int* pointer = &v1;//v1のポインタ
int& reference = v1;//v1の参照
//この時点で...
//pointerも&referenceもv1と同じアドレス
//*pointerの値は1, referの値も1
pointer = &v2;//pointerが持つアドレスをv2のアドレスへ変換
reference = v2;//参照先をv1からv2へ変換したつもり
//この時点で...
//pointerアドレスはv2のものに変更される、&referenceはアドレスに変化なし
//*pointerの値は0,referenceの値も0
##const参照
constな変数を、参照を通して変更されても困るので、この場合もconstつけてconst参照にする。
#型推論
autoを付けて、変数宣言時にinitial値からその型を使って変数を宣言するようにコンパイラに指定する。あたりまえだけど、型推論の参考となる右辺初期値が無いとコンパイルエラー。
int one(){
return 1;
}
int main(){
auto i = one();//こんな場合でもiはint型と推論される!
}
配列(ブレースを使った配列の)の型推論は行わない(List型が得られたり、推測される型が要素数で変わるため)
#エイリアス
型に別名を付けることができる。
using integer = int //int型に新しい名前integer
メンバ関数の定義としては、戻り値の型も含めてクラスの内側なので、seisu型がそのまま使えていることに注目。
#include <iostream>
class data {
public:
using seisu = int;//クラスの中で使う整数の別名
seisu get_value();
void set_value(seisu new_value);
private:
seisu value;
};
//getter関数(::は名前解決で使い、メンバ関数の定義でも使う
data::seisu data::get_value() {//クラス外からのアクセスなので、名前解決する
return value;
}
//setter関数
void data::set_value(seisu new_value) {
seisu tmp = new_value;//メンバ関数の中もクラスという扱いなので、seisu型そのまま使える
value = tmp;
}
int main()
{
data d;
using seisuti = data::seisu;//さらに別名を押し込むことも可能
seisuti value = 100;
d.set_value(value);//つまりここのvalueは data::seisu => int型
std::cout << d.get_value() << std::endl;
}