当前位置:  编程技术>c/c++/嵌入式

C++你最好不要做的几点小结

    来源: 互联网  发布时间:2014-10-11

    本文导语:  1、最好不要使用引用返回值 有同学在传递的参数的时候使用引用方式传递,避免了临时对象的创建,提高了效率,那么在返回值的时候能不能使用引用呢? 看如下代码 代码如下:        class Rational{        public:     ...

1、最好不要使用引用返回值

有同学在传递的参数的时候使用引用方式传递,避免了临时对象的创建,提高了效率,那么在返回值的时候能不能使用引用呢?

看如下代码

代码如下:

        class Rational{
        public:
            Raional( int numerator = 0, int denominator =1);
            ...
        private:
            int d, d;
            friend Rational operator* (const Rational& lhs, const Raional& rhs) ;
        };
       Rational Rational::operator* (const Rational& lhs,const Raionl&rhs)
        {
                return Rational  result(lhs.n*rhs.n,lhs.d*rhs.d);
        }
    }  
   
    这个类就是我们前面所介绍的有理数类。这里想想会发生一次类的构造与类的析构,那么如果使用引用就可以避免这个问题吗?达到提高效率吗?

函数创建新对象有两种方法,一个是在栈(statck)中创建,一个是在堆(heep)中创建。

代码如下:

        People p(a,b)                  //栈中创建
        People *p = new People(a,b)   //堆中创建
 
 现在首先考虑在栈中创建,但是这个创建的变量是一个局部变量,会在退出函数之前销毁。
代码如下:

   const Rational& operator* (const Rational& lhs, const Rational & rhs)
        {
            Rational  result(lhs.n*rhs.n,lhs.d*rhs.d);
            return result;
        }  

 在函数内以stack方式空间创建对象是局部对象,任何函数如果返回一个引用指向某个局部对象,都会发生错误。因为局部对象在函数退出之前被销毁了,意味着reference所指的对象不存在。
      于是考虑在堆中创建
代码如下:

const Rational& operator* (const Rational& lhs, const Rational & rhs)
        {
            Rational*  result=new Rational(lhs.n*rhs.n,lhs.d*rhs.d);
            return *result;
        } 
 
 现在又发现了一个问题,new出来的对象由谁来delete?好这个问题先占时不考虑看下面情况
代码如下:

          Rational w,x,y,z;
          w=x*y*z;      
  
   这里同时一个语句调用了两次operator*,意味着new了两次,也就需要delete两次。但是这里没有合理的办法让opertaor*使用者进行那些delete调用,因为无法让使用者获取返回的指针,这将导致资源泄漏。
      于是考虑返回一个引用,其指向定义于函数内部的static Rational对象。
代码如下:

const Rational & operator*(const Rational& lhs,const Rational & rhs)
        {
            static Rational result;
            result = ...;
            return result;
        }
 
 那么显而易见就是多线程,在多线程环境下,这样写安全吗?好如果说不关多线程。那么如下代码会发生什么?
代码如下:

  bool operator == (const Rational& lhs, const Rational&  rhs);
    ...
    Raional a,b,c,d;
    if((a*b) == (c*d)
    {
            ...
    }   
   
    上述if语句表达式无论a,b,c,d为何值都是true,因为它们都指向同一个静态值。

2、最好不要将所有变量定义放在语句开头。

有同学可能上过C语言课程,喜欢学习C的,喜欢将所有的变量定义放在开头,但是在C++中,我建议最好不要这样做,因为定义一个变量时,程序便注定需要进行一次构造与析构。例如在下面程序:大概意思我们允许1米8以下并且年龄在60岁以下的同学买票进入。

代码如下:

 class People{...};
 class Ticket{...};
 bool Isvalid(const People&p){...}
 void Banding(const People& p,Ticket& t);
 Ticket buyTicket(const People& p)
 {
     Ticket t;
     if(Isvalid(p)){ return NULL };
     //信息与票绑定
    Banding(p,&t);
    return t;
}

假如这里检测买票人条件不符合,那么就不能进入买票从而进行信息与绑定操作,那么这里Ticket t语句就让该函数白白承受了一次Ticket构造成本与析构的成本。
所以最好不要将变量提前定义,最好在要用到的时候定义,避免不必要的性能开销。上面例子改成下面这样即可:

代码如下:

 class People{...};
 class Ticket{...};
 bool Isvalid(const People&p){...}
 void Banding(const People& p,Ticket& t);
 Ticket buyTicket(const People& p)
 {
     if(Isvalid(p)){ return NULL };
     Ticket t;
     //信息与票绑定
     Banding(p,&t);
     return t;
 }


3、最好不要做过多的类型转换

C++规则的设计目标之一是,保证“类型错误”绝不可能发生。理论上程序通过编译,就表示它并不企图在任何身上执行任何不安全,荒谬的操作。可惜类型转换破环了类型系统,它可能导致任何种类麻烦,有些非常麻烦。就例如本文最后一个代码例子。C和C++都支持隐形类型转换,同时C++有四种显示转换操作符。成员函数与非成员函数的抉择里有介绍。但是建议最好不要做过多的类型转换,能避免就避免。类型转换往往也不是按照你的意思,首先看一个例子:

代码如下:

 #include
 class base
 {
     public:
         base():a(0),b(0){}
         base(const int& x,const int& y)
         :a(x),b(y){}
         virtual void init()
        {
            a=5;
            b=5;
            std::cout

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问开发java的环境最好是在什么地方啊,用vj++是不是最好啊
  • 在网络数据传输中,为了降低数据传输量,用哪种算法最好,有哪位大虾帮忙吗?最好有JAVA源代码
  • win2000下开发Jsp用什么工具和服务器最好,最好是免费的:)
  • 什么样的中文linux最好
  • 想学qt,大哥大姐前辈们介绍几本书吧,最好能提供电子版,谢谢~~~~~~~~~~~
  • 哪一种语言平台最好
  • linux下远程管理,哪个软件最好?
  • 哪有最好的java反编译器
  • 谁有unix X-window中文平台,最好是炎黄中文
  • 游戏最好用什么软件做呀?
  • 现在最好的jsp服务器是什么??最全面稳定的是哪一个??
  • 学Linux最好的方法和工具是什么?(分数多多)
  • 怎样才能用java实现结构体数组,最好有代码!谢了!送上100分!!!!
  • 请问Linux下最流行的/最好的代理服务器是什么?
  • 那里可以下载JDK的帮助文档,最好是中文的!!谢谢!
  • 小弟想学linux,推荐几本好书,有电子版下载的最好.
  • 求最好的解决方法
  • 那里可以得到Kdevelop的帮助文档(最好是中文),谢谢
  • 请问哪里有jboss有关配置的教程,最好是中文的,先谢了
  • 高分求助,哪有好的java类库大全,最好带索引,中文




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3