#define NULL 0
class Sample{
public:
Sample():m_nNumber(0){}
Sample(int nNumber):m_nNumber(nNumber){}
~Sample(){}
int GetNumber(){return m_nNumber;}
void SetNumber(int nNumber){m_nNumber = nNumber;}
private:
int m_nNumber;
};
Sample* TestSample(Sample* mSample){
int nNumber = mSample->GetNumber();
if ( nNumber%2 == 0) return mSample;
return NULL;
}
void TestNumber ( int nSample )
{
Sample mTest(nSample);
Sample* mTest2 = TestSample(&mTest);
if ( mTest2 ) /* Is this statement valid? or an Undefined Behaviour? */
{
std::cout<<"Sample is Even"<<std::endl;
}
else
{
std::cout<<"Sample is Odd"<<std::endl;
}
}
int main()
{
TestNumber( 10 );
TestNumber( 5 );
}
根据下面的片段,我有几个问题。
- 从返回类指针的函数返回0(NULL(是未定义的行为吗
- 在指向用户定义类的指针上执行布尔if语句时(如果允许或不导致未定义的行为(,它是计算指针的地址,还是(EDIT(指针的值
我正在使用VS2008,因为我正在处理的代码是遗留源代码,并且它没有更新的第三方库。
两者都是完全有效的,尽管有些人可能认为存在更好的方法来处理这一问题,但仍然经常使用。
- NULL是指针的有效值
- 检查指针是否为NULL是有效的(这就是
if
语句在C++中所做的,检查给定的值是否为零(
什么不是";允许的";正在取消引用NULL指针。因此,除了检查它是否为NULL之外,任何对它的使用都会导致一些丑陋的行为。
从返回类指针的函数返回0(NULL(是未定义的行为吗?
这不是未定义的行为。文字CCD_ 2是";空指针常数";,并且它可以用于初始化任何指针类型的值。
在指向用户定义类的指针上执行布尔if语句时(如果允许或不导致未定义的行为(,它会评估指针的地址或地址的内容吗?
if(mTest2)
是一个有效的测试。由于您没有取消引用指针mTest2
,因此这将检查指针是否为null,而不检查有关内容的任何内容。
另一方面,如果取消引用空指针,则会导致未定义的行为。