E D R , A S I H C RSS

Cpp에서의멤버함수구현메커니즘


1. 기를 담

  • 는 die메 다. 그런데. 되고 뻔뻔럽게 드를 . 떻게 된것? 다.

~cpp 

#include <iostream>
using namespace std;

class Foo{
public:
	int id;
	Foo(){
		static idSequance = 0;
		id = idSequance++;
		cout << "Create! id = " << id << endl;
	}
	void die(){
		cout << "I suicide. Id is " << id << endl;
		delete this;	//  
	}
	void sayMyId(){
		cout << "My Id is no " << id << endl;
	}
	void sayHello(){
		cout << "say Hello" << endl;
	}	
};


int main(int argc, char** argv)
{	
	cout << endl << ":::::: Case 1 - 동당 " << endl;
	Foo* foo1 = new Foo();// Create! 를 다.
	foo1->sayHello();		// Hello 력
	foo1->sayMyId();		// id 력
	foo1->die();		// 객 
	foo1->sayHello();		// 동 가능
	foo1->sayMyId();		// 동 가능
	

	// id 
	cout << endl << ":::::: Case 2 - id " << endl;
	Foo* foo2 = new Foo();// Create! 를 다.
	foo2->sayHello();		// Hello World 력
	foo2->sayMyId();		// id 력
	foo2->die();			
	foo2->sayHello();
	foo2->sayMyId();		
	
	cout << endl << ":::::: Case 3 -  NULL로 고 메기 " << endl;
	Foo* foo3 = NULL;		//   명보.		
	foo3->sayHello();		// Hello 를 다.
	//foo3->sayMyId();		// debug, release 모두 동  다. 
	//foo3->die();		// debug, release 모두 동  다.	

	cout << endl << ":::::: Case3 - " << endl;
	Foo foo4;
	foo4.sayHello();		// Hello World 력
	foo4.sayMyId();		// id 력
	foo4.die();		// debug mode assertion error
	foo4.sayHello();		// release  가능
	foo4.sayMyId();		// release  가능
	cout << endl;

	return 0;
}
결과는 다과 같 력됩다. 보면, 보고 는다면 .
~cpp 
:::::: Case 1 - 동당
Create! id = 0
say Hello
My Id is no 0
I suicide. Id is 0
say Hello
My Id is no 3604872

:::::: Case 2 - id 
Create! id = 1
say Hello
My Id is no 1
I suicide. Id is 1
say Hello
My Id is no 3604872

:::::: Case 3 -  NULL로 고 메기
say Hello

:::::: Case3 - 
Create! id = 2
say Hello
My Id is no 2
I suicide. Id is 2
say Hello
My Id is no 2

Press any key to continue

2. 각각 따른

2.1. Case1 - 동

~cpp 
	Foo* foo1 = new Foo();	// Create! 를 다.
	foo1->sayHello();		// Hello World 력
	foo1->sayMyId();		// id 력
	foo1->die();		// 다.	
	foo1->sayHello();		//  된다?
	foo1->sayMyId();		// ..--;

2.2. Case2 - NULL로 고 메

~cpp 
	Foo* foo2 = NULL;		//  명보.		
	foo2->sayHello();		// Hello 를 다.(--;)
	foo2->sayMyId();		// debug, release 모두 동  다. 
	foo2->die();		// debug, release 모두 동  다.	

2.3. Case3 -

~cpp 
	Foo foo3;
	foo3.sayHello();		// Hello World 력
	foo3.sayMyId();		// id 력
	foo3.die();		// debug mode assertion error
	foo3.sayHello();		// release  가능
	foo3.sayMyId();		// release  가능

DeleteMe 렇게 보는 것 만, 것 같다. --NeoCoin

3.

" 명=드"를 다.

C++는 기 C OOP를 는 것다. 로 OOP 드를 다. OOP를 C 다.

게 보드를 는 C++ 배경 다.
  • 로, C++ 다.
  • 로, 된 멤 는 것 보겠다.
  • 로, 다.

3.1. C++ 다.

러가 되다고 가다. 리가 class를 려면 로그램 class Data 들 는 "class " 보를 담 다.
~cpp 
class Foo{
public:
    int id;  // <-  다.
};
C++ Strong typed language 므로 모든 되고, 되는 것 다. 는 다과 같 다.
~cpp 
Foo foo4; 
new 드로 는 runtime class instance 를 다. 로그램 id가 int 라는 보를 담는 class "class " 보를 담는 곳 다.

