[C++] 복사생성자 질문 드립니다,

k3rnel의 이미지

안녕하세요

복사생성자중에 의문사항이 있습니다,

#include <iostream>
using std::cout;
using std::endl;

class AAA
{
private:
           int val;
public:
          AAA(int i)
         {
           val = i;
         }
         AAA(const AAA& a)
        {
           val = a.val;   //<------------------여기에서 의문점
         }
};

void main()
{
   AAA a(10);
   AAA b(a);
}

위의 코드에서 복사생성자를 호출하는분에서
val= a.val 코드중에,
a.val 자체가 외부참조 아닌가요?
변수 val의 접근 권한이 private 인데 인수로 넘긴 a 객체에서 직접 a객체의 멤버변수를 외부에서 접근이 가능한가요?

이해가 잘 되지 않습니다,,

답변 부탁드릴께요 수고하세요( _)

lovemyin의 이미지

클래스의 멤버 함수 안에서는 private 멤버를 모두 직접 접근할 수 있습니다.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

k3rnel의 이미지

a.val 에서요,,

a라는 객체가있는데,,,그것을 지금 외부에서 참조하고있는 형태 아닌가요?

corba의 이미지

접근제어는 인스턴스레벨이 아니라 클래스 레벨로 이루어지는 것으로 알고 있습니다.

외부 인스턴스라도 같은 클래스니 상관이 없을 듯 합니다.

싱글톤의 경우도 static멤버가 private으로 되어 있는 생성자를 호출하지 않습니까 ? :)

k3rnel의 이미지

제가 기초가 부족한관계로 이해가 되지 않습니다 ㅜㅜ

보통

class A
{
private:
   int val;
public:
   void setX(int x)
  {  val = x;
  }
};

void main()
{
   A a;
   a.setX(10);
   // a.val = 10   << 외부참조라서 에러 발생
}

위의 코드처럼 직접 참조 못하는걸로 알고있는데요,,
제가 처음에 질문드렸던,,복사생성자에서도 같은 경우가 아닌가요?

ㅜㅜ

익명 사용자의 이미지

main() 함수는 class AAA의 멤버함수가 아닙니다. 따라서 main() 함수에서 class AAA의 private 멤버를 접근하려고 하면 당연히 에러가 발생합니다.

lovian의 이미지

위에분들이 이미 말씀하셨지만.

main과 복사생성자의 위치는 상당히 다릅니다.

main은 A 클래스의 맴버가 아니기 때문에 A의 인스턴스의 private 값들에 접근 할 수 없지만,

복사생성자는 A 클래스의 맴버이기 때문에 A의 인스턴스의 private값들에 접근이 허용됩니다.

-----------------
한글을 사랑합니다.

익명 사용자의 이미지

답변해주신분들께 감사드립니다~(_ _)

이제 좀 이해가 될듯합니다,,^^

raymundo의 이미지

k3rnel 님과 같은 의문에 고민했던 사람들 많을걸요? :-) (적어도 저는 그랬습니다 ^^;;;)

a.val 의 a 는 분명 "내 자신이 아닌 다른 객체"이지만, 어쨌거나 같은 AAA클래스이기 때문에 private이라 하더라도 접근 가능합니다.

"그럼 다른 객체가 맘대로 (set 메쏘드를 거치지 않고) 부적절한 값을 부여해 버리면 어떡하냐"라고 생각할 수도 있지만, 어차피 AAA클래스(의 객체들) 사이에서만 접근 가능한 것이니 AAA클래스를 작성하는 사람이 그런 일이 없도록 잘 코딩하면 되는거죠.

좋은 하루 되세요!

lifthrasiir의 이미지

raymundo wrote:
k3rnel 님과 같은 의문에 고민했던 사람들 많을걸요? :-) (적어도 저는 그랬습니다 ^^;;;)

a.val 의 a 는 분명 "내 자신이 아닌 다른 객체"이지만, 어쨌거나 같은 AAA클래스이기 때문에 private이라 하더라도 접근 가능합니다.

"그럼 다른 객체가 맘대로 (set 메쏘드를 거치지 않고) 부적절한 값을 부여해 버리면 어떡하냐"라고 생각할 수도 있지만, 어차피 AAA클래스(의 객체들) 사이에서만 접근 가능한 것이니 AAA클래스를 작성하는 사람이 그런 일이 없도록 잘 코딩하면 되는거죠.

저도 C++ 대충 알 적에 그걸 몰라서 삽질한 적이 있습니다. orz 참고로 자바 같은 경우에도 비슷하게 다른 클래스에 접근할 수 있게 되어 있습니다. 클래스 하나에 책임 하나라는 생각에서 보면 당연한 걸지도 모르겠네요. (자기 자신의 인스턴스는 모두 책임을 져야 하니까...)

- 토끼군

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.