【C++航海王:追寻罗杰的编程之路】C++11(上)

这篇具有很好参考价值的文章主要介绍了【C++航海王:追寻罗杰的编程之路】C++11(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 -> C++11简介

2 -> 统一的列表初始化

2.1 -> {}初始化

2.2 -> std::initializer_list

3 -> 声明

3.1 -> auto

3.2 -> decltype

3.3 -> nullptr


【C++航海王:追寻罗杰的编程之路】C++11(上),C++,c++,开发语言,visualstudio,后端

1 -> C++11简介

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了
C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞
进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。
从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于
C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中
约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,
C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更
强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多。

2 -> 统一的列表初始化

2.1 -> {}初始化

在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

struct fyd
{
	int x;
	int y;
};

int main()
{
	int array1[] = { 1, 2, 3, 4, 5 };
	int array2[5] = { 0 };
	fyd p = { 1, 2 };

	return 0;
}

C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自
定义的类型,使用初始化列表时,可添加等号(=),也可不添加。

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

struct fyd
{
	int x;
	int y;
};

int main()
{
	int x1 = 1;
	int x2{ 2 };
	int array1[]{ 1, 2, 3, 4, 5 };
	int array2[5]{ 0 };
	fyd p{ 1, 2 };

	// C++11中列表初始化也可以适用于new表达式中
	int* pa = new int[4]{ 0 };

	return 0;
}

创建对象时也可以使用列表初始化方式调用构造函数初始化

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

class Date
{
public:
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		cout << "Date(int year, int month, int day)" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2024, 4, 1);

	// C++11支持的列表初始化,这里会调用构造函数初始化
	Date d2{ 2024, 4, 2 };
	Date d3 = { 2024, 4, 3 };

	return 0;
}

2.2 -> std::initializer_list

【C++航海王:追寻罗杰的编程之路】C++11(上),C++,c++,开发语言,visualstudio,后端

std::initializer_list的介绍文档

std::initializer_list是什么类型:

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

int main()
{
	auto il = { 10, 20, 30 };

	cout << typeid(il).name() << endl;

	return 0;
}

std::initializer_list使用场景:

std::initializer_list一般是作为构造函数的参数,C++11对STL中的不少容器就增加
std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。也可以作为operator=
的参数,这样就可以用大括号赋值。

list

vector

map

operator=

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>
#include <map>
#include <list>
using namespace std;

int main()
{
	vector<int> v = { 1,2,3,4 };
	list<int> lt = { 1,2 };

	// 这里{"sort", "排序"}会先初始化构造一个pair对象
	map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };

	// 使用大括号对容器赋值
	v = { 10, 20, 30 };

	return 0;
}

让模拟实现的vector也支持{}初始化和赋值

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>
#include <map>
#include <list>
using namespace std;

namespace fyd
{
	template<class T>
	class vector 
	{
	public:
		typedef T* iterator;
		vector(initializer_list<T> l)
		{
			_start = new T[l.size()];
			_finish = _start + l.size();
			_endofstorage = _start + l.size();
			iterator vit = _start;

			typename initializer_list<T>::iterator lit = l.begin();
			while (lit != l.end())
			{
				*vit++ = *lit++;
			}
			//for (auto e : l)
			//   *vit++ = e;
		}

		vector<T>& operator=(initializer_list<T> l) 
		{
			vector<T> tmp(l);

			std::swap(_start, tmp._start);
			std::swap(_finish, tmp._finish);
			std::swap(_endofstorage, tmp._endofstorage);

			return *this;
		}

	private:
		iterator _start;
		iterator _finish;
		iterator _endofstorage;
	};
}

3 -> 声明

C++11提供了多种简化声明的方式,尤其是在使用模板时。

3.1 -> auto

在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局
部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃auto原来的用法,将
其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初
始化值的类型。

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>
#include <map>
#include <list>
using namespace std;

int main()
{
	int i = 10;
	auto p = &i;
	auto pf = strcpy;

	cout << typeid(p).name() << endl;
	cout << typeid(pf).name() << endl;

	map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };

	//map<string, string>::iterator it = dict.begin();
	auto it = dict.begin();

	return 0;
}

3.2 -> decltype

关键字decltype将变量的类型声明为表达式指定的类型。

#define  _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>
#include <map>
#include <list>
using namespace std;

// decltype的一些使用使用场景
template<class T1, class T2>
void F(T1 t1, T2 t2)
{
	decltype(t1 * t2) ret;

	cout << typeid(ret).name() << endl;
}

int main()
{
	const int x = 1;
	double y = 2.2;
	decltype(x * y) ret; // ret的类型是double
	decltype(&x) p;      // p的类型是int*

	cout << typeid(ret).name() << endl;
	cout << typeid(p).name() << endl;

	F(1, 'a');

	return 0;
}

3.3 -> nullptr

