现在的位置: 首页 > 综合 > 正文

c++编程的一些技巧

2013年04月12日 ⁄ 综合 ⁄ 共 1783字 ⁄ 字号 评论关闭

第一点,使用全局对象的构造函数在程序启动前调用函数

  有一些应用程序需要在主程序启动前调用其它函数。如:转态过程函数、登记
功能函数都是必须在实际程序运行前被调用的。最简单的办法是通过一个全局对象
的构造函数来调用这些函数。因为全局对象都是在主程序开始前被构造,这些函数
都将会在main()之前返回结果。如:  
class Logger
{

 public:
 Logger()  
  {  
   activate_log();//译者注:在构造函数中调用你需要先运行的函数
  }
};
Logger log; //一个全局实例

int main()
{
 record * prec=read_log();//译者注:读取log文件数据
 //.. 程序代码
}

  
  全局对象log在main()运行之前被构造,log调用了函数activate_log()。从
而,当main()开始执行时,它就可以从log文件中读取数据

 

第二点:指向成员的指针

  一个类有两种基本的成员:函数成员和数据成员。同样的,指向成员的指针也
有两种:指向函数成员的指针和指向数据成员的指针。后则其实并不常用,因为类
一般是不含有公共数据成员的,仅当用在继承用C写的代码时协调结构(struct)和
类(class)时才会用到。

  指向成员的指针是C++语法中最难以理解的构造之一,但是这也是一个C++最强
大的特性。它可以让你调用一个类的函数成员而不必知道这个函数的名字。这一个
非常敏捷的调用工具。同样的,你也可以通过使用指向数据成员的指针来检查并改
变这个数据而不必知道它的成员名字。

  指向数据成员的指针

  尽管刚开始时,指向成员的指针的语法会使你有一点点的迷惑,但你不久会发
现它其实同普通的指针差不多,只不过是*号的前面多了::符号和类的名字,例:
定义一个指向int型的指针:

  
int * pi;   
  定义一个指向为int型的类的数据成员:  
int A::*pmi; //pmi是指向类A的一个int型的成员  
  你可以这样初始化它:  
class A
{
 public:
 int num;
 int x;
};
int A::*pmi = & A::num;   
  上面的代码是声明一个指向类A的一个int型的num成员并将它初始化为这个num
成员的地址.通过在pmi前面加上*你就可以使用和更改类A的num成员的值:  
A a1, a2;
int n=a1.*pmi; //把a1.num赋值给n
a1.*pmi=5; // 把5赋值给a1.num  
a2.*pmi=6; // 把6赋值给6a2.num  
  
  如果你定义了一个指向类A的指针,那么上面的操作你必须用 ->*操作符代
替:  
A * pa=new A;
int n=pa->*pmi;  
pa->*pmi=5;   

  指向函数成员的指针

  它由函数成员所返回的数据类型构成,类名后跟上::符号、指针名和函数的参
数列表。举个例子:一个指向类A的函数成员(该函数返回int类型)的指针:
  
class A  
{
 public:
 int func ();  
};  
int (A::*pmf) ();  
  
  上面的定义也就是说pmf是一个指向类A的函数成员func()的指针.实际上,这
个指针和一个普通的指向函数的指针没什么不同,只是它包含了类的名字和::符
号。你可以在在任何使用*pmf的地方调用这个函数  
func():
pmf=&A::func;
A a;
(a.*pmf)(); //调用a.func()  
  如果你先定义了一个指向对象的指针,那么上面的操作要用->*代替:  
A *pa=&a;
(pa->*pmf)(); //调用pa->func()  
  指向函数成员的指针要考虑多态性。所以,当你通过指针调用一个虚函数成员
时,这个调用将会被动态回收。另一个需要注意的地方,你不能取一个类的构造函
数和析构函数的地址。

第三点:以友元类声明嵌套的类

  当你以友元类声明一个嵌套的类时,把友元声明放在嵌套类声明的后面,而不
前面。
  
class A  
{
 private:
 int i;
 public:
 class B //嵌套类声明在前
 {
  public:
  B(A & a) { a.i=0;};  
 };
 friend class B;//友元类声明
};
  
  如果你把友元类声明放在声明嵌套类的前面,编译器将抛弃友元类后的其它声
明。   

 

抱歉!评论已关闭.