기까가, class struct 드가 는 동 다. 그리고, class 는 몇가 는데, 그 나가 foo 를 member 는가 다.

그러나, 리는 보를 든, new 로 type 보고 고, 는 부 다. 그리고 는데 다.

class instance vpt, pointer 보가 더 들 다. 그러나 다. 둘

3.2. instance 된 멤 다.

리는 다. 리는 member 드를 가리 로 모두 교다. 그리고 로 돌다.

C++ 과, instance된 멤 가리 다. 과 멤 드는 모두 동 방법되고, 모두 동 다.

라면, 다.
라면 각각 instance 떻게 는가?

리냐 면,
~cpp 
class Foo{
public: 
	int id;
	void sayMyId(){
		cout << "My Id is no " << id << endl;
	}
};
라는 는 각 instance id 라는 다.
그러나 ~cpp Foo::sayMyId() 무런 드가 된다면, id 라는 다.

C++ 를 class 당 class 를 묵 다. ,
~cpp 
Foo:sayMyId()
라는 드가 될때 러가
~cpp 
Foo:sayMyId(Foo* x)
라는 고, 록 만듭다. 그리고, 다면 ~cpp Foo*
~cpp 
foo1->sayMyId(foo1);
드를 다.

C++ 로 C OOP를 구다.

. class내 static 멤 고 instance 때 instance 가 됩다. static 면 묵로 pointer 를 다.

런 배경 로 다다.

3.3. 다.

과 같 드를 면,
~cpp 
	Foo* foo1 = new Foo();	// Create! 를 다.
	foo1->sayHello();		// Hello 력
	foo1->sayMyId();		// id 력
	foo1->die();		// 객 
	foo1->sayHello();		// 동 가능
	foo1->sayMyId();		// 동 가능

렇게 나다.( )

~cpp 
Create! id = 0
say Hello
My Id is no 0
I suicide. Id is 0
say Hello                    // 객 (delete this)  드
My Id is no 3604872          // 객 (delete this)  
렇게 나다. (C++ 빼고) 되는 부, 두가 ~cpp sayHello() sayMyId() 다. 둘 member 는 메 다면
~cpp 
sayHello() -> sayHello(Foo*)
sayMyId() -> sayMyId(Foo*) 
된다는 것 다. 만 두 는 다른 다.

sayHello()는 instance variable 는다는 것고, ~cpp sayMyId()다는 .

따라, 메모리를 (?) 리고 난 당 instance 부 보리 id가 다과 같 게 나.
~cpp 
say Hello                    객 (delete this)  드
My Id is no 3604872          객 (delete this)  
instance 던 메모리는, 당 process 메모리로 돌, 다. delete this 당 instance 떻게 ""느냐 따라, 로 다르게 나다.
그리고
~cpp 
delete x
라는 드는 x 다. 변 다. 는 call by value 로 x NULL로 변경, 드가 경기 때문, 변 다.

러가, 메모리를 system로 반 다면, 다 access 러가 나겠. 다.

foo2~3 배경 결과를 는 보 다.

foo2는 C++ . (foo3 만)
~cpp 
	Foo* foo2 = NULL;		//   명보.		
	foo2->sayHello();		// Hello 를 다.
결과는
~cpp 
say Hello
과 같 다.
~cpp 
Foo::sayHello(foo2)  -> Foo::sayHello(NULL)
된것고, sayHello 내는 pointer 값 NULL 므로 무런 러가 발 다.

OOP 고로 instance가 므로 가능 만, 다. C++ 당 instance 무를 검 다. 검 . NULL 0 라는 pointer 값 .

4.

  • C++ class 때 멤 당 class instance pointer 로 묵되고 된다.
  • pointer 는다.

5. 덧붙 Java 드를 봅다.

instance 무를 검는 Java 드를 봅다.
~cpp 
// Main.java file
class Foo{
	public int a;
	void sayHello(){
		System.out.println("Hello");
	}
}
public class Main {
	public static void main(String[] args) {
		Foo foo= null;
		foo.sayHello();
	}
}
면, 다과 같 exception 다. Java Language Specification 2nd (3rd가 .) jvm specification .
( null 값고, instance pool instance를 pointer를 는 것로 기다. )
~cpp 
java.lang.NullPointerException
	at Main.main(Main.java:19)
Exception in thread "main" 

C++는 NULL 드로 고, 0 라고 기 때문가능다.그러나 vm 그래 모두 null 드가 고 검가 가능다.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:02
Processing time 0.0293 sec