C++学习笔记总结练习:effective 学习日志
准则
1.少使用define
- define所定义的常量会在预处理的时候被替代,出错编译器不容易找到错误。而且还没有作用范围限制,推荐使用const
- define宏定义的函数,容易出错,而且参数需要加上小括号,推荐使用inline
- 有的类中例如数组初始化需要添加元素个数,如果define定义的常量没有作用范围限制,推荐使用enums
2.确定对象使用前先初始化
- 为内置型对象进行手动初始化
- 构造函数最好使用成员初始化列,如果在构造函数中进行赋值的话相当于先初始化默认值,然后有赋给值,导致浪费时间。
- 为了免除跨编译单元之初始化次序,将非本地静态变量替换成本地静态变量。因为静态变量在程序编译时就赋值存在,不会导致引用时未构造。
3.为多态基类声明析构函数
- 带多态性质的基类应该声明一个virtual的析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数
- Classs的设计目的如果不是作为base classes使用,或不是为了具备多态性,就不该声明virtual析构函数,因为设置virtual会使派生类带上virtual 函数表,导致浪费空间。
class A{virtual ~A(){}
}
class B:pulic A{}
A *b=new (B);
//当未定义virtual 基类析构函数时,会调用A的析构函数,可能导致未释放B新增内成员的的空间
delete b;
4.不要让异常逃离析构函数
class DBconn{
public:
void close(){
db.close();
closed=true;
}
~DBconn(){
if(!closed)
try{
db.close()
}catch(...){
std:abort();//结束程序,不要让异常传出去,造成不确定后果
}
}
}
private:
DBConnection db;
bool closed;
};
//在对元素析构时,当两个及以上元素出现异常时,程序就会停止或者造成不明确的行为,造成内存呢泄露
-
析构函数绝对不要吐出异常。如果一个析构函数调用的函数可能出现异常,析构函数应该捕捉任何异常,然后吞下他们或者结束程序。
-
如果客户需要对某个操作在运行期间抛出的异常做出反应,class 应该提供一个普通函数执行该操作。
5.不要在构造函数或者析构函数里面调用virtual函数
对于virtual 一般是多态定义的,但是当构造函数构造子类使会先构造父类,当在构造器中调用virtual会导致调用的是父类版本的virtual,因为在构造父类时,此时编译器还不知道子类有什么成员,所以用当前版本的。
6.在operator中处理自我赋值
//当rhs与this是同一个对象时,delete pb会导致低下rhs的pb也delete 导致报错 Widget::operator=(const Widget& rhs){delete pb;pb=new Bitmap(*rhs.pb);return *this; } //进行验同测试,当时new出现异常时,会导致this.pb被释放 Widget::operator=(const Widget& rhs){if(&rhs==this)return *this;delete pb;pb=new Bitmap(*rhs.pb);return *this; } //这样既不怕是统一对象,也不怕new出错 Widget::operator=(const Widget& rhs){Bitmap *pOrig=pb;pb=new Bitmap(*rhs.pb);delete pOrig;return *this; }
7.以独立的语句将newed对象置于智能指针
processWidget(std:trl::shared_ptrM<Widget> pr(new Widget),priority())
对于c++执行这句话,以什么样的次序进行执行弹性很大,与java与c#不同1。如果以 new widget,priority(),shared_ptrM(),顺序则可能出现内存泄露的风险。当priority出错()时,将无法将new出来的内存进行删除,因此最好以单独语句执行。
std:trl::shared_ptrM<Widget> pr(new Widget);
processWidget(std:trl::shared_ptrM<Widget> pr,priority())
8.以引用传递代替值传递
- 按值传递可能会使特化的信息别切割
class window{
public:virtual :display();
}class myWindow:public window{private:int size;public:virtual:display();
}
void useDisPlay1(window w){w.display();
}
void useDisplay2(window& w){w.display();
}
mywidow w;
useDisPlay1(w);//按值传递会使 mywindow所得有特化的信息被切割
userIdsPlay2(w);//按引用传递则不会使切割
- 按值传递会让编译器去构造副本,对于一般自定义的类来说浪费时间和空间
- 按值传递适合内置类型,STL迭代器和函数对象。因为传递引用的实质使传递指针。
9.inline的使用
- 将大多数inline限制在小型、被频繁调用的函数身上,这可使以后的调试过程和二进制升级更容易,也可使潜在的代码膨胀问题最小化,使程序提升速度最大化。
- 不要只因为function template 出现在头文件就将他们设置为inline。
inline一定被放在头文件是因为编译器为了将函数调用代码替换为函数本体 要知道函数本体长什么样子
template 一定放在头文件里是 因为一旦被使用,编译器会将它具体化,得知道它长什么样子。
10.将文件间的编译依存关系降到最低
- 如果使用object reference 或者obejct point 可以实现就不要用 object了。
- 如果能够,尽量以class声明替代函数。
- 为声明式和定义式提供不同的头文件
- 或者将声明类定义为abstrate 类,实现类继承进行继承。
就是将类的实现和申明写成两个类,然后在声明类中引用实现类的指针。这样当实现类中的成员进行变化时,声明类不用重新编译。而且声明类中也无法看出方法的具体实现。
11.避免遮蔽继承而来的名称
class base{
private:
int x;
public :
void fun()
}class drived :public base{public:using base:fun()void fun();
}
//子类fun()会遮蔽父类fun(),想用父类fun就要用 using base:fun()
derived的作用域
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICDjcePv-1692172341730)(C:\Users\18440\AppData\Roaming\Typora\typora-user-images\image-20220830185337010.png)]
drived classes内的名称会遮蔽base class内的名称,为了让遮蔽的名称重用,用using 或者转交函数
12.private继承
- private继承意味is-implemented-in-terms of(根据某物实现)。它通常比复合成员的级别低。当derived class 需要访问protected base class的成员,或需要重新定义继承而来的virtual函数时,这么设计是合理的。
- 和复合不同,private继承可以造成empty base 最优化。这对致力于”对象尺寸最小化“的程序开发者而言,可能很重要。
13.多重继承
-
多重继承比单一继承复杂。它可能导致新的歧义性,以及对virtual继承的需要。
-
virtual继承会导致速度大小,初始化等等成本。如果virtual base classes 不带任何数据,将是最具有实用价值的情况。
-
多重继承的确有正当途径,当其中一个情节涉及”public继承某个Interface class“ 和private 继承某个协助实现的class的两相组合。例如public 继承的接口在private 继承的类中有方法去实现。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NEncUj9i-1692172341731)(C:\Users\18440\AppData\Roaming\Typora\typora-user-images\image-20220830215346169.png)]
14.将与参数无关的代码抽离template
-
templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生依赖关系。
-
因非类型模板参数而造成的代码膨胀,往往可以消除,做法是以函数参数或者class成员替换template函数。类如去定义类中一些参数,这样的参数可以写在类中。
-
因类型参数造成的代码膨胀,往往可以降低。做法是让带有完全相同的二进制表述的具体表述共享实现代码。类如int与long可能公用一个模板。
相关文章:
C++学习笔记总结练习:effective 学习日志
准则 1.少使用define define所定义的常量会在预处理的时候被替代,出错编译器不容易找到错误。而且还没有作用范围限制,推荐使用constdefine宏定义的函数,容易出错,而且参数需要加上小括号,推荐使用inline有的类中例如…...
Vue教程(五):样式绑定——class和style
1、样式代码准备 样式提前准备 <style>.basic{width: 400px;height: 100px;border: 1px solid black;}.happy{border: 4px solid red;background-color: rgba(255, 255, 0, 0.644);background: linear-gradient(30deg, yellow, pink, orange, yellow);}.sad{border: 4px …...
开放网关架构演进
作者:庄文弘(弘智) 淘宝开放平台是阿里与外部生态互联互通的重要开放途径,通过开放的产品技术把阿里经济体一系列基础服务,像水、电、煤一样输送给我们的商家、开发者、社区媒体以及其他合作伙伴,推动行业的…...
torch一些操作
Pytorch文档 Pytorch 官方文档 https://pytorch.org/docs/stable/index.html pytorch 里的一些基础tensor操作讲的不错 https://blog.csdn.net/abc13526222160/category_8614343.html 关于pytorch的Broadcast,合并与分割,数学运算,属性统计以及高阶操作 https://blog.csd…...
ICCV23 | Ada3D:利用动态推理挖掘3D感知任务中数据冗余性
论文地址:https://arxiv.org/abs/2307.08209 项目主页:https://a-suozhang.xyz/ada3d.github.io/ 01. 背景与动因 3D检测(3D Detection)任务是自动驾驶任务中的重要任务。由于自动驾驶任务的安全性至关重要(safety-critic),对感知算法的延…...
软件工程模型-架构师之路(四)
软件工程模型 敏捷开发: 个体和交互 胜过 过程和工具、可以工作的软件 胜过 面面俱到的文件、客户合作胜过合同谈判、响应变化 胜过 循序计划。(适应需求变化,积极响应) 敏捷开发与其他结构化方法区别特点:面向人的…...
ubuntu20.04共享文件夹—— /mnt/hgfs里没有共享文件夹
参考文章:https://blog.csdn.net/Edwinwzy/article/details/129580636 虚拟机启用共享文件夹后,/mnt/hgfs下面为空,使用 vmware-hgfsclient 查看设置的共享文件夹名字也是为空。 解决方法: 1. 重新安装vmware tools. 在菜单…...
Redis中的有序集合及其底层跳表
前言 本文着重介绍Redis中的有序集合的底层实现中的跳表 有序集合 Sorted Set Redis中的Sorted Set 是一个有序的无重复值的集合,他底层是使用压缩列表和跳表实现的,和Java中的HashMap底层数据结构(1.8)链表红黑树异曲同工之妙…...
js 小程序限流函数 return闭包函数执行不了
问题: 调用限流 ,没走闭包的函数: checkBalanceReq() loadsh.js // 限流 const throttle (fn, context, interval) > {console.log(">>>>cmm throttle", context, interval)let canRun…...
【数据结构】堆的初始化——如何初始化一个大根堆?
文章目录 源码是如何插入的?扩容向上调整实现大根堆代码: 源码是如何插入的? 扩容 在扩容的时候,如果容量小于64,那就2倍多2的扩容;如果大于64,那就1.5倍扩容。 还会进行溢出的判断,…...
【韩顺平 零基础30天学会Java】程序流程控制(2days)
day1 程序流程控制:顺序控制、分支控制、循环控制 顺序控制:从上到下逐行地执行,中间没有任何判断和跳转。 Java中定义变量时要采用合法的前向引用。 分支控制if-else:单分支、双分支和多分支。 单分支 import java.util.Scann…...
从入门到精通Python隧道代理的使用与优化
哈喽,Python爬虫小伙伴们!今天我们来聊聊如何从入门到精通地使用和优化Python隧道代理,让我们的爬虫程序更加稳定、高效!今天我们将对使用和优化进行一个简单的梳理,并且会提供相应的代码示例。 1. 什么是隧道代理&…...
19万字智慧城市总体规划与设计方案WORD
导读:原文《19万字智慧城市总体规划与设计方案WORD》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 感知基础设施 感知基础设施架构由感知范围、感知手…...
[赛博昆仑] 腾讯QQ_PC端,逻辑漏洞导致RCE漏洞
简介 !! 内容仅供学习,请不要进行非法网络活动,网络不是法外之地!! 赛博昆仑是国内一家较为知名的网络安全公司,该公司今日报告称 Windows 版腾讯 QQ 桌面客户端出现高危安全漏洞,据称“黑客利用难度极低、危害较大”,腾讯刚刚已经紧急发布…...
python Requests
Requests概述 官方文档:http://cn.python-requests.org/zh_CN/latest/,Requests是python的HTTP的库,我们可以安全的使用 Requests安装 pip install Requests -i https://pypi.tuna.tsinghua.edu.cn/simple Requests的使用 Respose的属性 属性说明url响…...
【深入解析:数据结构栈的魅力与应用】
本章重点 栈的概念及结构 栈的实现方式 数组实现栈接口 栈面试题目 概念选择题 一、栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数…...
安卓机显示屏的硬件结构
显示屏的硬件结构 显示屏的硬件结构主要由背光源、液晶面板和驱动电路构成。可以将液晶面板看成一个三明治的结构,即在两片偏振方向互相垂直的偏光片系统中夹着一层液晶层。自然光源通过起偏器(偏光片之一)后,变成了垂直方向的偏…...
基于swing的超市管理系统java仓库库存进销存jsp源代码mysql
本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 基于swing的超市管理系统 系统有3权限:管…...
常用系统命令
重定向 cat aa.txt > bbb.txt 将输出定向到bbb.txt cat aaa.txt >> bbb.txt 输出并追加查看进程 ps ps -ef 显示所有进程 例⼦:ps -ef | grep mysql |:管道符 kill pid 结束进程, 如 kill 3732;根据进程名结束进程可以先…...
【Spring专题】Spring之Bean生命周期源码解析——阶段四(Bean销毁)(拓展,了解就好)
目录 前言阅读建议 课程内容一、Bean什么时候销毁二、实现自定义的Bean销毁逻辑2.1 实现DisposableBean或者AutoCloseable接口2.2 使用PreDestroy注解2.3 其他方式(手动指定销毁方法名字) 三、注册销毁Bean过程及方法详解3.1 AbstractBeanFactory#requir…...
配置Docker,漏洞复现
目录 配置Docker 漏洞复现 配置Docker Docker的配置在Linux系统中相对简单,以下是详细步骤: 1.安装Docker:打开终端,运行以下命令以安装Docker。 sudo apt update sudo apt install docker.io 2.启动Docker服务:运…...
微信小程序 游戏水平评估系统的设计与实现_pzbe0
近年来,随着互联网的蓬勃发展,游戏公司对信息的管理提出了更高的要求。传统的管理方式已无法满足现代人们的需求。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,随着各行业的不断发展,使命召…...
moba登录不进去提示修改问题问题解决方式
问题: 安装moba后,运行时运行不起来,提示输入密码,安装、卸载多个版本都不行 方法: 使用ResetMasterPassword工具进行重置主密码 官网下载地址: MobaXterm Xserver and tabbed SSH client - resetmaster…...
Unsafe upfileupload
文章目录 client checkMIME Typegetimagesize 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按…...
机器人制作开源方案 | 滑板助力器
我们可以用一块废滑板做些什么呢? 如今,越来越多的人选择电动滑板作为代步工具或娱乐方式,市场上也涌现出越来越多的电动滑板产品。 (图片来源:Backfire Zealot X Belt Drive Electric Skateboard– Backfire Board…...
飞机打方块(二)游戏界面制作
一、背景 1.新建bg节点 二、飞机节点功能实现 1.移动 1.新建plane节点 2.新建脚本GameController.ts,并绑定Canvas GameControll.ts const { ccclass, property } cc._decorator;ccclass export default class NewClass extends cc.Component {property(cc.Node)canvas:…...
自我理解:精度(precision)和召回(recall)
1、精度(precision) 精度是用于评估分类模型的一个重要指标。它反映了模型预测为正例的样本中,实际真正为正例样本的比例。 【注】正例样本指在二分类问题中,被标注为正类的样本。 例如:在垃圾邮件分类任务中,正例样本就是真实的…...
Nginx 使用 HTTPS(准备证书和私钥)
文章目录 Nginx生成自签名证书和配置Nginx HTTPS(准备证书和私钥)准备证书和私钥 Nginx生成自签名证书和配置Nginx HTTPS(准备证书和私钥) 准备证书和私钥 生成私钥 openssl genrsa -des3 -out server.key 2048这会生成一个加密…...
Java:集合框架:Set集合、LinkedSet集合、TreeSet集合、哈希值、HashSet的底层原理
Set集合 创建一个Set集合对象,因为Set是一个接口不能直接new一个对象,所以要用一个实现类来接 HashSet来接 无序性只有一次,只要第一次运行出来后,之后再运行的顺序还是第一次的顺序。 用LinkedSet来接 有序 不重复 无索引 用Tree…...
自定义Taro的navBar的宽度和高度
本方法是计算自定义navbar的宽度和高度,输出的参数有 navBarHeight, menuBottom,menuHeight, menuRectWidth,windowWidth, windowHeight,具体代码如下: export function getCustomNavBarRect():| {navBarHeight: number;menuBottom: number;menuHeight:…...
商标注册 网站建设如何入账/淘宝关键词top排行榜
Alibaba 内组件版本: Alibaba 与springboot、cloud版本: 参考 Spring Cloud Alibaba 版本对照表...
潍坊 企业网站建设/微指数官网
11、查询oracle的连接数2selectcount(*)fromv$session;32、查询oracle的并发连接数4selectcount(*)fromv$sessionwherestatusACTIVE;53、查看不同用户的连接数6selectusername,count(username)fromv$sessionwhereusernameisnotnullgroupbyusername;74、查看所有用户:…...
富阳做网站/torrentkitty磁力猫
利用EasySQLMAIL实现自动填写Excel表格并发送邮件 转自:http://blog.sina.com.cn/s/blog_1549483b70102witg.html 前一篇博文中记录了“利用EasySQLMAIL实现自动数据提取和邮件发送功能”,里面的方法只能将SQL语句查询出来的数据一行一行地原样转换到Excel表格中。但…...
wordpress 反斜杠/2022小说排行榜百度风云榜
**一个优秀的Android开发者,一定有扎实的Java基础知识。**今天给大家分享一下我们必须掌握的Java知识点。 设计模式 我为什么把设计模式放在最前面?因为Android系统框架层里,要用到大量的设计模式,如果你设计模式没学好…...
wordpress 文章8小时/网络营销简介
项目背景 最近小周的项目上线了,服务器在机房,客户端在用户的办公室。两者距离很远,经常要跑机房去操作,然而机房的管理特别的严格。不许带电脑、手机,只能带笔杠杠。。。。。内心10000只草泥马在奔腾! 6台服务器&am…...
网站设计内容清单/app开发网站
ARP地址解析协议是什么? ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。其作用是在以太网环境中,数据的传输所依懒的是MAC地址而非IP地址,而将已知IP地址转换为MAC地址的工作是由ARP协议来完成的。…...