Effective C++ 笔记4

基于Python的携程景点评价爬虫与情感评分分析 摘要: 本项目通过Python技术栈实现携程景点评论的情感分析系统,包含数据爬取、文本预处理、情感评分和可视化分析全流程。使用requests抓取评论接口,jieba进行中文分词,SnowNLP计算情感得分(0-1),并通过词云、情感分布图呈现结果。典型分析显示72%评论为正面,负面反馈多涉及"排队久""票价贵"等问题。系统可辅助景点口碑管理,扩展方向包括多景点对比、BERT模型优化等。项目强调需遵守爬虫伦理,控制请求频率,适用于非商业用途的旅游数据分析。(150字) 阅读详情

本文内容基本来自于《Effective C++》一书,为学习后的笔记,以便温故。


《Effective C++ 》第 4节  设计与声明

(1)条款18:让接口容易被正确使用,不易被误用

         好的接口很容易被正确使用,不容易被误用。

         “促使正确使用”的办法包括接口的一致性,以及内置类型的行为兼容。

         “阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。

          tr1::shared_ptr支持定制型删除器,这可防范DLL问题(跨DLL之new/delete成对运用),可被用来自动解除互斥锁。但是这种智能指针在防范用户出现错误的同时,增加了系统的开销,boost库中shared_ptr的大小是原始指针的两倍大。所以需要综合考虑其执行成本。

(2)条款19:设计class犹如设计type

          如何设计高效的classes,首先需要了解你面对的问题,几乎每一个class都要求你面对以下提问:

         新type的对象应该如何被创建和销毁?涉及到构造函数和析构函数以及内存分配函数,释放函数的设计

         对象的初始化和对象的赋值该有什么样的差别?这个答案决定你的构造函数和赋值操作符的行为,以及期间的差异。

        新type的对象如果被passed by value,意味着什么?copy构造函数用来定义一个type的pass by value该如何实现

        什么是新type的“合法值”?对class的成员变量而言,通常只有某些数值集是有效的。

(3)条款20:宁以pass-by-reference-to-const替换pass-by-value

          例如:bool validateStudent(Student s);

                      Student plato;

                      当调用此函数的时候,把plato当作函数的参数,此时首先Student的构造函数会被调用,以plato为蓝本将s初始化,同样,在函数返回时,会将s销毁。因此对于该函数而言,参数传递的成本是:一次copy构造函数的调用,一次析构函数的调用。当然,当Student类中还存在其他对象的话,那这个代价就不只一次copy,一次析构了。

         所以:尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并可避免切割问题。

                     以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对他们而言,pass-by-value往往比较适当。

(4)条款21:必须返回对象时,别妄想返回其reference

          绝不要返回pointer或者reference指向一个local  stack对象,或者返回reference指向一个heap-allocated对象,或者返回pointer或者reference指向一个local static对象而有可能同时需要多个这样的对象。

(5)条款22:将成员变量声明为private

        切记将成员变量声明为private, 这可赋予客户访问数据的一致性,可细微划分访问控制,允诺约束条件获得保证,并提供class作者以充分的实现弹性。

       protected并不比public更具封装性。

(6)条款23:宁以non-member,non-friend替换member函数

          如果某些东西被封装,它就不再可见,愈多东西被封装,愈少人可以看到它。而愈少人看到它,我们就有愈大的弹性去改变它,因为我们的改变仅仅直接影响看到改变的那些人事物。因此,愈多东西被封装,我们改变那些东西的能力也就愈大。这就是我们首先推崇封装的原因:他使我们能够改变事务而只影响有限客户。

         现在考虑对象内的数据。愈少代码可以看到数据,愈多的数据可被封装,而我们也就愈能自由的 改变对象数据。

         条款这样做可以增加封装性,包裹弹性和机能扩充性。

 (7)条款24:若所有参数皆需类型转换,请为此采用non-member函数

           只有当参数被列于参数列内,这个参数才是隐式类型转换的合格参与者。地位相当于“被调用之成员函数所隶属的那个对象”-----即this对象------的那个隐喻对象,绝不是隐式转换的合格参数者。

            如:const Rational operator* (const Rational& rhs) const; ///成员函数,

                   result = 2* oneHalf;     //result , oneHalf都是Rational对象,此时变成  2.operator*(oneHalf)。错误!2不能隐式转换成Rational对象!

                   const Rational operator*(const Rational& rhs1, const Rational& rhs2); //non-member函数

                  此时使用  result = 2* oneHalf  //   2可以被隐式转换成Rational对象,前提是构造函数是non-explicit

