很多程序库对外提供若干类,每个方法出错时如何告知调用者是否出错,以及出错码(在Linux上在error.h中的全局errno就是保存我们Linux程序执行的出错码的)?方法很多,为了简化起见,函数将返回一个对象,该对象保存了函数的返回值和出错码。
/*
* CLStatus.h
*
* Author: lilin
* email: [email protected]
*/
#ifndef CLSTATUS_H
#define CLSTATUS_H
//用于保存函数的处理结果
class CLStatus
{
public:
/*
lReturnCode >=0表示成功,否则失败
*/
CLStatus(long lReturnCode, long lErrorCode);
CLStatus(const CLStatus& s);
virtual ~CLStatus();
public:
bool IsSuccess();
public:
/*通过这样可以是m_lErrorCode和m_lReturnCode做为public
成员隐藏了写,但可以公开了读*/
const long& m_clReturnCode;
const long& m_clErrorCode;
private:
//返回值
long m_lReturnCode;
//出错码
long m_lErrorCode;
};
#endif
#include "CLStatus.h"
CLStatus::CLStatus(long lReturnCode, long lErrorCode) : m_clReturnCode(m_lReturnCode), m_clErrorCode(m_lErrorCode)
{
m_lReturnCode = lReturnCode;
m_lErrorCode = lErrorCode;
}
CLStatus::~CLStatus()
{
}
CLStatus::CLStatus(const CLStatus& s) : m_clReturnCode(m_lReturnCode), m_clErrorCode(m_lErrorCode)
{
m_lReturnCode = s.m_lReturnCode;
m_lErrorCode = s.m_lErrorCode;
}
bool CLStatus::IsSuccess()
{
if(m_clReturnCode >= 0)
return true;
else
return false;
}
上面的代码,是不是还可以效率上是不是还可以优化呢?
/*
* test.cpp
*
* Author: lilin
* email: [email protected]
*/
#include
using namespace std;
class A
{
public:
A()
{
cout << "In A(): " << hex << (long)this << endl;
}
A(const A&)
{
cout << "In A(const A&): " << hex << (long)this << endl;
}
~A()
{
cout << "In ~A(): " << hex << (long)this << endl;
}
A& operator=(const A& a)
{
cout << "In operator=: " << hex << (long)this << " = " << hex << (long)(&a) << endl;
return *this;
}
};
A f()
{
A a;
return a;
}
int main(int argc, char* argv[])
{
A a;
a = f();
return 0;
}
代码运行结果如下:
In A(): 7fff834e277e
In A(): 7fff834e277f
In operator=: 7fff834e277e = 7fff834e277f
In ~A(): 7fff834e277f
In ~A(): 7fff834e277e
在把代码稍稍的修改下:
/*
* test.cpp
*
* Author: lilin
* email: [email protected]
*/
#include
using namespace std;
class A
{
public:
A()
{
cout << "In A(): " << hex << (long)this << endl;
}
A(const A&)
{
cout << "In A(const A&): " << hex << (long)this << endl;
}
~A()
{
cout << "In ~A(): " << hex << (long)this << endl;
}
A& operator=(const A& a)
{
cout << "In operator=: " << hex << (long)this << " = " << hex << (long)(&a) << endl;
return *this;
}
};
A f()
{
return A();
}
int main(int argc, char* argv[])
{
A a = f();
return 0;
}
在看看运行结果:
In ~A(): 7ffff682a68f
In ~A(): 7ffff682a68e
明显整个过程少创建了一个对象,并且少调用了一次重载的=操作。效率是不是得到了明显的提升。但是为什么会这样呢?这里我们来看看程序到底做了些什么?
修改之后的代码我们实际上只创建了一个对象,是在f()函数中创建的。而在A a=f();这行代码中,调用并不是赋值运算,而是默认的拷贝构造函数,在默认的拷贝构造函数是将对象的引用直接返回过来,所以,也就只创建了一个CLStatus对象。至于为什么不是调用重载的赋值运算,而是调用了默认的拷贝构造函数,可以参考 拷贝构造函数和赋值运算符区别
所以,为了兼顾效率和移植性,在今后我们函数的返回值都统一用CLStatus封装后在返回,并建议代码的书写方式如下:
CLStatus f()
{
return CLStatus(…);
}
CLStatus s = f();
Linux环境高级编程系列博客 目录
Linux环境高级编程--介绍