대입연산자 없이 NULL을 받을 수도 있나요?
글쓴이: dltkddyd / 작성시간: 수, 2014/03/26 - 1:31오후
template<typename T>
class Siterator:public std::iterator<std::random_access_iterator_tag,T> {
private:
public:
T* pt;
//member function declaration;
/*Siterator& operator=(T* _pt) {
pt=_pt;
return *this;
}*/
};
int main() {
Siterator<unsigned long int> obj1;
obj1=NULL;
if(obj1!=NULL) {
cout<<"not null"<<endl;
}
else {
cout<<"null"<<endl;l
}
return 0;
}위에서 obj1은 NULL을 대입연산자에 의해 대입을 받습니다. 그런데 operator=을 정의하지 않아도 obj1이 NULL을 대입받을 수 있는 것은 왜 그런가요?
Forums:


컴파일 해보셨어요?
컴파일 해보셨어요?
이상하네요.
위의 것은 되네요. 원래 코드는 이렇거든요.
//siterator.h #ifndef SITERATOR_H #define SITERATOR_H #include <iterator> #include <cstddef> namespace sstd { template<typename T> class Siterator:public std::iterator<std::random_access_iterator_tag,T> { private: public: T* pt; T* pointer() { return pt; } Siterator() { pt=NULL; } Siterator(T* _pt) { pt=_pt; } Siterator(const Siterator<T>& src):pt(src.pt) { //pt=src.pt; } Siterator& operator++() { ++pt; return *this; } Siterator operator++(int) { Siterator tmp(*this); ++pt; return tmp; } Siterator& operator--() { --pt; return *this; } Siterator operator--(int) { Siterator tmp(*this); --pt; return tmp; } T& operator*() {return *pt;} Siterator& operator=(const Siterator<T>& src) { pt=src.pt; return *this; } /*Siterator& operator=(T* _pt) { pt=_pt; return *this; }*/ bool operator==(const Siterator<T>& src) { return (pt==src.pt); } /*bool operator==(T* src) { return (pt==src); }*/ bool operator!=(const Siterator<T>& src) { return (pt!=src.pt); } bool operator<(const Siterator<T>& src) { return ((unsigned int)pt<(unsigned int)src.pt); } bool operator>=(const Siterator<T>& src) { return ((unsigned int)pt>=(unsigned int)src.pt); } bool operator<=(const Siterator<T>& src) { return ( (unsigned int)pt<=(unsigned int)src.pt ); } bool operator>(const Siterator<T>& src) { return (pt>src.pt); } operator unsigned long int() {//difference_type 변수와의 연산에서 암묵적인 타입 캐스팅 return (unsigned long int)pt; } Siterator operator-(const Siterator& src) { Siterator<T> off=(T*)(pt-src.pt); return off; } Siterator operator+(const Siterator & src) { Siterator<T> tmp=(T*)(pt+(unsigned long int)src.pt); return tmp; } Siterator operator+(const unsigned long int offset) { Siterator<T> tmp( (T*)(pt+offset) ); return tmp; } Siterator operator+(const int offset) { /*Siterator<T> tmp=(T*)(pt+offset); return tmp;*/ return (T*)(pt+offset); } Siterator operator-(const unsigned long int offset) { Siterator tmp=(T*)(pt-offset); return tmp; } Siterator operator-(const int offset) { Siterator tmp=(T*)(pt-offset); return tmp; } }; }; #endif //test.cc #include <iostream> using namespace std; #include "sdeque.h" using namespace sstd; int main() { sdeque<unsigned long int> obj1; //obj1.appendMemToLast(7); //obj1.appendMemToFirst(5); //obj1(1,2,3,4,5,11,12,13,14,15,16,17); Siterator<unsigned long int> it; it=&obj1[5];//여기서는 대입이 되는데요. if(it==&obj1[5]) { cout<<"The same."<<endl; } else { cout<<"The different."<<endl; } return 0; }도대체 이유를 모르겠네요.
본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.
Siterator(T* _pt)
Siterator(T* _pt) {
pt=_pt;
}
포인터를 인자로 받는 생성자가 있네요.
임의로 생략한 코드로는 제대로된 답변을 받기 힘듭니다.
대입문에서 암시적인 생성자 호출로 인한 묵시적 캐스팅 효과를 방지하시려면 생성자를 explicit으로 선언하면 됩니다.
댓글 달기