-
C++와 Java의 유사점과 차이점
1. 포인터 ★★★★★
C C++의 포인터는 뛰어난 유연성을 제공하지만 유연성으로 인해 포인터가 잘못 작동하면 메모리 누수나 포인터 매달림과 같은 문제가 쉽게 발생할 수 있습니다.
Java는 포인터를 취소합니다. 하지만 실제로는 자바에서 선언된 모든 참조 데이터 타입의 이름은 포인터로 이해될 수 있다. 이름은 스택 메모리에 저장되며 메모리에서 new가 연 공간을 가리킵니다.
좋다:
int[] 배열 = 새로운 int[10]
정수 배열 이름 array는 스택 메모리에 있고, 힙 메모리에는 10*4바이트 공간이 열리고, array는 메모리 블록을 가리킨다.
배열은 포인터로 이해될 수 있으며, 배열에 저장된 주소는 new가 생성한 공간입니다.
좋다:
클래스 사람{
…
}
사람 p = 새로운 사람();
객체 이름 p는 스택 메모리에서 열리고 new는 객체에 대한 힙 메모리 공간을 여는 데 사용됩니다. 객체 이름 p는 힙 메모리를 가리킵니다.
그러나 사실 이 이름은 특히 매개변수를 전달할 때 C++의 포인터와는 다릅니다.
Java는 매개변수 전달이 모두 값에 의한 것이라고 명시했습니다.
그러나 참조 데이터 유형이 함수 매개변수로 사용될 때 선언된 객체 p1이 전달되면 실제로 p2 객체의 복사본이 생성됩니다. 이 p2는 p1을 가리키므로 p1부터 p2까지의 멤버를 호출할 때 수정하고, 함수 호출이 완료될 때까지 기다린 후 수정 사항을 유지합니다. 좋다:
클래스 사람{
공개 문자열 이름;
공개 연령 ;
public Person(문자열 이름, int 나이){
this.name = 이름;
this.나이 = 나이;
}
}
공개 클래스 테스트{
공개 정적 무효 메인(문자열[] 인수){
Person p = new Person("장산", 10);
System.out.println("수정 전-->이름: "+p.name+", 나이: "+p.age);
changePro(p); //객체 p가 전달되고 p의 복사본이 p를 가리키는 것으로 가정합니다. //이 복사본 p1을 통해 p의 멤버를 호출할 수 있습니다.
System.out.println("수정 후-->이름: "+p.name+", 나이: "+p.age);
}
public static voidchangePro(Person p){ //복사본을 통해 원본 객체의 멤버를 호출할 수 있습니다.
p.name = "이영";
페이지 연령 = 30;
}
}
결과:
수정 전-->이름: Zhang San, 나이: 10
수정 후-->이름: 리시, 나이: 30
하지만 p1을 전달하면 p2의 복사본이 생성되고 p1에서 p2까지 포인팅을 변경하려는 시도는 당연히 불가능합니다. 이때 함수 호출이 완료된 후에는 p2의 포인팅만 변경됩니다. p1의 값은 변경되지 않습니다. 좋다:
클래스 사람{
공개 문자열 이름;
공개 연령 ;
public Person(문자열 이름, int 나이){
this.name = 이름;
this.나이 = 나이;
}
}
공개 클래스 테스트{
공개 정적 무효 메인(문자열[] 인수){
Person p = new Person("장산", 10);
System.out.println("수정 전-->이름: "+p.name+", 나이: "+p.age);
changeObj(p); //p의 복사본인 객체 p가 전달됩니다. p를 가리키는 p1이라고 가정합니다. //함수에서는 이 복사본의 포인터만 변경됩니다.
System.out.println("수정 후-->이름: "+p.name+", 나이: "+p.age);
}
public static Person newP = new Person("lee思", 30);
public static voidchangeObj(Person p){
p = newP; //포인터를 변경하려고 시도하지만 실제로 변경되는 것은 복사본의 포인터입니다.
//함수가 끝난 후에도 원래 객체의 포인팅은 변경되지 않습니다.
}
}
결과:
수정 전-->이름: Zhang San, 나이: 10
수정 후-->이름: Zhang San, 나이: 10
2. 동적 메모리 할당
C++에서는 메모리를 동적으로 할당하고 재활용하는 데 new와 delete가 사용됩니다. new는 메모리를 사용한 후 메모리를 재활용하기 위해 수동으로 사용해야 합니다.
Java에서 참조 데이터 유형이 선언되어 있는 한, 사용하기 전에 메모리 공간을 확보하기 위해 new를 사용해야 합니다. 그러나 개체가 죽은 후에는 수동으로 메모리를 회수할 필요가 없습니다. Java의 자체 메모리 재활용 메커니즘은 쓰레기 개체를 자동으로 재활용합니다(소위 쓰레기 개체는 이전에 열린 개체 메모리를 참조하며 더 이상 스택 메모리에서 참조되지 않음). 물론 System.gc() 메서드를 통해 수동 재활용도 수행할 수 있습니다.
3. 소멸자
C++ 소멸자(매개변수 없음, 반환 값 없음)의 기능은 생성자에서 동적으로 할당된 메모리 공간을 해제하는 것, 즉 호출하는 것입니다(이 호출은 객체 소멸자를 통해 호출할 수 있거나 시스템이 자동으로 대기할 수 있음). 객체 수명이 종료됩니다.) 소멸자를 호출합니다.
Java에는 소멸자가 없으며 가비지 개체는 가비지 수집 메커니즘을 통해 자동으로 재활용됩니다. 그러나 Object 클래스의 fanalize() 메서드를 재정의하면 C++의 소멸자와 동일한 효과를 얻을 수 있습니다. 개체가 수동 또는 자동으로 소멸되면 fanalize() 메서드가 자동으로 호출됩니다.
4. 빈 클래스의 내용
C++의 빈 클래스에는 기본 생성자, 기본 소멸자, 기본 복사 생성자의 4가지 함수가 있어야 합니다.
Java의 빈 클래스에는 기본 생성자, Object 클래스에서 상속된 메서드가 포함됩니다.
클래스의 기본 속성 C++ 클래스에는 공개>보호>비공개의 세 가지 유형의 멤버 액세스 권한이 있습니다. 선언되지 않은 경우 기본 권한은 비공개입니다.
Java 클래스에는 공개>보호>기본>비공개의 네 가지 유형의 구성원 액세스 권한이 있습니다. 기본값은 기본 권한입니다.
5. 클래스에서 멤버 함수 구현
C++에서는 관례입니다. h 함수는 클래스 외부의 헤더 파일의 클래스에서 선언됩니다. cpp 파일에 함수를 구현하려면 헤더 파일을 #include합니다.
좋다:
//demo.h
클래스 사람{
공공의:
Void fun(); //클래스에 선언됨
}
//demo.cpp
#“demo.h”를 포함합니다
Void Person::fun(){ //외부 클래스 구현
. . . . //구현체
}
Java는 클래스의 선언 + 구현 방법입니다. 클래스에서 구현되지 않은 경우 abstract 키워드를 추가하는 것은 추상 메서드입니다.
좋다:
클래스 사람{
Public void fun(){//선언 + 클래스 구현
. . . . //구현체
}
}
6. 객체 인스턴스화
클래스 사람{
사적인:
나이;
공공의:
사람(){}
사람(int a){
나이 = ;
}
무효 재미(){….}
}
. . . . //메인 함수 시작
Person p1; //매개변수가 없는 생성자가 호출됩니다.
Person p2(18); //매개변수화된 생성자를 호출합니다.
p1.fun(); //멤버 함수 호출
p2.fun();
Java에서 객체를 인스턴스화하려면 new 키워드를 사용해야 합니다.
클래스 사람{
개인 문자열 이름;
비공개 연령 ;
공개 개인(){}
public Person(문자열 이름, int age){
this.name = 이름;
this.나이 = 나이;
}
공개 무효 재미() {…..}
}
. . . . . //메인 함수 시작
사람 p1 = null ;
p1 = new Person(); //메모리 공간을 열고 매개변수 없는 생성자를 호출하려면 new 키워드를 사용해야 합니다.
Person p2 = new Person("Zhang San", 18); //매개변수화된 생성자를 호출합니다.
p1.fun(); //메소드 호출
p2.fun();
7. 이 키워드
C++에서는 this 포인터라고 합니다. 객체가 인스턴스화되면 기본적으로 이 객체를 가리키는 포인터가 생성됩니다. 이는 동일한 클래스의 다른 객체를 구별하기 위해 컴파일러에서 사용됩니다. 즉, 객체로서. 멤버 함수를 사용할 때 this 포인터를 통해 어떤 객체인지 알 수 있고, 멤버 함수를 호출해 객체의 멤버 속성을 조작할 수 있다.
이는 Java에서 세 가지 용도로 사용됩니다.
1. 이 클래스의 특성이나 메서드를 나타냅니다. 이와 같은. 방법은 이것이다. 재산.
2. 현재 객체를 나타냅니다.
3. 이 클래스의 생성자 메서드를 호출합니다. this(), this(매개변수 1, 매개변수 2...) 등이 있습니다.
[사용 1과 2의 함수는 C++의 this 포인터와 유사합니다. ]
8. 객체 멤버 호출
C++에서는 객체를 전달합니다. 호출할 멤버 함수 또는 클래스 포인터->멤버 함수입니다.
Java에서는 객체만 전달할 수 있습니다. 멤버 함수 호출.
두 가지의 Static 속성 멤버는 클래스 이름을 통해 직접 전달될 수 있습니다. 멤버 함수는 직접 호출됩니다.
9. 하위 클래스-->상위 클래스, 생성자가 전달한 매개변수에는 공통점이 있습니다. 하위 클래스의 생성자가 호출할 상위 클래스의 생성자를 명확하게 나타내지 않으면 시스템은 기본적으로 상위 클래스의 매개변수 없는 생성자를 호출합니다. 수업. 동시에 상위 클래스가 매개변수가 있는 생성자를 정의하는 경우 매개변수 없이 생성자를 정의하는 것이 가장 좋습니다.
클래스 사람{
사적인:
나이;
공공의:
사람(){}
사람(int a){
나이 = ;
}
}
클래스 학생: public Person{
사적인:
정수 점수 ;
공공의:
Student(int a, int s):Person(a){ //부모 클래스 생성자에 전달
점수 = s;
}
}
클래스 사람{
개인 문자열 이름;
비공개 연령 ;
공개 개인(){}
public Person(문자열 이름, int age){
this.name = 이름;
this.나이 = 나이;
}
}
클래스 Student 확장 Person{
개인 정수 점수;
public Student(문자열 이름, int age, int 점수){
super(name,age); //부모 클래스 생성자로 전달
this.score = 점수;
}
}
10. 다형성
C++의 다형성은 [가상 함수 또는 순수 가상 함수 + 가상 함수 또는 순수 가상 함수의 하위 클래스 적용 범위]를 통해 달성되어야 합니다.
가상 함수는 virtual로 선언됩니다.
좋다:
virtual void fun(); //클래스 내 선언
무효 클래스 이름: fun() {….}//클래스 외부 구현
Java는 서브클래스를 사용하여 일반 부모 클래스의 일반 메서드를 재정의하고, 서브클래스를 사용하여 추상 클래스의 일반 메서드나 추상 메서드를 재정의하고, 서브클래스를 사용하여 인터페이스의 추상 메서드를 재정의합니다. +위로 변신합니다.
추상 메서드는 abstract로 선언되며 콘텐츠 구현이 없습니다.
좋다:
abstract void fun(); //클래스 내에 구현이 없습니다.
11. 추상 클래스 추상 클래스 모두 객체를 인스턴스화할 수 없습니다. 순수 가상 함수와 추상 메서드는 비슷한 개념과 비슷한 기능을 가지고 있습니다.
C++에는 순수 가상 함수를 갖는 클래스인 추상 클래스가 있다고 말할 수도 있습니다.
순수 가상 함수는 콘텐츠 구현이 없고 "=0"인 가상 함수이며 개체를 인스턴스화할 수 없습니다.
좋다:
virtual void fun() = 0; //클래스 내에서는 =0으로 선언되어 있으며, 클래스 외부에서는 구현되지 않습니다.
Java의 추상 클래스는 abstract 키워드로 선언된 클래스이며 추상 메소드를 포함합니다. 개체를 인스턴스화할 수 없습니다.
Java의 인터페이스는 특수 클래스 또는 특수 추상 클래스입니다. 모든 정적 상수와 추상 함수로 구성됩니다.
12. 접근권한
C++에서는 세 가지 상속 방법을 사용하여 하위 클래스와 상위 클래스 간의 멤버 액세스 권한을 변경합니다.
클래스 학생: public Person{
공공의:
. . . . . .
사적인:
. . . . . .
};
클래스 작업자: 보호된 사람{
공공의:
. . . . . .
사적인:
. . . . . .
};
클래스 농부: 개인 개인{
공공의:
. . . . . .
사적인:
. . . . . .
};
Java는 패키지 메커니즘을 통해 서로 다른 클래스 간의 멤버에 대한 액세스 권한을 구현합니다.
패키지 org.tyut.a
클래스 사람{
사적인…..
사적인……
공공의…….
공공의…
}
패키지 org.tuyt.b
클래스 사람{
사적인…..
사적인……
공공의…….
공공의…
}
패키지 org.tuyt.c
클래스 사람{
사적인…..
사적인……
공공의…….
공공의…
}
13. C++ 전처리 & java 가져오기 패키지의 개념은 동일합니다. 현재 클래스가 아닌 다른 클래스를 사용하려는 경우,
C++에서는 클래스 정의 앞에 #include 사전 컴파일 지시문을 사용하여 포함할 클래스 라이브러리를 포함합니다.
표준 클래스 라이브러리는 h 없이 꺾쇠 괄호 < >를 사용합니다. 사용자 정의 클래스 라이브러리에서 h와 함께 큰따옴표 ""를 사용하면 현재 경로에서 먼저 검색됩니다.
좋다:
#include <iostream>
#“demo.h”를 포함합니다
Java에서는 사용하려는 클래스를 가져오려면 import 명령을 사용하고 클래스가 있는 패키지를 지정합니다.
좋다:
자바를 가져오다. 랭. *;
수입 조직. tyut. *;