構造体とクラスの違い。
Java には構造体というものはない。
Java のクラスと C++ のクラスは似ている。
ちなみに、C++ のクラスと C のクラスは別物で、そもそも概念が違うようだ。
C++ における構造体とクラスの違いは、以下のページに詳しく書かれている。
その他の参考資料:
- http://www.geocities.jp/ky_webid/ProgrammingPlacePlus/c/026.html
- http://www.geocities.jp/ky_webid/cpp/language/005.html
配列の要素数の取得方法の違い。
ローカル変数の戻り値に対する参照の違い。
Java の場合、あるメソッド内部のローカル変数が、そのメソッドの戻り値として返されても、メソッドを呼び出した側は、受け取った変数を参照することができる。
public static String getString() {
String str = "Value of local variable";
return str;
}
public static void main(String[] args) {
String str = getString(); // strを参照できる。
}
しかし、C++ では以下のように記述すると、関数の呼び出しが終わった時点で、たとえ戻り値の参照をコピーしようとしても、値は参照できないようだ。
char * getString() {
cha str[] = "Value";
return str;
}
int main() {
char * str = getString(); // strを参照できない。
}
コンパイルしようとすると、「関数がローカル変数のアドレスを返しています」というエラーメッセージ*1が出力される。
参照できるようにするためには、以下のように書く必要があるっぽい。
char * getString() {
cha * str;
str = (char*) malloc(strlen("Value") + 1);
strcpy(str, "Value");
return str;
}
int main() {
char * str = getString(); // strを参照できる。
}
参考資料:
- プログラミング zroff 警告: 関数がローカル変数のアドレスを返しています - 変更
- C++ compiler warning - returning local variable - Stack Overflow
- Since I can't return a local variable, what's the best way to return a string from a C or C++ function? - Stack Overflow
*1:英語だと"reference to local variable 'str' returned"というエラーメッセージ。
クラスの拡張方法の違い。
Java だと、これで問題なく拡張できる。
public class Base {
}
public class Sub extends Base {
}
C++ の場合、以下のように書いても拡張できるようだが、親クラスと子クラスの変数に対する参照が入れ替わったりして、おかしな事になったりする。
class Base {
}
class Sub: public Base {
}
この問題を避けるためには、デストラクタ*1に virtual を付けて定義する必要があるようだ。
class Base {
Base() {
}
virtual ~Base() {
}
}
class Sub: public Base {
}
参考資料:
- C++では基底クラスにvirtualデストラクタを書こう - *「ふっかつのじゅもんがちがいます。」withぬこ
- 2004年1月4日の朝日新聞のACCS関連記事について, Hi-MD, MozillaFirebirdで複数ホームページ設定, マンコ, typeid(), tdiarygrep - 今日のなんでやねん(2004-01-09)
- http://www.geocities.jp/ky_webid/cpp/language/009.html
- http://www.geocities.jp/ky_webid/cpp/language/024.html