首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【笔记】C++标准库: 体系结构与内核分析(上)

核心区别是OOP将数据与算法封装在一起, 而GP追求将数据与算法分离开来, 让算法通过相同的接口操作不同的数据. GP的好处是能让算法团队和数据团队各自独立运作, 只要确定好沟通的接口即可....阅读GP的代码, 核心是理解操作符重载和模板操作....进行操作符重载的时候, 主要要注意尽量不要重载&&, ||和,, 因为它们重载之后将失去短路求值和顺序求值的特性, 退化回不定序求值的函数操作....重载操作符的时候要尽量使其效果与int类型操作看齐, 不要乱改导致语义混乱加大理解难度, 且操作符重载无法改变操作符的优先级, 组合, 参数个数等....尽管原生指针本身就具有正确的运算符, 但是原生指针没有办法返回上面的5个性质. 为了解决这个问题, STL提出了萃取器Traits结构作为中间层.

1.2K30

【C++修行之道】类和对象(四)运算符重载

一、 运算符重载 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...函数名字为:关键字operator后面接需要重载的运算符符号。 函数原型:返回值类型 operator操作符(参数列表)。...注意: 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型参数 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义 作为类成员函数重载时...他们之间各论各的,没有关系 运算符重载:让自定义类型可以使用运算符,并且控制运算符的行为,增强可读性 函数重载:可以让函数名相同,参数不同的函数存在。 多个同一运算符的重载可以构成函数重载 二、....有没有办法不生成拷贝?

