c + + 에서 유 니 온 의 응용 분석

4363 단어 C++
원문:http://it.114study.com/program/article392928.html  원문 에 많은 잘못 이 있 는데, 나 는 여기에 약간의 수정 을 했다.
머리말
c 를 잘 아 는 프로그래머 들 은 유 니 온 (연합 체) 의 용법 을 알 고 있 으 며, 유 니 온 을 이용 하여 같은 저장 공간 으로 서로 다른 데이터 형식 을 저장 하여 메모리 공간 을 절약 할 수 있다.내 구성원 에 게 접근 할 때 "." 와 "- >" 로 직접 접근 할 수 있 습 니 다.c + + 가 나타 난 후에 유 니 온 을 계승 하고 c 의 특성 을 유지 합 니 다.그러나 c + + 에 있 는 유 니 온 에 새로운 확장 이 생 겼 다 는 것 은 여러분 이 알 아야 합 니 다. 그렇지 않 으 면 이해 하기 어렵 고 혼 란 스 러 울 것 입 니 다.다음은 두 가 지 를 말씀 드 리 겠 습 니 다.
1. 유 니 온 에 저장 대상
c 에서 유 니 온 에 임의의 종류의 내 장 된 데이터 형식 을 저장 할 수 있 습 니 다. 그러면 c + + 에서 유 니 온 은 대상 을 저장 할 수 있 습 니까?예 를 들 어 보 자. 이것 은 어떤 말 보다 도 문 제 를 설명 할 수 있 지 않 니?
#include <iostream>
using namespace std;

class testunion
{
public:
	 testunion(long l):data_(l)	 {}
	 int data_;
};
typedef union _tagutype_
{
	testunion obj;
}ut;

int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}

이렇게 하면 안 됩 니 다. 유 니 온 에 testuni 류 의 대상 을 저장 할 수 없 지만 c 에 유 니 온 은 struct 를 저장 할 수 있 습 니 다. 왜 클래스 의 대상 을 저장 할 수 없 습 니까?간단 합 니 다. c 에서 유 니 온 은 구조 함수 가 있 는 struct 를 저장 할 수 있 습 니까?참, c 에 있 는 struct 는 구조 함수 가 없습니다.그래서 c + + 에 유 니 온 이 구조 함수 가 있 는 클래스 를 저장 할 수 있다 면 논리 에 맞지 않 습 니 다. c + 와 c 가 완전히 호 환 된다 고 하지 않 습 니까?좋 습 니 다. 그래서 c + 에서 유 니 온 은 구조 함수 가 있 는 대상 을 저장 할 수 없 지만 구조 함수 가 없 는 대상 을 저장 할 수 있 습 니 다. 그러면 c 와 일치 합 니 다. 믿 고 싶 지 않 습 니 다.testunion 류 의 성명 에 대해 다음 과 같이 수정 합 니 다.
class testunion
{
 public:
 int data_;
};

다시 컴 파일, 모든 ok!그러나 이렇게 하면 c + + 의 구조 초기 화 특성 을 잃 게 됩 니 다. 이렇게 하 는 것 은 아무런 의미 가 없습니다. 저 는 c + + 에 있 는 의 미 를 말 하 는 것 일 뿐 여러분 에 게 추천 하 는 것 이 아 닙 니 다 (절대 추천 하지 않 습 니 다).그러나 우 리 는 유 니 온 에 대상 의 지침 을 저장 하여 서로 다른 대상 유형 을 인용 할 수 있다.내 가 더 이상 말 할 필요 가 없 으 니, 모두 한번 해 보 세 요!
2. 유 니 온 초기 화
유 니 온 의 공유 메모리 특징 으로 인해 우 리 는 메모리 공간 을 낭비 하지 않 고 서로 다른 형식 으로 저장 할 수 있 습 니 다. 클래스 에서 우 리 는 유 니 온 이 서로 다른 유형의 지침 을 저장 하 는 것 을 설명 할 수 있 습 니 다. 예 를 들 어 다음 과 같 습 니 다.
class testunion
{
private:
	enum storetype {LongInt,const_charp};
	union dataunion
	{
		const char* ch_;
		long l_;
	} data_;
	storetype stype_;
	testunion(testunion&);
	testunion& operator=(const testunion&);
public:
	testunion(const char* ch);
	testunion(long l);
	const char* GetConstChar() const {return data_.ch_;}
	long GetLong() const {return data_.l_;}
};
testunion::testunion(const char* ch)
{
	data_.ch_ = ch;
	stype_ = const_charp;
}
testunion::testunion(long l)
{
	data_.l_ = l;
	stype_ = LongInt;
}


