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 array1len1={0}; // VS 会报错,Linux 平台的数组长度支持变量,不会报错。

const int len2 = 8;

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

}

相关推荐
tiankongdeyige7 小时前
游戏战斗系统学习第2篇:有限状态机 (FSM)
学习·游戏·typescript
朔北之忘 Clancy8 小时前
2025 CSP-J 第二轮真题解析
c++·青少年编程·题解·noip·csp·信奥赛·noi
longlongzihan8 小时前
LeetCode 17电话号码的字母组合:回溯算法(DFS)详解
c++·算法·leetcode·深度优先
yolo_guo8 小时前
调试mysql延迟与libevent回调实际发送回复时机问题
c++·mysql·libevent
今晚打老虎9 小时前
c++之提高A(前缀和)(第三课)
数据结构·c++·算法
an123212110 小时前
ARM嵌入式学习笔记:SPI通信协议详解
arm开发·笔记·学习
by2099911 小时前
从结构体到对象:正式学习C++类的骨架、封装与this指针
c++·经验分享·学习
乌暮11 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
2601_9622186112 小时前
C语言中三种库的编译和使用方法
开发语言·c++
jimy112 小时前
派生类重写基类虚函数(二):override的作用
开发语言·c++