読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

ポインタの例でswapをやるのはポインタの分かり難さを助長してる気がする

講座的なサムシングに向けてちょっと思ったので。まぁポインタ迄やるか、そもそもC++までやるかは正直よく分からないのですが。
C言語でポインタの例でよく例題として扱われるのが値の交換を行う所謂swapの実装です。

void swap(int *a, int *b) {
  int temp = *a;
  *a = *b;
  *b = temp;
}

まぁ多分こんな感じになるんでしょうが、これ、凄く分かりにくいがするんです。先ず、引数の型宣言と参照剥がしの構文がぱっと見同じなところが諸悪の根源な気がします。int *の*がintのポインタの型で、*aの*ってのはintのポインタの参照を剥がしてるって分かりにくすぎます。なんというか、ここがこんがらがって分からんってことになってる気がするんですよね。あとは*があったりなかったりしてややこしいとかですね。
さて、われらがC++でもポインタと無縁ではいられません。ポリモーフィズムとかを実現したくなったときには嫌でもポインタを扱わざるを得ないでしょう。

class base {
 public:
  virtual ~base() {}
  virtual void hoge() {}
};

class derived : public base {
 public:
  virtual void hoge() {}
}

int main() {
  std::unique_ptr<base> p(new derived());
  p->hoge();
  return 0;
}

しかしそのときでもまずnewは作ったオブジェクトのポインタを返すってのをやって継承をやって、仮想デストラクタして、virtualをやって、派生クラスのポインタは基底クラスのポインタにぶち込めることをやるとします。このときポインタはunique_ptrとなっていることで*よりも型としては分かりやすくなります。そしてポインタのときはメンバアクセスに->を使うってことを覚えればいいだけなので、swapの時の様に構文的に頭がこんがらがるってことがない気がします。そして何よりも、swapのような退屈な例と違って、動的多態による楽しい現象を見ることが出来るので興味面でも惹きつけられるられる気がするのです。惹きつけられればあとは勝手にどんどんやって覚えてくれると信じてます。
まぁ、なんというか、ポインタをC言語時代の、変数のアドレスを使っていろいろなことをするってのは上級者向けってことで放置しておいてもいい気がするんですよね。多分swapはそっち方面に進むための第一歩な気がするのです。それをやるのは今ではある程度熟達してきてからでいいんじゃないですかね。ポインタクソいから無理やーって人を出さないためにもなんとかしないととか思うわけです。
[追記]仮想デストラクタを何故か書いてなかったのに気づいたので慌てて追記しました。