(8)条款25:考虑写出一个不抛出异常的swap函数

         当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常。 

         如果你提供一个member swap,也该提供一个non-memebr swap用来调用前者。对于classes,也请特化std::swap

         调用swap时应针对std::swap使用using 声明式,然后调用swap并且不带任何“命名控件资格修饰”

         为“用户定义类型”进行std templates全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。  

电子设计实战:用MOS管手把手搭建D触发器电路(含时序分析避坑指南) 本文详细介绍了如何使用MOS管从零开始搭建D触发器电路,重点解析了建立时间和保持时间等关键时序参数对电路稳定性的影响。通过实测波形分析和避坑指南,帮助电子工程师掌握D触发器的实际搭建技巧与优化方法,提升数字电路设计的可靠性。 阅读详情

相关推荐

STM32入门教程:WiFi通信

STM32是一款强大的嵌入式系统开发平台,可以用于开发各种应用程序,包括WiFi通信。在本教程中,我们将介绍如何使用STM32开发板和WiFi模块进行无线通信。以下是一个详细的代码案例,涵盖了WiFi通信的基本概念和实现。

qq_67153941的博客 1348

《Effective C++》学习总结(条款21- 30)

条款21:必须返回对象时,别妄想返回其reference 1.在任何函数中返回一个reference(或指针)指向某个local对象,都没有任何意义——因为其即将被销毁 2.不要返回pointer或reference指向一个heap对象(用户不知道如何delete) 3.不要返回pointer或者reference指向local static对象而有可能需要多个这样的对象(同一行不能调用多次该函数,static只有一份) 4.当你必须在“返回一个reference”和“返回一个object”之间抉择,你需要

无限进步 889

工程创新训练大赛智能网联车辆赛道LKA+自动驾驶9000+分数分案例

/获取主车在主车路径上的ST坐标。if (status == AVPStatus::eForwarding) // approaching the parking space接近阶段。if (status == AVPStatus::eForwarding) // approaching the parking space接近阶段。if (status == AVPStatus::eForwarding) // approaching the parking space接近阶段。

handsomeboyou的博客 1131

Effective C++ 学习笔记 条款24 若所有参数皆需类型转换,请为此采用non-member函数

地位相当于“被调用之成员函数所隶属的那个对象”——即this对象——的那个隐喻参数,绝不是隐式转换的合格参与者(即oneHalf的operator*只有一个参数,它有一个隐喻参数,就是oneHalf对象自己,它自己是不能从2转换为Rational对象的,意思就是第一个参数是int时不能转换为Rational对象)。太多C++程序员假设,如果一个“与某class相关”的函数不该成为一个member(也许由于其所有实参都需要类型转换,例如先前的Rational的。函数的class的对象,所以编译器调用该函数。

tus00000的博客 728

思科网络进阶——多生成树协议(MSTP)配置的一课一得

三、实验拓扑1)设计一个网络架构,要有核心层和接入层,都使用思科交换机。2)企业有4个部门,要求这四个部门都可以上网,但分属不同的VLAN中,这样今后可以做其它安全策略以确保网络安全,这些策略如今后学到的访问控制列表ACL。3)网络架构的设计要具有冗余,防止一条线路或一台设备终端导致的业务中断。4)由于硬件冗余而产生的环路要处理好,也就是要在逻辑上(或者说通过配置)防止物理环路的产生。5)不能因为防止物理环路而导致某端口没有流量,这样浪费端口资源及设备间互联的带宽资源。

zhu52010的博客 3398

RK3588 固定hdmiin的dev/videoX节点

RK3588 固定hdmiin的dev/videoX节点

目前从事linux驱动开发,多交流多学习吧 2050

Effective C++学习笔记四(设计与声明)

