C++学习笔记12:转换函数+智能指针+模板

好久没有更新博客了,最近因为疫情搞得状态也不是特别好,现在逐渐看到了点希望。之前也计划5月份将侯捷老师C++的课程学习完毕,现在是时候做个总结了,只有总结了,才觉得学到了。

Conversion function 转换函数

  1. 转换函数是一种特殊的成员函数,可以实现对于对象类型之间的数据类型的转换,比如double转int。
  2. 转换函数的写法为关键词 + 转换的类型,需要注意的一点为函数声明不需要有参数,也没有返回类型,在函数签名末尾要加上const
	operator double() const{
		return (double)(m_numberator / m_denominator);
	}
  1. 转换函数的具体应用场景如下:声明一个对象f,即分数,现在要实现f这个对象+4,也就是加上一个整数,这个做法在数学中是说的过去的,但是如果在C++中要实现,就要手动编写f的转换函数。
	Fraction f(3,5); //Fraction是一个类,其中已经写好其构造函数
	double d = f+4;  //具体的应用场景,此时编译器会查找有没有f转double的函数,如果有编译继续,如果没有,则编译失败。

未编写转换函数报错结果
4. non-explicit-one-argument ctor 非explict一个实参的构造函数,这种构造函数可以将非对象变量的数据转换成与对象相对应的数据类型。使用的常见如下,但是要注意的是如果你在类的声明中书写了转换函数,那么你的编译器就会报错,因为他不知道选择那个函数进行编译。

	Fraction d2 = f+4; 

为了防止上述错误额发生,一般在有转换函数的类对于构造的声明中,需要加上explict关键词。explict意思为明白的,可以防止对于上述应用中变量类型的自动转换。
5. 对于转换函数,存在转过去,和转过来两种情况。上述的例子属于转过去,即把声明的对象类型转换成想要的类型,还有一种就是转过来,这种情况下,就是转换类型卸载operator前面。

	reference operator[](size_type n)

Smart Pointer 智能指针

  1. 所谓的智能指针也被称为像指针,指的是声明的一个类像指针,具有指针必有的功能,同时比指针更加的强大,也就是智能指针。
  2. 智能指针这个类中包含着一个普通的指针。
  3. 在这个类的声明中,为了要完成指针的基本功能,需要声明两个函数,分别如下:
	T& operator*() const{};
	T& operator->() const{};

对于->符号比较特殊,可以作用两次。*符号就是取值。
4. 和智能指针类似的还有一个叫做仿函数,仿函数的概念和指针指针的类似,也是声明了一个类,这个类像函数,比函数功能更加的强大。见下面例子:

template 
struct identity {
	const T&
	operator()(const T& x)const{return x;}
};

Template 模板

  1. 类模板,也就是在前期声明类时,对于类中的变量不能确定,或者这个类中的变量存在多个类型,这时就需要用上类模板。
  2. 函数模板,所谓就是对于一个函数在声明时不确定其输入参数的类型,不确定其输出参数的类型,这个时候就需要使用模板。在使用模板额过程中,需要对于模板中的操作进行重载,也就是重新定义,具体的例子如下:
template 
inline
const T& min(const T& a, const T& b){}
  1. 成员模板,就是一个成员函数,其声明的形式采用模板的方式。需要注意的一点就是成员模板向上兼容,成员模板可以作为父其本身的参数。代码说明如下:
pair p2(pair()); //Derived1 is a Base1
// ! pair p2(pair());反之不行
  1. 模板特化,也就是写的一个特殊的模板,这里的特殊可以指返回的类型等等。
template<>
struct hash{   //special hash
	size_t operator()(char x ) const{return x;}
};
  1. 模板偏特化,分为两种,一种是个数上的偏指的是一个模板具有多个模板变量,在书写时只对其中某几个变量进行特殊化处理。另外一种指的是范围的偏。
  2. template,template,parameter,模板模板参数。
	template     //<> typename <-> class
	class SmartPtr
	>
	class XCls
	{
	private:
		SmartPtr sp;   //List container   have second/third default value 
	public:
		XCls() : sp(new T) { }
	};
	/------------------使用--------------------------/
	XCls p1; //模板 模板 参数,可以声明指针或者容器,在声明时指明其内部变量的参数。
	

以上就是这篇文章的大致内容,讲述了转换函数,还有模板,智能指针等一些概念,还有一个没有展开写就是标准库,标准库的重要性不言而喻,这里先暂时提一下,等后面用到了再来说。还是那句话,写博客的目的不仅仅展现自己的学习成果,更能加深自己的学习印象,加油!

你可能感兴趣的:(C++语言,c++,学习,开发语言)