1、获取数组大小:
#include <iostream>
using namespace std;
void main(void)
{
float fArray[6] = {0.0f};
cout<< sizeof(fArray) / sizeof(fArray[0])<<endl;
}
除系统内建数据类型可以按此方式外,自定义结构体也适用。
2、结构体初始化:
#include <iostream>
using namespace std;
typedef struct tagTest
{
int nData;
float fData;
char chData;
}TEST;
void main(void)
{
TEST test[3] = {{1, 1.1f, 'a'},
{2, 2.2f, 'b'},
{3, 3.3f, 'c'}};
for(int i = 0; i < sizeof(test) / sizeof(test[0]); i++)
{
cout<<i<<endl;
cout<<"nData: "<<test[i].nData<<endl;
cout<<"fData: "<<test[i].fData<<endl;
cout<<"chData: "<<test[i].chData<<endl;
cout<<endl;
}
}
3、调用构造函数初始化数组:
#include <iostream>
using namespace std;
class CTest
{
public:
CTest(int nData, float fData);
virtual ~CTest(void);
public:
void Display(void);
private:
int m_nData;
float m_fData;
};
CTest::CTest(int nData, float fData)
:m_nData(nData), m_fData(fData)
{
}
CTest::~CTest()
{
}
void CTest::Display()
{
cout<<"nData: "<<m_nData<<endl;
cout<<"fData: "<<m_fData<<endl;
}
void main(void)
{
CTest test[3] = {CTest(1, 1.1f), CTest(2, 2.2f), CTest(3, 3.3f)};
for(int i = 0; i < sizeof(test) / sizeof(test[0]); i++)
{
cout<<i<<endl;
test[i].Display();
cout<<endl;
}
}
4、用atexit函数代替exit、abort函数
对象的析构函数在程序从main函数退出时,或者标准C库函数exit被调用时才会被调用,多数情况下main函数的结尾也是靠调用
exit函数来结束程序的,这意味着在main函数结束前调用exit或abort函数时十分危险的,可以通过一下例子证明:
1)、未调用exit或abort函数:
#include <iostream>
using namespace std;
class CTest
{
public:
CTest(void){cout<<"CTest()"<<endl;}
virtual ~CTest(void){cout<<"~CTest()"<<endl;}
};
void main(void)
{
CTest test;
}
程序执行结果:
CTest()
~CTest()
2)、调用exit或abort函数:
void main(void)
{
CTest test;
exit(0); //或abort();
}
程序执行结果:
CTest()
从上面的例子可以明确的看到调用exit或abort函数以后对象的析构函数未被调用,这无意间就导致了内存泄漏,而且这种错误
无法察觉。但是在实际情况中确实存在程序运行期间要求退出应用程序的需求,那么我们是否就束手无策呢?答案并非如此。我
们可以调用标准C库函数atexit,atexit函数确保所有的析构函数被调用,其具体代码如下:
3)、调用atexit函数:
void main(void)
{
CTest test;
atexit(0);
}
程序执行结果:
CTest()
~CTest()
5、存取全局函数的函数指针
#include <iostream>
using namespace std;
void Func(const int &nData)
{
cout<<nData<<endl;
}
typedef void (*pFunc)(const int &nData);
class CTest
{
public:
CTest(void){}
virtual ~CTest(void){}
public:
void SetFunc(pFunc p){m_pFunc = p;}
void Run(int nData){m_pFunc(nData); }
public:
pFunc m_pFunc;
};
void main(void)
{
CTest test;
test.SetFunc(Func);
test.Run(456);
}