10110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    运算符重载----学校版本

    ,虚部和虚部的相加; (2)我们定义了一个复数类,使用运算符的重载实现这个复数的加减操作; (3)这个就是我们重载的一个普通的全局函数,相当于就是对于加号这个运算符的重载,参数是引用类型的,所以前面最好是加上...,具体的操作方法如下; (2)就是在这个类里面进行声明,外面进行定义,需要注意的是即使是执行的减法运算,和加法的相同点就在于这两个运算的操作数都是两个,但是具体写在参数位置的时候,就不会写2个,成员函数只需要写一个参数...1,重载为普通函数的时候,这个参数的个数就是我们的操作符的目数(目数就可以简单的理解为这个操作数的个数);  3.重载为友元函数 (1)大部分情况下,这个运算符重载为成员函数就是最好的选择; (2)但是在一些情况下面...,我们使用这个成员函数是没有办法满足需求的,但是使用这个普通的函数有没有办法去访问这个私有的成员变量,这个时候我们就应该设置为这个友元类的函数; (3)什么情况下是没有办法满足需求呢?...,我就在想,这样做的话,这个友元函数的作用好像是可有可无的,因为我初始的时候认为搞两个成员函数不就可以了吗,但是实际上这个会出错,报错的信息就是参数过多,可能是因为这个地方我们对于这个加号运算符重载两次导致的

    6500

    C++从入门到精通——类的6个默认成员函数之赋值运算符重载

    class Date {}; 一、运算符重载 定义 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似...函数原型:返回值类型 operator操作符(参数列表) 注意: 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型参数 用于内置类型的运算符,其含义不能改变...函数重载是指在同一个作用域中定义多个具有相同名称但参数列表不同的函数。这样做的目的是为了提供更灵活的函数调用方式,使得同一个函数名可以根据不同的参数类型或参数个数执行不同的操作。...参数列表变化:函数重载通过改变参数列表来定义多个同名函数,而运算符重载通过改变函数参数或者在类中定义成员函数重载运算符。...总结 函数重载:可以让函数名相同,参数不同的函数同时存在 运算符重载:让自定义类型可以使用运算符,并且控制运算符的行为,增强可读性 他们之间各论各的,没有关系 多个同一运算符重载可以构成函数重载

    13710

    【C++初阶】一文讲通默认成员函数~类和对象(中)

    但是对于自定义类型成员变量,C++要求调用这个成员变量的默认构造函数初始化,如果这个成员变量没有默认构造函数就会报错,如果我们坚持要使用这个没有默认构造的成员变量,必须使用初始化列表才能解决,初始化列表在下篇博客讲解...拷贝构造函数也可以多个参数,但是第一个参数必须是类类型对象的引用,后面的参数必须有缺省值。...和其他函数一样,它也具有其返回类型和参数列表以及函数体。重载运算符函数的参数个数和该运算符作用的运算对象数量一样多。 举例:Date 类中重载比较和赋值操作符。...:)以上5个运算符不能重载。 重载操作符至少有一个类类型参数,不能通过运算符重载改变内置类型对象的含义, 如在Date类中重载加法操作符 int operator+(int x,int y)。...取地址运算符重载 6. 1 const成员函数 被 const 修饰的成员函数称为 const 成员函数,const 修饰成员函数放到成员函数参数列表的后面。

    12910

    CC++ 最常见50道面试题

    注意:编程时 static 的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而 C++的静态成员则可以在多个对象实例间进行通信,传递信息。... 参数的区别:被重写函数和重写函数的参数列表一定相同,而被重载函数和重载函数的参数列表一定不同。... 与重载的范围不同:和重写一样,隐藏函数和被隐藏函数不在同一个类中。  参数的区别:隐藏函数和被隐藏的函数的参数列表可以相同,也可不同,但是函数名肯定要相同。...注意:在直接选择排序中,具有相同关键码的对象可能会颠倒次序,因而直接选择排序算法是一种不稳定的排序方法。...解决办法:指针指向的内存空间被释放后指针应该指向 NULL。 (3) 指针操作超越了变量的作用范围。解决办法:在变量的作用域结束前释放掉变量的地址空间并且让指针指向 NULL。

    8.1K10

    框架设计原则和规范(二)

    如果希望让派生类对于显式实现接口的成员进行定制,应该提供具备实现接口成员的相同功能的受保护的虚成员。 派生类不能直接覆盖那些显式实现接口的方法 2.1.3....要把构造函数的参数列表当作设置主要属性的快捷方式 2.3.4. 要用相同的名字来命名构造函数的参数和属性,如果定义该构造函数参数的目的就是为了设置对应的属性。...除非类型像个基本(内置)类型,否则别用操作符重载 2.7.2. 考虑在让人感觉应该像基本类型的类型中定义操作符重载 比如System.String的operator==和 operator !...考虑为每个重载过的操作符提供对应的方法,并用容易理解的名字命名 有一个对应操作符的方法名官方列表 operator-() Subtract() 2.7.8....考虑在简单的重载中使用params 2.8.9.5. 要对参数进行合理的排序 2.8.9.6.

    1.4K50

    【C++】类与对象理解和学习(中)

    构造函数可以重载(可以存在多个构造函数,但默认构造函数只有一个) (当然现阶段初始化的方式本质实际上是通过函数体赋值实现,并不是完全意义上的初始化,后面的章节会讲到初始化列表,通过初始化列表实现真正意义上的初始化...我们把它放在后面一章来讲解关于初始化列表相关知识及注意点) 析构函数 析构函数的作用就是对类对象中的资源进行清理,它的创建方式与构造函数大致相同: 析构函数名是在类名前加上字符 ~。...它的创造规则如下: 与构造函数相同 这里需要注意的是拷贝构造函数只有一个参数,并且这个参数必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。...实际上运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名为:关键字operator后面接需要重载的运算符符号。...函数原型:返回值类型 operator操作符(参数列表) 这里还有以下几点需要注意: 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型参数 用于内置类型的运算符

    53630

    【C++系列(合集)】特性多又复杂?不存在!——这篇C++大全直接干碎(超级大全,精讲)

    虽然有多个参数,但是创建对象时后两个参数可以不传递,没有使用explicit修饰,具有类型转 换作用 // explicit修饰构造函数,禁止类型转换 explicit Date(int year,...:关键字operator后面接需要重载的运算符符号 函数原型:返回值类型+operator操作符+(参数列表) 例:转化演示 注意: 不能通过连接其他符号来创建新的操作符:例如operator...@ 重载操作符必须有一个类类型参数 用于内置类型的运算符,其含义不能改变:例如+ 作为类成员函数重载时,其形参看起来比操作数少一个(因为成员函数的第一个参数为隐藏的this) .* / :: /sizeof...这两个默认成员函数一般不用重新定义 ,编译器默认会生成 这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如不想让别人获取到指定的内容!...一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模 板产生出一个实例

    25610

    读完某C++神作,我只记下了100句话

    定义的多个变量具有相同的类型,就可以在for循环的初始化语句中同时定义他们。for(int a, b, c ...)...声明而不定义成员函数是合法的,但是使用将导致链接失败。将复制构造函数声明为private可防止复制。定义了复制构造函数,也必须定义默认构造函数。 重载赋值操作符=,隐含的第一个参数this。...重载操作符:保留字operator后面接需要定义的操作符符号,返回类型和参数表和其它函数一样。只能重载已有的操作符,只针对类类型,最好重载原本对类类型无意义的操作符。...使用算法sort等时会假定一些操作符(重载操作符。重载操作符如果是成员函数,左操作数必须是该类的对象【一定是this】。 用函数或类操作某个类的数据可设置其为友元。...T>模板定义以关键字template开始【旧程序中可能用class】,后接模板形参表,模板形参表是由尖括号扩住的一个或多个模板形参的列表,以逗号分隔。

    1.4K20

    学了C++不会STL,简直少了左膀右臂

    切不可赋值给int ,很容易超过int的范围 TYPE&top()————> 查看当前栈顶元素; List 定义:List类表示可通过索引访问的对象的强类型列表,提供用于对列表进行搜索、排序和操作的方法...作用: 泛型最常见的用途是泛型集合 我们在创建列表类时,列表项的数据类型可能是int,string或其它类型,如果对列表类的处理方法相同, 就没有必要事先指定数据类型,留待列表类实例化时再指定。...一般以32位整数的运算次数为基准估算运行时间,n位bitset执行一次的位运算复杂度可视为n/32,效率较高。头文件。 同样具有~,&,|,^,>操作符,==,!...重载版本中使用了用户自定义操作符。...重载版本使用输入的操作符代替默认的等于操作符。 includes: 判断第一个指定范围内的所有元素是否都被第二个范围包含,使用底层元素的操作符,成功返回true。

    82720

    数据库PostrageSQL-排序规则支持

    这会在使用例如ORDER BY子句以及函数或操作符调用(如的排序规则就是排序键的排序规则。应用于函数或操作符调用的排序规则从它们的参数得来,具体如下文所述。...对于一个函数或操作符调用,其排序规则通过检查在执行指定操作时参数的排序规则来获得。...当多个排序规则需要被组合时(例如在一个函数调用中),将使用下面的规则: 如果任何一个输入表达式具有一个显式排序规则派生,则在输入表达式之间的所有显式派生的排序规则必须相同,否则将产生一个错误。...PostgreSQL在碰到具有相同属性的不同排序规则对象时会认为它们是不兼容的。...因此对于例子: SELECT a COLLATE "C" < b COLLATE "POSIX" FROM test1; 将会得到一个错误,即使C和POSIX排序规则具有相同的行为。

    1.5K20

    【C++】STL 算法 ① ( STL 算法相关头文件 | 函数对象 仿函数 简介 | 函数调用操作符 | 重写函数调用操作符的类 | 函数对象 与 普通函数区别 )

    { return (a 排序 } }; 创建 仿函数类 的 函数对象 , 然后通过 函数对象 调用 仿函数类 中的 " 重载 函数调用操作符 () 函数 " ; //..., 通常是一对圆括号 () ; 在 C++ 语言中 , 函数调用操作符都扮演着重要的角色 ; " 函数调用操作符 " 的 主要作用是 将 函数 与其 参数 联系起来 , 并执行函数的代码 ; 函数调用操作...: 首先 , 在调用函数之前 , 必须 先 定义函数 并 指定其 参数列表 ; 然后 , 使用 函数调用操作符 告诉编译器将这些参数传递给函数 , 并执行函数的代码 ; 最后 , 函数执行后 , 将函数的返回值可以被赋值给变量...本质是 类对象 , 其表现出一个函数的特征 , 通过该对象可以调用函数 , 通过对象名(参数列表) 的方式 可以调用 重载 () 运算符函数 , 如果没有 创建该 函数对象的 上下文 代码 , 完全可以...因为 编译器可以进行内联优化 ; 普通函数 : 英文名称 " Ordinary Functions " ; 定义 : 普通函数 是 C++ 言 中的 重要组件 , 通过函数名后跟括号和参数列表来调用

    30910

    【C++ 初阶路】--- 类和对象(末)

    修饰,权限放大 非const成员函数内可以调用其它的const成员函数 -> 权限缩小 1.1 取地址及const取地址操作符重载 这两个默认成员函数一般不用重新定义 ,编译器默认会生成。...,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!...return 0; } 虽然有多个参数,但是创建对象时后两个参数可以不传递,也具有类型转换作用,如下日期类: Date(int year, int month = 1, int day = 1)...友元分为:友元函数和友元类 4.1 友元函数 问题:现在尝试去重载operator办法将operator重载成成员函数。...this指针); 友元函数可以在类定义的任何地方声明,不受类访问限定符限制; 一个函数可以是多个类的友元函数; 友元函数的调用与普通函数的调用原理相同; 4.2 友元类 友元类的所有成员函数都可以是另一个类的友元函数

    8010

    2018年百度大神讲解 JAVA基础知识解析(重点)

    &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !...重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。...如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。...但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。...overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。

    62330

    疯子的算法总结(二) STL Ⅰ 算法 ( algorithm )

    补充:捕获值列表,是允许我们在Lambda表达式的函数体中直接使用这些值,捕获值列表能捕获的值是所有在此作用域可以访问的值,包括这个作用域里面的临时变量,类的可访问成员,全局变量。...重载版本中使用了用户自定义操作符。...重载版本使用输入的操作进行排序。 merge: 合并两个有序序列,存放到另一个序列。重载版本使用自定义的比较。...partial_sort: 对序列做部分排序,被排序元素个数正好可以被放到范围内。重载版本使用自定义的比较操作。...重载版本使用输入的操作符代替默认的等于操作符。 includes: 判断第一个指定范围内的所有元素是否都被第二个范围包含,使用底层元素的操作符,成功返回true。

    48340

    【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

    我们发现自动生成的拷贝构造函数,让两个不同的对象中的 _arr 的地址相同,这样只要其中一个对象的 _arr 改变,另一个对象里的 _arr 也会改变,这并不是我们想要的结果,而且同一个地址还会被析构两次...运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似; 函数名字为:关键字operator后面接需要重载的运算符符号; 函数原型:返回值类型... operator操作符(参数列表); 运算符重载的函数的调用和一般的函数也是一样的,只不过运算符重载的函数名有点特殊而已。...注意: 1.不能通过连接其他符号来创建新的操作符:比如operator@; 2.重载操作符必须有一个类类型参数; 3.用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义;..._day; } 前置++和后置++重载 前置++和后置++,都会都数据++,它们的运算符相同,但它们的返回值不同,那么该如何去们呢?

    15310

    问题整理

    这是异步没有办法实现的,因此同步的存在一定有他存在的道理。   重载重写 重载(Overloading)  方法重载是让类以统一的方式处理不同类型数据的一种手段。...多个同名函数同时存在,具有不同的参数个数/类型。 重载Overloading是一个类中多态性的一种表现。...Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。 调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。  ...父类的方法被protoeted时,不仅在同一包中,被其子类被重写,还可以不同包的子类重写。 重写方法的规则: 1)、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。...而重载的规则: 1)、必须具有不同的参数列表; 2)、可以有不同的返回类型,只要参数列表不同就可以了; 3)、可以有不同的访问修饰符; 4)、可以抛出不同的异常; 重载和重写(覆盖)的特点: 1.

    1.2K40

    几个提升Go语言开发效率的小技巧

    可变长参数 Go语言允许一个函数把任意数量的值作为参数,Go语言内置了...操作符,在函数的最后一个形参才能使用...操作符,使用它必须注意如下事项: 可变长参数必须在函数列表的最后一个; 把可变长参数当切片来解析...,可变长参数没有没有值时就是nil切片 可变长参数的类型必须相同 func test(a int, b ...int){ return } 既然我们的函数可以接收可变长参数,那么我们在传参的时候也可以传递切片使用......进行解包转换为参数列表,append方法就是最好的例子: var sl []int sl = append(sl, 1) sl = append(sl, sl...)...我们在声明数组时一定要声明长度,因为数组在编译时就要确认好其长度,但是有些时候对于想偷懒的我,就是不想写数组长度,有没有办法让他自己算呢?...,还要绞尽脑汁的给他想一个命名,有没有办法可以不处理不要的返回值呢?

    91230

    【C++】类和对象(第二篇)

    那现在我们学了C++,有没有什么好的办法可以帮助我们解决这个问题呢? 可不可以像上面的构造函数自动初始化一样自动对对象中的资源进行清理呢?...概念 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。...函数名字为:关键字operator后面接需要重载的运算符符号 函数原型:返回值类型 operator操作符(参数列表) 那我们接下来就来练习一下: 上面我们不是相比较两个日期类对象是否相等嘛,那我们就来重载一下...C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象) 所以我们这里只需给一个参数就够了。...注意 下面我们一起来看一下,在运算符重载这一块,需要注意的一些内容: 不能连接其他符号来创建新的操作符:比如operator@ 重载操作符至少有一个类类型的参数 用于内置类型的运算符,其含义不能重载改变

    12410
    领券