int _tmain(int argc, _TCHAR* argv[])
{
	testunion pszobj("test");
	testunion lobj(1234);
	cout<<pszobj.GetConstChar()<<pszobj.GetLong();
	return 0;
}

정말 불행 하 게 도 번역 이 통 하지 않 는 다. 아무 문제 가 없 는 것 같은 데, 왜 일 까?data_.ch_(ch) 와 data.l_(l) 문제 있어 요?만약 네가 c 프로그래머 에 게 물 어보 면 그 는 너 에 게 절대 문제 가 없다 고 말 할 것 이다.설마 컴 파일 러 에 문제 가 있다 고 의심 하 는 건 아니 겠 지?미안 하 다처음부터 그렇게 생각 했 습 니 다. 정말 부 끄 럽 습 니 다.까다롭다테스트 유 니 온 대상 을 구성 할 때 무슨 일이 일 어 났 는 지 살 펴 보면 알 수 있 을 것 이다.테스트 유 니 온 대상 을 만 들 때 자 연 스 럽 게 그 에 상응하는 구조 함 수 를 호출해 야 한다. 구조 함수 에서 당연히 그 구성원 의 구조 함 수 를 호출해 야 하기 때문에 유 니 온 구성원 의 구조 함 수 를 호출해 야 한다. 그러나 익명 으로 구조 함수 가 호출 될 수 있 는 지 없 는 지 오류 가 발생 했다.c + + 에 서 는 유 니 온 이 클 라 스 와 마찬가지 로 구조 함수 가 있 을 수 있 음 이 분명 하 며, 구성원 을 직접 인용 할 수 없습니다.struct 역시 이 제한 이 있다.우리 가 그 에 게 구조 함 수 를 정의 하기 만 하면 모든 문제 가 해결 된다.예 는 다음 과 같다.
class testunion
{
private:
	enum storetype {LongInt,const_charp};
	union dataunion
	{
		dataunion() {}
		dataunion(char *p) {ch_ = p;}
		dataunion(long l) {l_ = l;}
		const char* ch_;
		long l_;
	} data_;
	storetype stype_;
	testunion(testunion&);
	testunion& operator=(const testunion&);
public:
	testunion(const char* ch);
	testunion(long l);

	const char* GetConstChar() const {return data_.ch_;}
	long GetLong() const {return data_.l_;}

};
testunion::testunion(const char* ch)
{
	data_.ch_ = ch;
	stype_ = const_charp;
}
testunion::testunion(long l)
{
	data_.l_ = l;
	stype_ = LongInt;
}

int _tmain(int argc, _TCHAR* argv[])
{
	testunion pszobj("test");
	testunion lobj(1234);
	cout<<pszobj.GetConstChar()<<pszobj.GetLong();
	return 0;
}

지금 다시 컴 파일 합 니 다. 만약 아직 안 된다 면 컴 파일 러 에 문제 가 있다 고 의심 하 는 데 는 이유 가 있 습 니 다.됐어, 이렇게 많이 써!여러분 에 게 도움 이 되 기 를 바 랍 니 다. 저 는 오후 내 내 걸 렸 습 니 다!만약 무슨 잘못 이 있 으 면 편지 로 여러분 과 함께 c + + 를 토론 하고 함께 발전 하 기 를 바 랍 니 다.
또 한 편의 문장 이 있다.http://www.lupaworld.com/tutorial-view-aid-8813.html

좋은 웹페이지 즐겨찾기