⛳️第二十章 模板 20.1 基本知识 模板 分为类模板+函数模板 使用模板的优势: 通用性: 模板使得可以编写适用于多种数据类型的通用代码,而不需要为每种数据类型编写特定的代码。...通过在编译时生成特定的代码版本,可以避免运行时的性能开销,并在编译时进行类型检查。 代码重用: 使用模板可以创建通用的数据结构和算法,以适应不同的需求。这样可以减少代码的复制粘贴,提高代码的重用性。...T 表示模板参数,T 可以是任何合法的标识符,用于表示函数的参数和返回类型。...在实际调用时,编译器会根据传入的参数类型,自动推导出正确的类型。 待续 函数模板和模板函数区别 函数模板: 函数模板是模板的定义。创建通用函数的机制,其中函数的定义使用模板参数。...double 类型的 Pair 20.2 练习 函数模板简单示例 #include using namespace std; // 函数模板 template <typename
定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。(好吧,咱也听不懂,直接上用法吧?) 用法: 面向对象的继承和多态机制有效提高了程序的可重用性和可扩充性。...在 C++ 中,模板分为函数模板和类模板两种。 函数模板是用于生成函数; 类模板则是用于生成类的。...延申用法 2.1为什么需要类模板 类模板与函数模板的定义和使用类似,我们已经进行了介绍。...c4 << endl; 93 } 94 system("pause"); 95 } 所有的类模板函数写在类的外部,在不同的.h和.cpp中 也就是类模板函数说明和类模板实现分开 //类模板函数...static的作用是将类的成员修饰成静态的,所谓的静态类成员就是指类的成员为类级别的,不需要实例化对象就可以使用,而且类的所有对象都共享同一个静态类成员,因为类静态成员是属于类而不是对象。
一,运算符重载简介 一个运算符本质上是一个函数,因此,运算符重载其实就是函数的重载。 运算符重载的目的就是为系统已有的运算符添加特殊的功能。...这次被重载的函数,全都是运算符函数,运算符函数的定义和普通函数的定义类似,主要区别在函数名称上,函数名称包含operator关键字和运算符。...than box2" << std::endl; 运算符重载分两种情况:成员函数的运算符重载 & 非成员函数的运算符重载 成员函数的运算符重载: 函数为类的方法。...成员函数形式的二元运算符重载: return_type operator X(data_type val); 非成员函数的运算符重载: 函数独立于类,是全局函数,通常为类的友元函数。...包含函数调用运算符的类对象被称为函数对象,或仿函数,开发时可以像使用函数一样使用该对象。 重载的函数调用运算符在类中只能被定义为非静态的函数。 函数对象,可以被当作回调,传给其他函数调用。
一旦自己要设计、开发和调试模板库,就会立即遭遇泛型编程的首要难题:问题的判断、解决都很困难。作者本人就有过由于实在难于调试,因此先改回一般函数,调试完成后再转成模板方式的经历。...例如我们另外设计一个复数类: class Complex { public: double real = 0; double imaginary = 0; }; 同样对它调用add函数:...std::cout << add(Complex{ 1,2 }, Complex{ 2,-3 }); 编译之后,开发环境显示如下: 信息的内容主要有: 出错的位置是代码第22行。...由于这个模板函数已经可以用于整数和双精度数,错误的原因不在模板函数本身,而是在调用模板时使用实际数据Complex。但问题是错误信息并没有提示是哪个调用出的问题。...对策很简单,重载一个针对Complex的+运算符就行了。 C++20新特性之Concept 很快就会正式发布的C++20引入了一个新特性-Concept。简单讲就是描述模板参数的特性和要求。
; //复数类加减法运算重载为成员函数 Complex Complex::operator + (const Complex &c2) const{ //创建一个临时无名对象作为返回值 return...-重载后,表达式 oprd B等同于operator B(oprd,0 ) //重载Complex的加减法和“<<”运算符为非成员函数 //将+、-(双目)重载为非成员函数,并将其声明为复数类的友元,两个操作数都是复数类的常引用...• 将<<(双目)重载为非成员函数,并将其声明为复数类的友元,它的左操作数是std::ostream引用,右操作数为复数类的常引用,返回std::ostream引用 #include using namespace std; class Complex { public: Complex(double r = 0.0, double i = 0.0) : real...使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型) 类模板 template class
针对继承,其构造函数的一般调用顺序为基类构造函数 ---> 成员对象的构造函数 ---> 它自身的构造函数(这里是指初始化列表后大括号内的内容) 类的静态成员(static member)必须在类内声明...在使用类对象时显示的指定模板实参了,不要忘了,另外系统隐藏了一个 类对象,一般两个对象中隐藏第一个*/ 重载>> 和 << 时一般在public处声明(声明时不要忘记它是友元函数...一般将算术操作符定义为非成员函数,如+, - , *, /,不过也可以将它定义成成员函数 friend Complex operator+(Complex a, double b) {return Complex...a和b相加后的结果,这样写是不对的,因为多了一个*/ /*应写成这样*/ Complex(Complex b) { Complex c; ......重载类型转化操作符时应注意1.必须定义为类成员函数. 2.不能指定返回类型。
f被转成double进行计算,结果为4.6 explicit多数用在构造函数处,少数还有在模板处。...---- 函数模板(function template) 使用不需要指定类型。 编译器会自动进行实参推导。 说明: 首先编译模板。 接着再次编译,判断stone类型的运算是否合法。...使用鲫鱼和麻雀构成的pair,然后拷贝到到鱼类和鸟类构成的pair,这样是可以的。反之则不行。 允许或不允许限制的条件为: 下方代码中的构造函数。...——传引用 ---- same signature——相同函数签名,二者无法并存 函数名和参数列表包括后面的const为signature(函数签名) const 是函数签名...delete实际上被分解为两条语句 delete pc; Complex::~Complex(pc); operator delete(pc);//(即 调用free) ---- 重载::operatpr
前言 面向对象,就是将数据和处理这些数据的函数包在一起。数据只有这个函数能够看到,不会和其他的混杂在一起。...并且这几个绝对不可return by reference,因为他们返回的必定是local object,不是赋值给了已经存在的空间位置上,而是从这个函数中创建出一个complex,然后将它返回。...因为它的名字和类名相同,所以他是构造函数,并且它的参数传递的是它本身这种类型,所以叫做copy ctor。 拷贝构造应该做什么? 为传进来的这个蓝本创建足够的空间。...前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。——链接 在有的情况,例如银行的利率,我们就可以将它设置为静态static类型,因为每个人看到的利率都是一样的,只有一份。...function template_函数模板 函数模板不必明确的指出来传入的类型,编译器会进行推导。
避免不必要的模板实例化 模板不要随便实例化,实例化过多模板,或者模板代码多于必要的数量,会增加编译代码的大小和构建时间。...更糟的是,创建shared_ptr实际上需要在堆上分配2次。 然而,make_shared函数可以将其减少为一次。...另外,类似于shared_ptr和make_shared的关系,应该使用make_unique(C++14或更高版本)来创建unique_ptr: std::make_unique<ModelObject_Impl...[16] 优先选择++i而不是i++ ...当语义正确时,前置自增比后置自增更快[17],因为前置自增不需要创建对象副本。...in_place_t及相关内容 知道如何使用in_place_t和相关标签高效创建诸如std::tuple、std::any和std::variant等对象。
Helloworld New Project,创建一个新的C++ 项目,CLion会自动为你生成一个HelloWorld的基本项目。...cpp源文件(注意默认CLion会直接创建.cpp和.h两个文件,这是C++ 源文件和头文件,也可以选择C的.c和.h。...抽象机制 上面反复提到了C++ 的高效优雅的抽象机制。本章将重点介绍这部分内容,主要包括类和模板。 类 类包含具体类,抽象类,类层次(暂理解为继承实现等)中的类。...因此,最好的做法是删除掉默认的拷贝和移动操作,也就是说,我们应该尽量避免使用这两个操作的默认定义。 模板 一个模板就是一个类或一个函数,但需要我们用一组类型或值对其进行参数化。...我们使用模板表示那些通用的概念,然后通过指定实参(比如指定元素的类型为double)生成特定的类型或函数。
(2)C++库:增加了面向对象的库,包含了既有关键功能的类 (3)标准模板库(STL):高效的C++程序库。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。 ...C标准库 1):提供给了22个不同的数学函数,如abs()、sqrt()、exp()等。 2):提供了常用的数学函数,3个特殊函数和2个常量。 ...程序正常结束 3):定义了一个函数assert,用来测试一个条件,并在条件为假时强制程序退出。...C++类库 1):支持字符串处理的类库 2):提供了复数的表示和算法 float_complex类 double_complex类 long_double_complex...几乎所有的标准模板代码采用了类模板和函数模板的形式,因此相比于传统的由函数和类组成的库来说STL提供了更好的代码重用。 :提供了通用的算数算法和STL的一般算法。
T> T max(T a, T b, T c) { if(b > a) a = b; if(c > a) a = c; } //如果不使用函数模板 实现泛型调用 你需要使用指针和2倍数量的参数再加上一个...18.类型转换函数 Complex(double r) { real = r; imag = 0;}//类型转换构造函数 c = c1 + 2.5; //通过类型转换构造函数实现 operator double...dd = c + d; dd = d + c; //类型转换函数实现的Complex与double类型变量相加 ,返回值为double 19.继承与派生 声明派生类的一般形式为: class 派生类名...//在有父类的构造函数、子对象的情况下,如果创建当前的对象 //则构造函数执行的顺序为:父类的构造函数,子对象的构造函数,当前对象的构造函数。...//如果有类A,子类B,B有子对象X,则创建B的对象时,构造函数的执行顺序为A X B 20.多态性与虚函数 抱歉,下面只有概念没有实例,详见课本第6章。
,再说了没有参数我也可以对成员变量赋值把它赋值为0嘛,这个时候就不需要参数我就是固定的写死的就是要给他赋值为0,所以没有参数的构造函数照样具有很巨大的意义。)...在C++中,有一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户显式调用(用户也不能调用),而是在创建对象时自动执行。这种特殊的成员函数就是构造函数(Constructor)。...double r, double i); //设置实部和虚部 }; 上面这个 Complex 类代表复数,没有编写构造函数,因此编译器会为 Complex 类自动生成一个无参的构造函数。...//第二个参数的默认值为0 }; Complex::Complex(double r,double i)//定义构造函数 { real = r; imag = i; } 那么以下语句有的能够编译通过...15,成绩是92.5 李华的年龄是16,成绩是96 第二种改变上述代码(使用构造函数在创建对象的同时可以直接为成员变量赋值) #include using namespace std
//构造:按照分配空间顺序 //析构:按照最后全局、其次静态(static)、再其次以main函数为作用域的对象、再其次当前块为作用域的对象(补充:构造函数,静态的就算在块中,如在for循环中,每一次...dis(a); } //类模板 #include using namespace std; template//必要的声明 T是虚拟类型 class...#include using namespace std; class complex // 类定义 { double real, image; public:...c2.show(); } //类型转换函数,(必须是一个类成员函数 operator double() { return real; } //转换构造函数和类型转换函数有一个共同的特点:...// 编译系统发现“+”左侧的d2是double型,右侧c1是 complex对象,如果没有对“+”重载,就会检测有无类型转换函数,结果发现对double的重载函数,就调用该函数,将complex对象
复杂库实现复杂类以包含笛卡尔形式的复数以及多个函数和重载以对其进行操作。 real() – 它返回复数的实数部分。 imag() – 它返回复数的虚部。...// 演示real()和imag()函数使用的程序 #include // 对于std::complex、std::real、std::imag #include <complex...//说明 arg() 和 abs() 用法的程序 #include // 对于 std::complex, std::abs, std::atg #include using namespace std; // 驱动器功能 int main () { // 驱动程序函数定义复数:(3.0+4.0i) std::complex mycomplex...如果 z = x + iy 是实部 x 和虚部 y 的复数,则 z 的复共轭定义为 z'(z bar) = x – iy,z 的绝对值(也称为范数)定义为: // 说明 norm() 用法的示例 #include
复习题 1.使用成员函数Stonewt类重载乘法运算符,该运算符将数据成员与double类型的值相乘。注意使用英石和磅表示时,需要进位。...=(this->pounds*a)%14; return *this; } 2.友元函数和成员函数之间的区别是什么?...4.使用友元函数为Stonewt类重载乘法运算符,该运算符将double值与Stone值相乘。...7.为Vector类定义一个转换函数,将Vector类转换为一个double类型的值,后者表示矢量的长度。...接着报告最小的元素、最大的元素以及大于或等于11英石的元素数量(最简单的方法是创建一个Stonewt对象,并将其初始化为11英石,然后将其同其他对象进行比较)。
复习题 1.使用成员函数Stonewt类重载乘法运算符,该运算符将数据成员与double类型的值相乘。注意使用英石和磅表示时,需要进位。...->pounds*a)%14; return *this; } 2.友元函数和成员函数之间的区别是什么?...4.使用友元函数为Stonewt类重载乘法运算符,该运算符将double值与Stone值相乘。...7.为Vector类定义一个转换函数,将Vector类转换为一个double类型的值,后者表示矢量的长度。...接着报告最小的元素、最大的元素以及大于或等于11英石的元素数量(最简单的方法是创建一个Stonewt对象,并将其初始化为11英石,然后将其同其他对象进行比较)。
运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。...因此: (1) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。 (2) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。...4.两种重载形式的比较 在多数情况下,将运算符重载为类的成员函数和类的友元函数都是可以的。...include #include using namespace std; class Complex{ public: Complex(double r=0.0,double i=0.0){ real...double real; double image; }; Complex operator+(const Complex &c1,const Complex &c2){ return Complex
声明一个 circle 类,有数据成员 Radius(半径,float型),成员函数 GetArea() 计算圆的面积,在main 函数中声明一个cirlce类的对象 c1,其半径为 5.6,调用 GetArea...声明复数类Complex,该类中有两个私有变量 real 和 imag,分别表示一个复数中的实部和虚部,请添加一个友元函数add实现 复数的加法。...请用C++代码描述这两个类,并用 Employee 类的成员函数 Display 实现雇员的姓名、年龄、性别、部门和薪水的输出。...在每个派生类都包含一个函数 area(),分别用来计算矩形和等腰三角形的面积。...用虚函数分别计算几种图形面积、并求它们的和。要求用基类指针数组,使它每一个元素指向一个派生类对象。
题目描述 复数类的声明如下: 要求如下: 1.实现复数类和友元函数addCom和outCom。 2. ...参考addCom函数为复数类增加一个友元函数minusCom,用于实现两个复数的减法 3.在main函数中,通过友元函数,实现复数的加减法和复数的输出。 输入 第1行:第1个复数的实部和虚部。...输出 每行输出复数运算后的结果,复数输出格式为“(实部,虚部)”。...注意到实现加减法的两个成员函数的返回值是complex类,这意味着我们需要在函数体内创建一个complex类对象,为了方便,我们使用带参数的构造函数,直接将两个复数的实部虚部做运算作为构造函数的参数,然后直接返回这个类对象...AC代码 #include using namespace std; class complex { public: complex(); complex(double r
领取专属 10元无门槛券
手把手带您无忧上云