C++学习笔记(16)
十七、新的 STL 方法(成员函数)
1)C++11 新增了的方法 cbegin()、cend()、crbegin()、crend(),这些方法将元素视为 const。
2)iterator emplace (iterator pos, …); // 在指定位置插入一个元素,…用于构造元素,返回指
向插入元素的迭代器。
3)更重要的是,除了传统的拷贝构造函数和赋值函数,C++11 新增了移动构造函数和移动赋值函数。 十八、摒弃 export
C++98 新增了 export 关键字,C++11 不再使用,但仍保留它作为关键字,供以后使用。 十九、嵌套模板的尖括号
为了避免与运算符>>混淆,C++要求在声明嵌套模板时使用空格将尖括号分开:
vector<list<int> > v1; // 两个>之间必须加空格。
C++11 不再这样要求:
vector<list<int>> v2; // 两个>之间不必加空格。 二十、final 关键字
final 关键字用于限制某个类不能被继承,或者某个虚函数不能被重写。
final 关键字放在类名或虚函数名的后面。
示例:
class AA
{
public:
virtual void test()
{
cout << "AA class...";
}
};
class BB : public AA
{
public:
void test() final // 如果有其它类继承 BB,test()方法将不允许重写。
{
cout << "BB class...";
}
};
class CC : public BB
{
public:
void test() // 错误,BB 类中的 test()后面有 final,不允许重写。
{
cout << "CC class...";
}
};
二十一、override 关键字
在派生类中,把 override 放在成员函数的后面,表示重写基类的虚函数,提高代码的可读性。
在派生类中,如果某成员函数不是重写基类的虚函数,随意的加上 override 关键字,编译器会报错。
示例:
class AA
{
public:
virtual void test()
{
cout << "AA class...";
}
};
class BB : public AA
{
public:
void test() override
{
cout << "BB class...";
}
};
二十二、数值类型和字符串之间的转换
传统方法用 sprintf()和 snprintf()函数把数值转换为 char*字符串;用 atoi()、atol()、atof()把 char *字符串转换为数值。
C++11 提供了新的方法,在数值类型和 string 字符串之间转换。
1、数值转换为字符串
使用 to_string()函数可以将各种数值类型转换为 string 字符串类型,这是一个重载函数,在头文件
<string>中声明,函数原型如下:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
2、字符转换为串数值
在 C++中,数值类型包括整型和浮点型,针对于不同的数值类型提供了不同的函数在头文件 <strin
g>中声明,函数原型如下:
int stoi( const string& str, size_t* pos = nullptr, int base = 10 );
long stol( const string& str, size_t* pos = nullptr, int base = 10 );
long long stoll( const string& str, size_t* pos = nullptr, int base = 10 );
unsigned long stoul( const string& str, size_t* pos = nullptr, int base = 10 );
unsigned long long stoull( const string& str, size_t* pos = nullptr, int base = 10 );
float stof( const string& str, size_t* pos = nullptr );
double stod( const string& str, size_t* pos = nullptr );
long double stold( const string& str, size_t* pos = nullptr );
形参说明:
str:需要要转换的 string 字符串。
pos:传出参数,存放从哪个字符开始无法继续解析的位置,例如:123a45, 传出的位置将为 3。
base:若 base 为 0,则自动检测数值进制:若前缀为 0,则为八进制,若前缀为 0x 或 0X,则为十
六进制,否则为十进制。
注意:string 字符串转换为数值的函数可能会抛出异常,在《209、C++异常》中有详细介绍。
示例:
string str="123a45";
size_t pos;
int val = stoi(str, &pos, 10);
cout << "val=" << val << endl; // 输出 123
cout << "pos=" << pos << endl; // 输出 3
二十三、静态断言 static_assert
在《210、C++断言》中有详细介绍。 二十四、常量表达式 constexpr 关键字
const 关键字从功能上来说有双重语义:只读变量和修饰常量。
示例:
void func(const int len1)
{
// len1 是只读变量,不是常量。
int array1[len1]={0}; // VS 会报错,Linux 平台的数组长度支持变量,不会报错。
const int len2 = 8;
int array2[len2]={0}; // 正确,len2 是常量。
}
C++11 标准为了解决 const 关键字的双重语义问题,保留了 const 表示“只读”的语义,而将“常
量”的语义划分给了新添加的 constexpr 关键字。
所以,C++11 标准中,建议将 const 和 constexpr 的功能区分开,表达“只读”语义的场景用 co
nst,表达“常量”语义的场景用 constexpr。 二十五、默认函数控制=default 与=delete
在 C++中自定义的类,编译器会默认生成一些成员函数:
无参构造函数
拷贝构造函数
拷贝赋值函数
移动构造函数
移动赋值函数
析构函数
=default 表示启用默认函数。
=delete 表示禁用默认函数。
示例:
#include <iostream>
using namespace std;
class Girl
{
private:
int m_bh = 20; // 年龄。
string m_name = "美女"; // 姓名。
char m_xb = 'X'; // 性别。
public:
Girl() = default; // 启用默认构造函数。
Girl(int bh, string name) : m_bh(bh), m_name(name) {}
Girl(const Girl& g) = delete; // 删除拷贝构造函数。
void show() { cout << "bh=" << m_bh << ",m_name=" << m_name << endl; }
};
int main()
{
Girl g1;
g1.show();
// Girl g2 = g1; // 错误,拷贝构造函数已删除。
}