C++11新特性(2)

  • Post author:
  • Post category:其他


ONE   for循环的新写法


新写法格式:

for( decl : coll )
{
    statement
}

这种写法中,

for循环的条件分为两部分,decl作为循环元素,coll是一个容器。

每次for循环都会取coll里面的一个元素放到decl里面,再执行循环体。

具体操作可以类比旧格式,形如:

for(auto _pos=coll.begin(), _end=coll.end(); _pos!=_end; ++_pos)
{
    decl = *_pos;
    statement
}


上面代码并非源码,而是把新格式还原成旧格式的样子,是编译器自己实现的过程。

举个简单的例子:

for(int i : {2,3,5,7})
{
    cout << i << endl;
}

输出:

2
3
5
7

再给一个范例:

vector<double>vec;
//添加元素
...
//输出
for (auto elem : vec)
{
    cout << elem << endl;
}
//修改值
for (auto& elem : vec)
{
    elem * = 3;
}

C++11新特性里面,我觉得auto和for的新格式是最好理解最好用的两部分。


TWO    “=default” ,“=delete”


1》 “=default”


C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。

这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。如果程序员没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。

C++11 标准引入了”=default”函数。程序员只需在函数声明后加上“=default;”,就可将该函数声明为 “=default”函数,编译器将为显式声明的 “=default”函数自动生成函数体。        举例:

class X
{ 
public: 
    X() = default; //该函数比用户自己定义的默认构造函数获得更高的代码效率
    X(int i)
    { 
        a = i; 
    }
private:
    int a;
}


“=default”函数特性仅适用于类的特殊成员函数,且该特殊成员函数没有默认参数。

举例:

class X
{
public:
    int f() = default;      // err , 函数 f() 非类 X 的特殊成员函数
    X(int, int) = default;  // err , 构造函数 X(int, int) 非 X 的特殊成员函数
    X(int = 1) = default;   // err , 默认构造函数 X(int=1) 含有默认参数
};

2》 “=delete”

C++11 标准引入了”=delete”函数。程序员只需在函数声明后上“=delete;”,就可

将该函数禁用

class X
{
public:
    X();
    X(const X&) = delete;               // 声明拷贝构造函数为 delete 函数
    X& operator = (const X &) = delete; // 声明拷贝赋值操作符为 delete 函数
};

“=delete”函数特性还可用于

禁用类的某些转换构造函数,从而避免不期望的类型转换

class X
{
public:
    X(double){}
    X(int) = delete;
};

“=delete”函数特性还可以用来

禁用某些用户自定义的类的 new 操作符,从而避免在自由存储区创建类的对象

class X
{
public:
    void *operator new(size_t) = delete;
    void *operator new[](size_t) = delete;
};



版权声明:本文为void_ink原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。