어떻게 이해가 안 constructors work
되나요?
여기에 객체를 선언했습니다 obj2
. 그것은 abc()
완벽하게 괜찮은 constructor를 호출 합니다.
하지만 내가 할당 할 때
obj2 = 100
컴파일러가 클래스 객체에 정수 초기화를 허용하는 이유는 무엇입니까? 허용한다면 객체를 파괴하는 방법과 다른 매개 변수화 된 생성자를 호출하는 방법입니다.
이제 객체 destructor
가 있기 때문에 왜 한 번만 호출 two
됩니까?
하나는 더 컴파일러는, 내가이 한 의심 not doing anything
과 default constructor
기본 생성자는 왜 required
?
class abc{
public:
int a, b;
abc()
{a = 0; b = 0;}
abc(int x)
{a = x;}
~abc()
{std::cout << "Destructor Called\n";}
};
int main()
{
abc obj1;
cout << "OBJ1 " << obj1.a << "..." << obj1.b << "\n";
abc obj2;
cout << "OBJ2 " << obj2.a << "..." << obj2.b << "\n";
obj2 = 100;
cout << "OBJ2 " << obj2.a << "\n";
system("pause");
return 0;
}
output:
OBJ1 0...0
OBJ2 0...0
Destructor Called
OBJ2 100
쇼와 텔링을하고 모든 스페셜 멤버를 악기로 연주합시다 .
#include <iostream>
class abc{
public:
int a, b;
abc()
{ std::cout << "Default constructor\n"; a = 0; b = 0;}
abc(int x)
{ std::cout << "Int constructor\n"; a = x;}
abc(abc const& other): a(other.a), b(other.b)
{ std::cout << "Copy constructor (" << a << ", " << b << ")\n"; }
abc& operator=(abc const& other) {
std::cout << "Assignment operator (" << a << ", " << b << ") = (" << other.a << ", " << other.b << ")\n";
a = other.a;
b = other.b;
return *this;
}
~abc()
{std::cout << "Destructor Called\n";}
};
int main()
{
abc obj1;
std::cout << "OBJ1 " << obj1.a << "..." << obj1.b << "\n";
abc obj2;
std::cout << "OBJ2 " << obj2.a << "..." << obj2.b << "\n";
obj2 = 100;
std::cout << "OBJ2 " << obj2.a << "\n";
return 0;
}
그리고 우리는 이 출력 을 얻습니다 .
Default constructor
OBJ1 0...0
Default constructor
OBJ2 0...0
Int constructor
Assignment operator (0, 0) = (100, 0)
Destructor Called
OBJ2 100
Destructor Called
Destructor Called
따라서 라인 소스를 사용하여 조정 해 보겠습니다.
int main()
{
abc obj1;
// Default constructor
std::cout << "OBJ1 " << obj1.a << "..." << obj1.b << "\n";
// OBJ1 0...0
abc obj2;
// Default constructor
std::cout << "OBJ2 " << obj2.a << "..." << obj2.b << "\n";
// OBJ2 0...0
obj2 = 100;
// Int constructor
// Assignment operator (0, 0) = (100, 0)
// Destructor Called
std::cout << "OBJ2 " << obj2.a << "\n";
// OBJ2 100
return 0;
// Destructor Called
// Destructor Called
}
당신은 대부분 모든 것을 가지고 있습니다. 우리가 놀라움을 조사해 보겠습니다.
첫 번째 놀랍게도 obj2
나중에 값을 변경 하더라도 abc obj2;
선언 시점에서 여전히 기본 생성자를 호출합니다.
두 번째 놀라움 : obj2 = 100
실제로는을 의미 obj2.operator=(abc(100));
합니다.
abc
에서abc(100)
obj2
세 번째 놀라움 : 소멸자는 닫는 대괄호 바로 앞 }
(그리고 예,) 뒤 의 범위 끝에서 호출됩니다 return
. 당신이 사용하고 있기 때문에 system("pause")
나는 당신이 Windows =>에 있다고 가정하지만 운이 좋으면 일시 중지를 끝내면 호출되므로 콘솔 Windows는 눈 깜짝 할 사이에 사라집니다. 보다 영구적 인 콘솔에서 프로그램을 시작하거나 추가 범위를 사용할 수 있습니다.
int main () {
{
// your code here
}
system("pause");
return 0;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다