由于C++中NULL被定义成字面量0,这样就可能带来一些问题,因为0既能表示指针常量,又能表示整型常量。所以出于清晰和安全角度考虑,C++11中新增了nullptr,用于表示空指针。

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

感谢大佬们支持!!!

互三啦!!!文章来源地址https://www.toymoban.com/news/detail-855993.html

到了这里,关于【C++航海王:追寻罗杰的编程之路】C++11(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++航海王:追寻罗杰的编程之路】C++的类型转换

    目录 1 - C语言中的类型转换 2 - 为什么C++需要四种类型转换 3 - C++强制类型转换 3.1 - static_cast 3.2 - reinterpret_cast 3.3 - const_cast 3.4 - dynamic_cast 4 - RTTI 在C语言中,如果 赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需

    2024年04月13日
    浏览(35)
  • 【C++航海王:追寻罗杰的编程之路】探寻实用的调试技巧

    目录 1 - 什么是bug? 2 - 调试是什么?有多重要? 2.1 - 调试是什么? 2.2 - 调试的基本步骤 2.3 - Debug和Release的介绍 3 - Windows环境调试介绍 3.1 - 调试环境的准备 3.2 - 学会快捷键 3.3 - 调试的时候查看程序当前信息 3.3.1 - 查看临时变量的值 3.3.2 - 查看内存信息 3.3.3 - 查看调用堆栈

    2024年04月12日
    浏览(39)
  • 【C++航海王:追寻罗杰的编程之路】继承你学会了么?

    目录 1 - 继承的概念及定义 1.1 - 继承的概念 1.2 - 继承的定义 1.2.1 - 定义格式 1.2.2 - 继承关系和访问限定符 1.2.3 - 继承基类成员访问方式的变化 2 - 基类和派生类对象赋值转换 3 - 继承中的作用域 4 - 派生类的默认成员函数 5 - 继承与友元 6 - 继承与静态成员 7 - 复杂的菱形继承及

    2024年04月16日
    浏览(41)
  • 【C++航海王:追寻罗杰的编程之路】关于模板,你知道哪些?

    目录 1 - 非类型模板参数 2 - 模板的特化 2.1 - 概念 2.2 - 函数模板的特化 2.3 - 类模板的特化 2.3.1 - 全特化 2.3.2 - 偏特化 2.3.3 - 类模板特化应用实例 3 - 模板分离编译 3.1 - 什么是分离编译 3.2 - 模板的分离编译 3.3 - 解决方法 4 - 模板总结 模板参数分为类型形参与非类型形参。 类型

    2024年04月11日
    浏览(46)
  • 【C++航海王:追寻罗杰的编程之路】关于模板,你知道哪些?

    目录 1 - 泛型编程 2 - 函数模板 2.1 - 函数模板概念 2.2 - 函数模板格式 2.3 - 函数模板的原理 2.4 - 函数模板的实例化 2.5 - 函数参数的匹配原则 3 - 类模板 3.1 - 类模板的定义格式 3.2 - 类模板的实例化 怎样实现一个通用的交换函数? 使用函数重载虽然可以实现,但是有几个不好的

    2024年02月20日
    浏览(36)
  • 【C++航海王:追寻罗杰的编程之路】priority_queue(优先队列) | 容器适配器你知道哪些?

    目录 1 - priority_queue的介绍和使用 1.1 - priority_queue的介绍 1.2 - priority_queue的使用 1.3 - priority_queue的模拟实现 2 - 容器适配器 2.1 - 什么是适配器 2.2 - STL标准库中stack和queue的底层结构 2.3 - deque的介绍 2.3.1 - deque的原理介绍 2.3.2 - deque的缺陷 2.4 - 为什么选择deque作为stack和queue的底

    2024年04月10日
    浏览(46)
  • 【VisualStudio】使用 C++ 语言开发 Qt 环境配置教程

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 先上一张效果图,具体步骤主要分为以下三步。 这一步不再赘述,注意一定要安装 C++ 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 这一步也不再赘述,网上搜索教

    2024年02月10日
    浏览(77)
  • 【VisualStudio】基于 Visual Studio 使用 C++ 语言开发 Qt 环境配置教程

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 先上一张效果图,具体步骤主要分为以下三步。 这一步不再赘述,注意一定要安装 C++ 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 这一步也不再赘述,网上搜索教

    2024年02月15日
    浏览(69)
  • 【C/C++】C语言开发者必读:迈向C++的高效编程之旅

    🧑 作者简介 :阿里巴巴嵌入式技术专家,深耕嵌入式+人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍 :分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导、简历面试辅导、技术架构设计优化、开发外包等

    2024年03月20日
    浏览(50)
  • C++从零开始的打怪升级之路(day11)

    这是关于一个普通双非本科大一学生的C++的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 为了巩固前面的知识,最近更新刷题贴,C++进度暂缓 反转字符串中的单词 III  由于还没学

    2024年01月18日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包