C++入门到精通——第八章 未归类知识点

八、未归类知识点

Author: XFFer_

01 函数调用运算符、function类模版

1 函数调用运算符
2 map类模版
3 function类模版

函数调用运算符

(),如果在类中重载了函数调用运算符(),那么就可以像使用函数一样使用该类的对象了,对象(实参)
system("pause");暂停程序运行,等待任意键继续执行。

class biggerthan
{
   
public:
	int operator()(int getvalue) const
	{
   
		if (getvalue < 0)
			return 0;
		return getvalue;
	}
};
biggerthan bgt;
int result = bgt(200);
//int result = bgt.operator()(200);

结论:只要对象所属的类重载了()“函数调用运算符”,这个类对象就变成可调用对象,并且可以调用多个版本的(),只要重载()参数列表有明显差异。

不同调用对象的相同调用形式

调用参数返回值类型相同,叫做“调用形式”相同。
一种调用形式对应一个函数类型(如int(int))。

map模版

map 也是一个类模版/容器,但是不同于vector,map里每一项是两个数据,一个叫“”,一个叫“”。

int func (int value);
#include <map>
map<string, int (*) (int)> func_bag;	//map每项有两个数据,这里第一个数据是字符串,第二个数据是int(int)函数类型的指针
func_bag.insert("src", func);
//map<string, function<int (int)> func_bag = {
   {"src", func}};

func_bag["src"](3);	//func_bag[键]就是map里面的值,也就是函数的入口地址

insert({ , }) 用于向map中插入对象。map也有迭代器(回忆:vector的insert功能是用迭代器(指针)向它指向的地址插入对象)

标准库function类型介绍

function也是类模版,要提供模版参数来表示该function类型能够表示的“对象的调用形式”。

#include <functional>
functional<int(int)> f1 = func;	//统一调用形式,可以用内部重载()的类对象赋值给f1

02 万能引用universal reference

1 类型区别基本概念
2 universal reference/万能引用/未定义引用 基本认识
3 万能引用资格的剥夺与辨认

universal reference/万能引用/未定义引用 基本认识

万能引用的语境:

  • 必须是函数模板
  • 必须是发生了模板类型推断并且函数模板形参样子是 T&&;auto也有万能引用的概念
template <typename T>
void func(T&& src)	{
   }

int i = 10; 
func(i);
func(std::move(i));

万能引用和右值引用解释起来的区别

  • 右值引用需要传递右值,否则编译器报错(左值、右值的概念在第2章第12节曾经讲过)
  • 万能引用做函数形参时,我们可以传递给它左值,也可以传递给它右值
    • 传递左值时,这个万能引用就变成了左值引用
    • 传递右值时,这个万能引用就变成了右值引用
template <typename T>
void func(std::vector<T>&& tmp)	{
   }

这是一个右值引用!!!不是万能引用T&&是连续的。T可以被其他命名替换。

const修饰词会剥夺万能引用的资格,而变成右值引用。

03 理解模板类型推断、查看类型推断结果

1 如何查看类型推断结果
2 理解模板类型推断

如何查看类型推断结果

依赖boost

boost库下载链接
需要将下载路径配置到Visual Studio属性管理器的VC++目录的包含目录中。

用boost库返回类型推断结果
#include <boost/type_index.hpp>

template <typename T>
void myfunc(const T& tmprv)
{
   
	using boost::typeindex::type_id_with_cvr;
	cout << "T=" << type_id_with_cvr<T>().pretty_name() << endl;
	cout << "tmprv=" << type_id_with_cvr<decltype(tmprv)>.pretty_name() << endl;
}

理解模板类型推断

  • 万能引用
#include <boost/type_index.hpp>

template <typename T>
void myfunc(T&& tmprv)
{
   
	using boost::typeindex::type_id_with_cvr;
	cout << "T=" << type_id_with_cvr<T>().pretty_name() << endl;
	cout << "tmprv=" << type_id_with_cvr<decltype(tmprv)>.pretty_name() << endl;
}

int i = 10;
myfunc(i);	//结果是T= int &, tmprv= int &
myfunc(100);	//结果是T= int, tmprv= int &&

//这里包含了引用折叠的知识,会在下一节讲到
  • 如果传递的是const char*const(第一个const代表指向的对象不能改值,第二个const代表不能改变指向的对象),当传入模板时,返回“T=const char*”“tmprv=const char*”,即可以改变指向的对象,但不可改动该对象的值