4 设计与声明条款18:让接口容易被正确使用,不易被误用理想上,如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不该通过编译;如果代码通过了编译,它的作为就该是客户所想要的。许多客户端错误可以以导入新类型而获得预防:比如为一个用来表现日期的class设计构造函数: class Date{ public: Date(int month,int day,int

坤哥的学习笔记 805

【Unity优化篇】| Unity3D场景 常用优化策略,遮挡剔除、层消隐距离技术 和 LOD多层次细节

本篇文章来简单介绍一下 Unity中几种常用3D场景优化策略 方法 对于整个项目来说,本文中出现的方法也只是冰山一角,慢慢积累学习吧! 内容包括遮挡剔除(Occlusion Culling)、层消隐距离技术 和 LOD多层次细节

努力前行,总会成为自己心中的那道光 1万+

Effective C++学习笔记(六) 设计与声明(二)

Effective C++学习笔记(六) 设计与声明(二) 条款 23 宁以non-number、non-friend替换member函数 使用non-number 与 non-friend 函数,没有增加封装类的可访问性,friend函数和member函数对class private成员的访问权限相同,因此二者对封装的冲击力道相同。 namespace 和class不同,前者可跨越多个源码文件而后者不能。 这里要视情况而定,看是要增加一个什么样的函数,不能只增加非成员函数,而忘记了封装的本性。 条款 24

weixin_46708094的博客 230

111. 如何创建 SAP ABAP 锁对象(Lock Object)和加锁以及解锁函数

至此,我们完成了 ABAP 系统锁机制和加锁解锁函数的介绍。有了这些基础知识,大家就能在实际工作中,使用 Lock Object 和加锁解锁函数,编写出支持并发访问控制的 ABAP 应用程序了。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1532

[工作流节点10] 获取多条数据并循环执行 —— 明道云批处理自动化实战

本文系统介绍了明道云工作流中"获取多条数据+循环执行"的批处理功能。该功能通过筛选数据集合并逐条处理,适用于批量通知、数据更新等场景。文章详细解析了功能配置方法,包括数据筛选、循环设置和异常处理,并提供了合同到期提醒等典型应用案例。同时强调了数据量控制、分批处理、错误处理等优化策略,帮助用户实现高效批量自动化。这一功能组合能将业务从单条处理升级为批量驱动,显著提升工作效率。

每日出拳老爷子的博客 455

读书笔记《Effective c++》 条款23 宁以non-member,non-friend替换member函数

本节的介绍感觉更像是内容与接口的设计实现,书中以浏览器为例,浏览器class提供一系列的功能,并封装一系列的数据,如果要增加其他内容可以在相同的名字空间内独立出不同的头文件,就像stl中的做法,例如,可以有下载头文件、工具头文件、影响头文件,而这些功能都不是直接放在class里,这是封装的另一个含义,让私有变量被更少的函数访问。 对这个我现在的理解不深,记住就好了,在实际项目中能想起还有这么一条

木头刀 315

C/C++跳动的爱心(完整代码)

C语言实现跳动的爱心的完整代码。

AIGC 5842

【Effective C++笔记 (3-4)】

手动初始化内置类型对象:由于C++不保证内置类型对象的自动初始化,务必在代码中显式进行初始化。优先使用成员初始化列表:在构造函数中,最好使用成员初始化列表(member initialization list)来初始化成员变量,而避免在构造函数体内进行赋值操作(assignment)。保持初始化顺序一致:成员初始化列表中成员变量的排列顺序应与类中声明的顺序相同,以避免潜在的初始化顺序问题。

limingkang1的博客 829

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Effective C++阅读笔记(item 1-4)

我们回到最开始说的*p的情况,p是一个单纯变量名,如果decltype§返回的是p的声明类型,然而*p是返回左值的复杂表达式了,因此decltype返回的是左值引用,类型是表达式的类型。传递一个临时变量也并不是没有意义,有时候用户可能只是想简单的获得临时容器中的一个元素的拷贝,比如这样)==,我们需要将声明改为通用引用(也可以重载函数)。忽略引用行在指向常量的常量指针情况下只会忽略底层const,这一特性只会对形参本身有效,因此指针的常量特定会被忽略,但是指针所指对象的常量特性会被保留。

顾若茵的博客 1083

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Effective cpp 读书笔记4

设计与声明(上) 18.让接口容易被使用,不易被误用 19.设计class犹如设计type 20.宁以pass-by-reference-to-const替换pass-by-value 21.必须返回对象时,别妄想返回其reference

GZGlenn的博客 484

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《Effective C++》笔记汇总_思维导图 chap4

4.设计与声明 下面是思维导图的截图,资源发在Github上了,需要的朋友自取 《Effective C++》chap4:设计与声明 一些话儿 本人水平有限,如果笔记中有错误或是遗漏的地方,还请大家体谅。 这份笔记花了小生非常多的时间与精力,如果能帮到你对C++的学习,点个赞即可! ...

qq_43596544的博客 218

【Effective C++】阅读笔记4

EffectiveC++阅读笔记(实现与继承面向对象相关)

gma999的博客 755

effective c++读书笔记4

因此operator==被要求将“operator*内的 static Rational对象值”拿来和“operator*内的 staticRational对象值”比较,那么当我们每回调用operator*函数的时候,每回返回的都是同一个静态局部变量的引用。在函数内,我们在堆上申请了一个对象,然后返回对象的引用,虽然函数结束之后对象仍存在,我们使用起来不会出错,但是这个函数内部建立的对象我们无法释放(因为我们无法获取其指针,不能进行delete操作)。象有个class用来表示网页浏览器。

! 459

Effective C++ 阅读笔记之Chapter4

前言 大家好,我是雨墨,我深知好记性不如烂笔头的道理,所以在阅读的时候都尽量写读书笔记,方便日后复习,当然笔记并不能代替书籍上的内容。希望我的笔记也能帮助到大家,如果我的笔记有什么问题,欢迎大家给小老弟纠错~ 条款十八总结 设计者应该把用户当作白痴,这样才能将问题考虑周到。 设计良好的接口,不容客户使用错误,比如年月日那就专门定义类来实现年月日,同时每个月由专门设计的函数来实现。 让 types 容易被使用,尽量让你的 types 的行为与内置类型保持一致性。 当你写一个工厂函数的时候,一定要留

qq_51387669的博客 282

Effective C++笔记(3)—条款4分析

Effective C++ 条款04:确定对象被使用前已先被初始化:

上善若水 630

effective C++ 阅读笔记 4

34 区分接口继承和实现继承 公有继承:成员函数的接口总是被继承-------------继承接口和实现 纯虚函数:为了派生类只继承函数接口----继承接口 非纯虚函数=虚函数:提供定义,派生类可以覆写---派生类继承该函数的接口和缺省实现; 总之:纯虚函数,虚函数,非虚函数的差异: 纯虚函数-----只继承接口; 虚函数--------继承接口和一份缺省实现; 非虚函数-----继

我的E家 788

Effective C++ 读书笔记(4)

条款四:确定对象在使用前已经初始化 这一条也可以说是在成员定义的时候同时赋予一个初始的数值,有过C编程经验的人对指针定义的初始化应该不陌生,指针 定义的时候同时给予一个初始化的值,一般是为NULL,这样就不会出现野指针的情况,同时在指针空间释放的时候也注意将对应 的指针赋予一个NULL的值,这样就不会出现指针指向一个无效的地址的情况!同样在C++里面,类作为主要的自定义类型,其成员

nosmatch的专栏 855

Effective C++ 读书笔记(4)

第四章 设计与声明 本章共有如下8个条款: 条款18 让接口易被使用,不易被误用 条款19 设计 class 犹如设计 type 条款20 宁以 pass-by-reference-to-const 替换 pass-by-value 条款21 必须返回对象时,别妄想返回其 reference 条款22 将成员变量声明为 private 条款23 宁以 non-member、non-friend...

SunnyZhang在奋斗的博客 388

Effective C++学习笔记(4)

第三章构造函数,析构函数和赋值操作符条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符    (只要类里有指针时,就要写自己版本的拷贝构造函数和赋值操作符函数)    可以只声明这些函数(声明为private成员)而不去定义(实现)它们。这就防止了会有人去调用它们,也防止了编译器去生成它们条款12: 尽量使用初始化(列表)而不要在构造函数里赋值        因为const成员

355

effective c++ 4-8学习笔记

effective C++ 学习笔记(二)

weixin_44747866的博客 171
上一篇: Effective C++笔记 3
下一篇: Effective C++笔记 5
csc_csc_csc
博客等级 码龄15年 169粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值