设为首页 加入收藏

TOP

C++你可能不知道地方(六)
2012-11-01 15:47:58 来源: 作者: 【 】 浏览:1803
Tags:可能 知道 地方


  
  后缀函数使用返回参数类型const,是为了避免下面代码生效
  
  1 UPInt i; 2 i++++;这个时候第一次调用++返回cosnt对象,并再次调用然后这个函数是non-const成员函数,所以const对象无法调用这个函数,那么i++++就无法生效了。
  
  这里说说效率问题,我们可以看到后缀++函数建立一个临时对象以作为它返回值,这个临时对象经过构造并在最后被析构。而前缀++函数没有这样的临时变量,并且没有那样的操作。所以如果我们在程序中使用前缀++效率会更加高一些,没有了临时变量的构造与析构的动作。
  
  4.虚析构函数
  
  带有多态性质的base class应该声明一个virtual析构函数。
  
  为什么这么说呢?看下面例子
  
  class base { … } class derived:public base {… } base * p= new derived;
  
  假设这里基类的析构函数不是virtual,当使用完p指针,我们删除它的时候,想想会发生什么,因为基类的析构函数是non-virtual所以不会发生多态直接调用基类析构函数,仅仅删除继承类中基类那部分内容,那么继承类对象其他内存没有被销毁,从而资源泄漏。
  
  如果将其声明为virtual,那么就会发生多态,调用的是指向继承类的指针,那么就会销毁的是整个继承类象。
  
  5.传递方式用引用
  
  缺省情况下c++以值传递方式传递对象至函数。函数参数都是以实际实参的复件为初值,而调用端所获得的是函数返回值的一个附件。这些复件都是由拷贝构造函数产出。看如下例子
  
  1 class Person{
  
  2 public:
  
  3 Person();
  
  4 virtual ~Person();
  
  5 …
  
  6 private:
  
  7 std::string name;
  
  8 std::string address;
  
  9 }
  
  10
  
  11 class Student:public Person{
  
  12 public:
  
  13 Student();
  
  14 ~Student();
  
  15 …
  
  16 private:
  
  17 std::string schoolName;
  
  18 std::string schoolAddress;
  
  19 };
  
  那么如果有一个函数验证是否为学生
  
  1 bool validateStudent(Student s);
  
  2 Student plato;
  
  3 bool platoIsOK=validateStudent(plato);
  
  分析这3行代码,编译器到底做了什么?首先调用Student的copy构造函数,然后以plato为蓝本将s初始化,当validateStudent返回被销毁,所以成本为“一次Student copy构造函数调用,加上一次Student析构函数调用”.
  
  Student对象内部有两个string对象,所以构造了两个string对象。Student继承自Person对象,里面又有两个string对象。所以by value方式传递一个Student对象,总体成本是“六次构造函数和六次析构函数”!
  
  以by reference方式传递参数也可避免对象切割问题。当一个derived class对象以by value方式传递并被视为一个base class对象,base class的copy构造函数会被调用,造成像derived class对象全被切割掉了,仅仅留下base class对象。看如下代码通过传递引用参数完成多态
  
  class Window{ public: … std::string name() const;
  
  virtual void display() const; };
  
  class WindowWithScrollBars:public Window{ public: … virtual void display() const;
  
  };
  
  //传入Windos类型,调用其display函数 //传入WindowWithScrollBars类型,调用其display函数 //体现多态 void printNameAndDispaly(const Window& w)
  
  { std::cout《w.name();
  
  w.display();
  
  }
  
  窥视c++编译器的底层,reference往往以指针实现出来,因此pass by reference真正传递的是指针。如果对象属于内置型,pass by value往往比pass by reference 效率高些。

      

首页 上一页 3 4 5 6 7 下一页 尾页 6/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++异常之异常说明 下一篇C/C++学习指针一些事

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: