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;
};