Welcome to tiger's blog!

What lead to success, what we are seeking...
posts - 47, comments - 23, trackbacks - 0, articles - 8
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

C++技巧

Posted on 2007-01-11 10:23 tiger 阅读(382) 评论(0)  编辑 收藏 引用

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);
}


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理