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

}

相关推荐
机智的叉烧17 分钟前
前沿重器[57] | sigir24:大模型推荐系统的文本ID对齐学习
人工智能·学习·机器学习
量子-Alex1 小时前
【多模态聚类】用于无标记视频自监督学习的多模态聚类网络
学习·音视频·聚类
吉大一菜鸡1 小时前
FPGA学习(基于小梅哥Xilinx FPGA)学习笔记
笔记·学习·fpga开发
CCSBRIDGE4 小时前
Magento2项目部署笔记
笔记
爱吃西瓜的小菜鸡4 小时前
【C语言】判断回文
c语言·学习·算法
别NULL4 小时前
机试题——疯长的草
数据结构·c++·算法
小A1594 小时前
STM32完全学习——SPI接口的FLASH(DMA模式)
stm32·嵌入式硬件·学习
亦枫Leonlew4 小时前
微积分复习笔记 Calculus Volume 2 - 5.1 Sequences
笔记·数学·微积分
岁岁岁平安5 小时前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA5 小时前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计