量産メモ帳

忘れっぽいのでメモを残しています。

構造体とクラスの違い。

Java には構造体というものはない。
Java のクラスと C++ のクラスは似ている。
ちなみに、C++ のクラスと C のクラスは別物で、そもそも概念が違うようだ。


C++ における構造体とクラスの違いは、以下のページに詳しく書かれている。



その他の参考資料:


配列の要素数の取得方法の違い。

Java の場合はこんな感じになる。


int[] array = new int[] {1,2,3,4,5,6,7,8,9,10};
int arraySize = array.length;



一方、C++ の場合はこんな感じになるようだ。


int array[] = {1,2,3,4,5,6,7,8,9,10};
int arraySize = sizeof array / sizeof array[0];



参考資料:


ローカル変数の戻り値に対する参照の違い。

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を参照できる。
}



参考資料:


*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 {
}



参考資料:


*1:C# にもあるが、Java にはない。