掀起C++ 11的神秘面纱(2)

Deleted和Defaulted函数

一个表单中的函数:

   
   
  1. struct A  
  2. {  
  3.  A()=default//C++11  
  4.  virtual ~A()=default//C++11  
  5. };  

被称为一个defaulted函数,“=default;”告诉编译器为函数生成默认的实现。Defaulted函数有两个好处:比手工实现更高效,让程序员摆脱了手工定义这些函数的苦差事。

与defaulted函数相反的是deleted函数:

   
   
  1. int func()=delete;

Deleted函数对防止对象复制很有用,回想一下C++自动为类声明一个副本构造函数和一个赋值操作符,要禁用复制,声明这两个特殊的成员函数=delete即可:

   
   
  1. struct NoCopy  
  2. {  
  3.     NoCopy & operator =( const NoCopy & ) = delete;  
  4.     NoCopy ( const NoCopy & ) = delete;  
  5. };  
  6. NoCopy a;  
  7. NoCopy b(a); //compilation error, copy ctor is deleted  

nullptr

C++终于有一个关键字指定一个空指针常量了,nullptr取代了有错误倾向的null和文字0,这两个被用来作为空指针替代品已经有很多年的历史了,nullptr是一个强类型:

   
   
  1. void f(int); //#1  
  2. void f(char *);//#2  
  3. //C++03  
  4. f(0); //which f is called?  
  5. //C++11  
  6. f(nullptr) //unambiguous, calls #2  

nullptr适用于所有指针类别,包括函数指针和成员指针: 

   
   
  1. const char *pc=str.c_str(); //data pointers  
  2. if (pc!=nullptr)  
  3.   cout<<pc<<endl;  
  4. int (A::*pmf)()=nullptr; //pointer to member function  
  5. void (*pmf)()=nullptr; //pointer to function  

委托构造函数

在C++11中,构造函数可以调用相同类中的其它构造函数:

   
   
  1. class M //C++11 delegating constructors  
  2. {  
  3.  int x, y;  
  4.  char *p;  
  5. public:  
  6.  M(int v) : x(v), y(0),  p(new char [MAX])  {} //#1 target  
  7.  M(): M(0) {cout<<"delegating ctor"<  

构造函数#2,委托构造函数,调用目标构造函数#1。

右值引用

C++03中的引用类型只能绑定左值,C++11引入了一种新型引用类型,叫做右值引用,右值引用可以绑定左值,例如,临时对象和字面量。增加右值引用的主要原因是move(移动)语义,它和传统的复制不一样,移动意味着目标对象偷窃了源对象的资源,留下一个状态为“空”的资源,在某些情况下,复制一个对象代价既高又没有必要,可以用一个移动操作代替,如果你想评估移动带来的性能收益,可以考虑字符串交换,一个幼稚的实现如下:

   
   
  1. void naiveswap(string &a, string & b)  
  2. {  
  3.  string temp = a;  
  4.  a=b;  
  5.  b=temp;  
  6. }  

像这样写代价是很高的,复制字符串必须分配原始内存,将字符从源位置复制到目标位置,相反,移动字符串仅仅是交换两个数据成员,不用分配内存,复制char数组和删除内存:

   
   
  1. void moveswapstr(string& empty, string & filled)  

  2. {  

  3. //pseudo code, but you get the idea  

  4.  size_t sz=empty.size();  

  5.  const char *p= empty.data();  

  6. //move filled's resources to empty  

  7.  empty.setsize(filled.size());  

  8.  empty.setdata(filled.data());  

  9. //filled becomes empty  

  10.  filled.setsize(sz);  

  11.  filled.setdata(p);  

  12. }  

如果你实现的类支持移动,你可以像下面这样声明一个移动构造函数和一个移动赋值操作符:

   
   
  1. class Movable  
  2. {  
  3. Movable (Movable&&); //move constructor  
  4. Movable&& operator=(Movable&&); //move assignment operator  
  5. };  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值