조언주신 대로 개념 다시 잡아가려고 책보고 있습니다.

dltkddyd의 이미지

읽어보라고 권하신 스콧 마이어스의 이펙티브 씨++ 읽고 있습니다. 그런데 처음부터 또 질문이 떠오르는데요.

#include <iostream>
using namespace std;
 
class Test {
public:
	int num;
	explicit Test(int _num) {
		cout<<"explicit Test(int _num)"<<endl;
		num=_num;
	}
	/*Test(const Test& src) {
		cout<<"Test(const Test& src)"<<endl;
		num=src.num;
	}*/
 
};
 
int main() {
	Test obj2(5);
	//Test obj1=3;
	cout<<"from here"<<endl;
	Test obj1=obj2;//명시적으로 변환?  어떤 생성자도 호출되지 않는데 obj1 객체는 유효하며 멤버 num의 값도 5이다.
	//생성자가 호출되지 않아도 객체가 어떻게 생성되는지?  아니면 어떤 숨겨진 생성자가 호출된 건가요?
	//복사생성자를 정의했을 경우에는 저 복사생성자가 호출될텐데, 복사생성자로 객체가 만들어지는 과정과 위의 예에서 객체가 만들어지는 경우는 무엇일 틀린가요?
	cout<<obj1.num<<endl;
	return 0;
}

주석에 언급된 글이 제 궁금증입니다. 명시적 변환에서 생성자 호출 없이도 대입이 왜 가능한가요?

"모든 객체는 생성자가 호출되어야 유효하다."

라는 명제가 있다라면, 저 경우는 이 명제에 모순되므로 무효해야 할텐데요.

pynoos의 이미지

복사 생성자가 불립니다. 숨겨져 있죠.

dltkddyd의 이미지

제가 봐도 명시적 변환이 아닌데, 명시적 변환이라고 책에 나와있더군요. 그래서 ?를 붙인 겁니다. 이상해서. 아마도 그 전의 대입과 관련해서 언급한 것 같은데요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

HDNua의 이미지

생성자를 정의하지 않아도 객체 생성이 가능한 건 기본 생성자(default constructor)가 있기 때문이지요.
복사 생성자를 정의하지 않아도 저 선언이 가능한 건 기본 복사 생성자가 있기 때문입니다.

저는 이렇게 생각했습니다.

dltkddyd의 이미지

네, 알겠습니다. 전 기본생성자만 있는지 알았습니다. 기본복사생성자라는 것도 있는 거군요. 예전에 문법서에서 봤던 내용인데, 잠깐 망각했습니다. 그런 생각이 언뜻 들었습니다. 답변 감사드립니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

dltkddyd의 이미지

그냥 복사 생성자겠죠. 기본이라 함은 아무런 매개변수를 언급하지 않아도 자동으로 호출되는 멤버를 기본이라 하더군요. 기본생성자에서 그 생성자가 그렇죠. 복사 생성자라는 것은 이미 매개변수를 취하므로 기본이라고 할 수 없겠군요. 그냥 복사생성자로 통일하는 게 좋겠군요. 여하튼 답변 감사드립니다. 덕분에 복습하고 갑니다.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

kukyakya의 이미지

아닙니다. 내용을 맘대로 짐작하지 마시고 C++ 표준 문서를 구해서 기본 복사 생성자에 대한 내용을 읽어보시길 바랍니다.

klyx의 이미지

타입이같은데 왜 그걸 '변환'이라고 부르시나요?

익명 사용자의 이미지

문법책부터 보세요

익명 사용자의 이미지

effective c++은 초보가 보는 책이 아닙니다.
님은 지금 기본 문법서를 차근차근 봐야하는 수준입니다.

님을 얕봐서 그런게아니라 정말로 도움이 되라고 드리는 말입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.