04 引用折叠,转发、完美转发,forward

1 引用折叠规则
2 转发、完美转发
3 std::forward
4 std::move和std::forward的区别

hook
template <typename T>
void func(T&& tmprv) {
   }	//万能引用

int i = 10;
func(i);	//借用上一节的boost库判断类型
			//这里返回T = int&, tmp = int&

假如我们将推断出的T = int&带入到实例化的模板中

void func(in
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果要推荐一本关于C语言入门精通的书,我会推荐《C Primer Plus》这本经典著作。 《C Primer Plus》是一本由Stephen Prata所著的C语言入门教材。该书以简洁明了的语言和丰富的示例代码帮助读者逐步学习和理解C语言的基础知识和高级特性。无论是初学者还是有一定编程经验的读者,都能从这本书中获得实用的指导和深入的知识。 这本书内容丰富,包括了C语言的基本语法、控制流、函数、数组、指针、字符串处理、结构体、文件输入输出等。通过系统化的学习,读者可以逐步掌握C语言的编程思想和技巧,并能够运用它们进行实际项目的开发。 《C Primer Plus》以递进的方式介绍概念并强调实践。每个章节都提供了大量的练习和编程项目,帮助读者巩固所学知识并培养编程能力。此外,书中还提供了源代码和额外的在线资源,方便读者进行实践和进一步学习。 总而言之,如果你想从零开始学习C语言,或者想进一步提升自己的C语言技能,那么《C Primer Plus》是一本非常推荐的书籍。通过阅读并完成相关练习,你将能够逐步掌握C语言的核心概念和编程技巧,从而达到精通C语言的水平。 ### 回答2: "c 入门精通" 这本书是一本介绍编程语言C的学习指南。它从基础入门一直到深入的精通阶段,涵盖了C语言的各个方面,是学习和掌握C语言的良好起点。 首先,这本书以浅显易懂的方式介绍了C语言的基本概念、语法和编码规范。它逐步引导读者了解变量、数据类型、运算符和控制流等基础要素,并附有示例代码帮助读者理解和实践。 在学习的过程中,这本书提供了大量的编程练习和项目案例,帮助读者巩固知识并提高实践能力。通过逐步构建各种应用程序,读者可以逐渐掌握C语言的编程技巧和常见问题的解决方法。 此外,这本书还介绍了C语言的高级功能和特性,如指针、内存管理和文件操作等。它详细解释了这些复杂概念的原理和用法,并提供了实践指导,帮助读者理解并正确应用。 随着阅读深入,这本书逐渐引导读者进入C语言的精通阶段。它涵盖了高级主题,如模块化编程、数据结构和算法。读者将学习如何编写可扩展性强、高效且可维护的代码。 总的来说,"c 入门精通"这本书是一本全面而深入的C语言学习指南。它适合初学者入门,也适合有一定经验的程序员提高技能。通过阅读这本书并进行实践,读者可以逐步掌握C语言的基础知识、高级功能和编程技巧,从而达到精通C语言的水平。 ### 回答3: 《C程序设计语言》- C入门精通的经典之作。这本书由Brian W. Kernighan和Dennis M. Ritchie合著,是C语言领域最为知名的教材之一。 《C程序设计语言》首次出版于1978年,以其简明扼要的风格和深入浅出的教学方法备受推崇。本书从基础概念入手,通过逐步引导读者理解C语言的核心原理和特性,帮助读者逐渐掌握C编程的技术与技巧。 在《C程序设计语言》中,作者详细介绍了C语言的语法、数据类型、变量、运算符、流程控制等基本概念。紧接着,书中引入了函数、指针、数组、结构体等更高级的特性,并提供了大量实例来帮助读者巩固所学知识。 此外,书中还深入讨论了C语言的高级主题,例如内存管理、输入输出、文件操作、动态内存分配等。通过详细解释这些关键概念和技术,读者能够逐步提高自己在C语言开发方面的技术水平。 《C程序设计语言》的魅力在于其深入浅出的讲解风格和丰富的实例。这些例子不仅涵盖了C语言的各个方面,还包括程序设计中常见的问题和技巧。通过实例的学习,读者能够更好地理解和应用所学知识。 总之,《C程序设计语言》是学习C语言的一本理想教材。无论您是初学者还是有经验的程序员,这本书都能够帮助您从入门精通C语言,成为一名优秀的C开发者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值