首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 等级考试 > 复习指导 >

C++基础解析二十

2008-12-02 
两次调用析构函数、函数指针实例

    一、两次调用析构函数

    在类生成临时对象时,遇到一个问题,程序会两次调用析构函数
  #include <cstring>
  #include <iostream>
  using namespace std;
  class stack
  {
  public:
  stack(const char *value);
  ~stack();
  char * data;
  };
  stack::stack(const char *value)
  {
  if(value)
  {
  data = new char[strlen(value)+1];
  strcpy(data,value);
  }
  else
  {
  data = new char[1];
  *data = '\0';
  }
  }
  inline stack::~stack()
  {
  cout << "Destructor" << endl;
  //delete []data; //此处会报错
  }
  void dosth(stack pstk)
  {
  cout << pstk.data << endl;
  }
  int main()
  {
  stack str("iamxczhang");
  dosth(str);
  return 0;
  }
  查了一些资料,还不是很清楚,但是经过仔细分析后,考试.大提示是系统调用默认拷贝构造函数的结果。
  在返回对象和按值传递参数时,要生成临时对象,生成临时对象要调用默认拷贝构造函数。
  通过这个例子更让加深了对Effective C++的理解。
  只要类里有指针变量就得自己写拷贝构造函数和赋值函数,但是你确定用不着这些函数时,可以把这些函数做private声明而不去实现它,这就防止了会有人去调用它们,也防止了编译器去生成它们。

    二、函数指针实例

    #include <stdio.h>
  typedef void (*myTest)(int i);
  void test1(int i)
  {
  printf("hello test1,my value:%d\n",i);
  }
  void test2(int i)
  {
  printf("hello test2,my value:%d\n",i);
  }
  int main()
  {
  myTest myFun;//用myTest这个类型定义一个变量
  myFun=test1;//将一个函数赋值给变量myFun,注意myFun是一个指向函数指针的变量
  (*myFun)(1);//执行
  myFun=test2;//再赋另一个值
  (*myFun)(2);//再执行。
  return 0;
  }
  liulife@liulife:~/test$ gcc -o test_func_p test_func_p.c
  liulife@liulife:~/test$ ls
  test_func_p test_func_p.c
  liulife@liulife:~/test$ ./test_func_p
  hello test1,my value:1
  hello test2,my value:2

 

3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.com/exam/

热点排行