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; // 错误,拷贝构造函数已删除。

}

相关推荐
YaBingSec6 分钟前
玄机网络安全靶场:JBoss 5.x_6.x 反序列化漏洞(CVE-2017-12149)
android·网络·笔记·安全·web安全·ssh
小龙报9 分钟前
【数据结构与算法】一文拿捏链式二叉树:遍历 + 统计 + 层序 + 完全树
java·c语言·开发语言·c++·人工智能·语言模型·visual studio
做cv的小昊14 分钟前
【TJU】研究生应用统计学课程笔记(5)——第二章 参数估计(2.3 C-R不等式)
c语言·笔记·线性代数·机器学习·数学建模·r语言·概率论
量子炒饭大师18 分钟前
【优化算法:双指针算法刷题宝典】—— 盛最多水的容器
c++·算法
AI360labs_atyun22 分钟前
GPT-5.5 和 DeepSeek V4同期发布,谁更行?
人工智能·gpt·学习·ai·agi
其实防守也摸鱼23 分钟前
MarkText:开源免费的 Markdown 编辑器新星
笔记·pdf·编辑器·免费·工具·调试·可下载
Ting.~24 分钟前
软件设计师备考笔记【day2】-UML 图解 | 面向对象 | 设计模式
笔记·设计模式·uml
承渊政道29 分钟前
【动态规划算法】(简单多状态dp问题入门与经典题型解析)
数据结构·c++·学习·算法·leetcode·macos·动态规划
南境十里·墨染春水30 分钟前
C++笔记——STL map
开发语言·c++·笔记
其实防守也摸鱼31 分钟前
网络安全与数据库运维核心知识点总结(附习题)
运维·网络·数据库·笔记·安全·web安全