C++ 함수 인자값의 내부 형변환에 대한 이 생각이 맞나요?

ikpil의 이미지

제 나름대로 유추해서 결론을 내렸습니다.

함수 인자의 내부 타입 변환에 대해서.

첫째
클래스 외부에서의 함수 인자로써의 기본자료형과 객체간의 형변환 조건
1. 기본자료형이 클래스의 객체형으로 변환
2. 1의 조건하에, 인자의 맨 왼쪽것만 변환

만약 클래스 외부에서 operator* (class& _left, class& _right) 이고
Object = 3 * Object 에서
3 * Object는
operator*(3, Object) 를 호출하면서 3이 Class Object 로 바뀐다
(이때 int형을 받는 operator가 있다면 이것이 최우선으로 된다.)

둘째
어디까지나 OOP적은 생각은 모든것을 객체로 취급해야 하는 생각(C++ 철학)에서 기인하기 때문에,
좋은 클래스의 기준의 기본 조건은
첫째가 자연스러운 객체 사용 이라고 생각된다!

정태영의 이미지

오버로딩에 의해 기본동작이 실행되지 않을까요?

참고로 C++ 에서는 같은 이름을 가지는 함수들이더라도 다른 인자를 받는다면 다른 함수로 취급받습니다.

--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

ikpil의 이미지

날카로운 지적이십니다!
테스트 해보았습니다.

만약 오버로딩되는 함수가 있다면, 컴파일 타임에서 에러가 발생 됩니다.

void test(int a, int b)
{
	cout << "int형 호출" << endl;
	cout << a << " " << b << endl;
}
 
void test(char a, int b)
{
	cout <<" char형 호출" << endl;
	cout << a << " " << b << endl;
}
 
int main(void)
{
	test(1.1F,4);
}

컴파일 에러

ikpil의 이미지

이거 내가 몰 질문한거지?
....

함수에 인자로 전달되는 값이, 언제 형변환 되는지 정리한 거였군.

함수 오버로딩이 되어 있는 함수에 대해서,
1. 인자 형변환이 일어나 모호해 질수 있다면, 컴파일 에러가 발생한다.

함수 인자 형변환은
1. 객체에 있는 생성자가 인자 하나로 생성 될 수 있다면, 객체로 형변환 될 수 있다.
2. 기본타입에 대해서도 형변환이 일어난다.

자연스러운 객체 사용이 될 수 있게 디자인하는게 좋다.?
1. 객체 생성이 형변환으로 일어 났다면, 자연스럽다고 봐야 할까? 아니라고 생각한다. 언제 객체가 생성 됬는지 모르기 때문이다.

객체 생성 되는 시점을 알 아야 하는게 이점일까?
이점이다. 객체에 내부데이터가 많이 있거나, 포인터로 연계되어 있다면, 성능과 추적이 힘들기 때문이다.

성능이 안좋고 추적이 힘든게 단점인가?
성능이 안좋은게 단점이라고 지적 할 수 없다. 하지만 추적이 힘든건 분명 단점이다. 디버깅이 안된다면, 점점 더 힘들어 지기 때문이다.

그러므로, 암시적으로 형변환 되는게 객체형이라면, 자연스러운 사용법이라 할지라도, 디자인을 바꾸어야 되지 않을까 생각해 본다.

음..

http://www.ikpil.com

댓글 달기

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