thisとthat

高木です。こんにちは。

C++のコードを書いていて、以前からときどき気になることがありました。

上のようにクラスのコピーコンストラクタを書くとき、上記では src としている仮引数の名前を that にしたいなあと思うことがあるのです。

自身を指すポインタが this ですから、相手側を that にすると、何となく収まりがいいような気がしてきます。
ところが、ここで残念なことに気づきます。

this はポインタであるのに対して、that は参照です。
クラスのメンバー(仮に member としましょう)にアクセスするには、this->memberthat.member のように、矢印演算子とドット演算子を使い分けないといけません。
C#やJavaならこんなことはないのですが、C++では全然美しくならないので、このアイデアはいつもボツになるのです。

と、ここまでは前振りで、今日はプログラミングの話題ではないのです。
たまには(私としては得意でも何でもない)英語の話題を取り上げてみようと思います。

thisとthatというのは英語の指示代名詞です。
中学校で最初に英語を習ったとき、thisは「これ」、thatは「あれ」のような訳がついていて、それがそもそものケチの付きはじめでした。

私は大学のころ、趣味でいろいろな言語をかじりました。
ここでいう「言語」は、プログラミング言語ではなく自然言語です。
その過程で、先ほどのthisは「これ」、thatは「あれ」が誤りだということに気づいたのです。
本当はせめて高校生ぐらいのときに気づくべきだったのでしょうが、英語がそんなに得意ではなかった私には無理でしたね。

中学校では、さらに混乱を助長するかのようにitに「それ」という訳をつけ、あたかも日本語の指示代名詞に一対一で対応するかのような印象を植え付けられてしまいました。
実際には、日本語と英語はまったく別の言語であり、そんな都合のいい対応ができるはずがありません。

英語をはじめとする印欧語族の指示代名詞は、日本語のように近称、中称、遠称の3段階ではなく近称と遠称の2段階しかありません。
だから、英語の指示代名詞はthisとthat、そしてそれらの複数形であるtheseとthoseしかないのです。

ではitは何かというと、これは指示代名詞ではなく人称代名詞ですね。
だから、I、you、he、sheなどと同じ仲間なのです。

歴史的な事情もあって英語の場合は分かりにくくなってしまっていますが、印欧語族は文法上の性があるのが普通です。
ドイツ語やロシア語、ラテン語などは、男性、女性、中性のどれかの性を持つのです。
(3人称の)人称代名詞にせよ指示代名詞にせよ、それが指す名詞の性によって、代名詞も変わってくるのです。

実は英語にも文法上の性があって、現在ではほとんど失われかけているようですが、まったく無いわけではありません。
私が中学校のときは、shipを指すにはsheを使うように教わりました(実際にはそんなに徹底されているように思いませんが)。
このように、無生物であっても文法上の性があるのです。
ちなみに、古英語のscip(現代英語のshipに相当)は中性名詞だったようですけどね。
ここまで見てくると、itが中性の人称代名詞だということが見えてきます。
決して指示代名詞の「それ」ではなかったのです。

ところで、ラテン語の指示代名詞にも近称と遠称があり、また男性、女性、中性という文法上の性があります。
それだけではなく、指示代名詞なのに一人称、二人称、三人称が分かれているのです。
さらに、主格、属格、与格、対格、奪格と格変化します。
もちろん、単数形と複数形があります。

ラテン語をルーツとするロマンス語派の諸言語(イタリア語、スペイン語、フランス語など)は、文法上の性は男性と女性だけになってしまい、格変化もずいぶん失われています。
ましてや、指示代名詞の人称なんかはすっかりなくなっていますね。
世界中の言語の傾向として、古代語というのはかなり複雑ですが、現代に近づくにつれて、文法が整理されて単純になっていくようです。

というわけで、取り留めのない話になってしまいましたが、たまには中学校や高校で習ったことを疑ってみるのも悪くありません。
コーディングでは英語を使うことも多いですが、ときにはこういうことも考えるといい気分転換になりますよ。