一、两次调用析构函数
在类生成临时对象时,遇到一个问题,程序会两次调用析构函数
#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/