C++学习(5)--转向effective c++

Effective C++记录(精简版) 1、尽可能延后变量定义式的出现,尽可能在初始化的时候给初值实参,这样做可增加程序的清晰度并改善程序效率。1、绝对不要重新定义继承而来的non-virtual函数。会打破public继承时is a的关系。1、绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定(使用指针类型函数默认参数),而virtual函数——你唯一应该覆写的东西却是动态绑定。 阅读详情
“C是一种简单的语言。它真正提供的只有有宏、指针、结构、数组和函数。不管什么问题,C都靠宏、指针、结构、数组和函数来解决。而C++不是这样。宏、指针、结构、数组和函数当然还存在,此外还有私有和保护型成员、函数重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、模板、异常、名字空间,等等。用C++比用C具有更宽广的空间,因为设计时有更多的选择可以考虑。”
开始我的effective之旅了~
条款1 我就知道这书里肯定得大谈特谈const,因为每次看代码,都被一群出其不意的const搞郁闷。没想到第一条就是,索性现在对const还是有了些浅浅的认识:
*用const代替#define我就不多说了
#define ASPECT_RATIO 1.653
const double ASPECT_RATIO = 1.653;
*定义指针常量,要用两次const,一个对const常量,一个const指针
const char * const authorName = "Scott Meyers";
*第一类的常量,要把常量限制在类中,首相要是他成为类的成员,要保证只有一份拷贝,要把它定义成静态成员;
class GamePlayer
{
private:
 static const int NUM_TURNS = 5;
}
声明后,还要定义
const int GamePlayer::NUM_TURNS;
*用普通的inline函数实现宏的效率
让#define max(a,b) ((a)>(b)?(a):(b))去死吧
用inline int max(int a, int b) { return a > b ? a:b}
最后引述一句话:“有了const和inline,你对预处理的需要减少了,但也不能完全没有它。抛弃#include的日子还很远,#ifdef/#ifndef在控制编译的过程中还扮演重要角色。预处理还不能退休,但你一定要计划给它经常放长假。”

条款2
至于为什么用iostream取代stdio,我有一个理性加感性的认识:方便。剩下的留给底层的机制去做吧,等我看底层的时候再慢慢捉摸你们去。
“如果编译器同时支持 <iostream>和<iostream.h>,那头文件名的使用会很微妙。例如,如果使用了#include <iostream>, 得到的是置于名字空间std(见条款28)下的iostream库的元素;如果使用#include <iostream.h>,得到的是置于全局空间的同样的元素。在全局空间获取元素会导致名字冲突,而设计名字空间的初衷正是用来避免这种名字冲突的发生。”
这点很重要,解决了我长久以来的疑惑。我就说为什么自从我把iostream.h改称iostream的时候
不加using namespace std;的话就会报出n多的错,now i get it  :〉
条款3:尽量用new和delete而不用malloc和free
看到这里我就要开始骂那个操蛋的《高质量c++编程》了,怪不得越看越眼熟呢,你丫抄人家也不多改改!
看了半天我也dont know why,状态不是很好
其实这句就够了
既然malloc和free对构造函数和析构函数一无所知,把malloc/free和new/delete混起来用又象嘈杂拥挤的晚会那样难以控制,那么,你最好就什么时候都一心一意地使用new和delete吧。
条款4:
这个也没啥好说的,这句比较有趣,不知道这书的作者是谁,哈哈
值得指出的是,有些老的专门为c写的预处理程序不知道处理c++风格的注释,所以象下面这种情形时,事情就不会象预想的那样:
“#define light_speedp 3e8 // m/sec (in a vacuum)
对于不熟悉c++的预处理程序来说,行尾的注释竟然成为了宏的一部分!当然,正象条款1所说的那样,你无论如何也不会用预处理来定义常量的。”
条款5:对应的new和delete要采用相同的形式
解决这类问题的规则很简单:如果你调用new时用了[],调用delete时也要用[]。如果调用new时没有用[],那调用delete时也不要用[]。
在写一个包含指针数据成员,并且提供多个构造函数的类时,牢记这一规则尤其重要。
为了避免混乱,最好杜绝对数组类型用typedefs。这其实很容易,因为标准c++库(见条款49)包含有stirng和vector模板,使用他们将会使对数组的需求减少到几乎零。
条款6:析构函数里对指针成员调用delete
现在自己做的程序还没有大道他说的那个地步,先不深究了
条款7:预先准备好内存不够的情况

大家都知道,处理内存不够所产生的异常真可以算得上是个道德上的行为,但实际做起来又会象刀架在脖子上那样痛苦。所以,你有时会不去管它,也许一直没去管它。但你心里一定还是深深地隐藏着一种罪恶感:万一new真的产生了异常怎么办?

哈哈,这句话真实说到点子上了~
用预处理的方法解决问题可以这样
#define new(ptr, type)  /
try { (ptr) = new type; } /
catch (std::bad_alloc&) { assert(0); }
但没有考虑到new有各种各样的方式
而且有可能有人会重载new
“那么,怎么办?如果想用一个很简单的出错处理方法,可以这么做:当内存分配请求不能满足时,调用你预先指定的一个出错处理函数。这个方法基于一个常规,即当operator new不能满足请求时,会在抛出异常之前调用客户指定的一个出错处理函数——一般称为new-handler函数。”
完全看不懂,基础问题……
但是没关系,还是先往下看。
 
Effective C++ 第三版 所有条款总结及对应代码描述(纯干货) Effective C++ 第三版 所有条款总结及对应代码描述(纯干货) 阅读详情

相关推荐

OpenClaw与Ollama本地AI部署指南

AI模型本地化部署是当前企业数字化转型的关键技术,通过开源框架Ollama可以在消费级硬件上运行大语言模型。本文以OpenClaw多智能体系统为例,详解从环境配置到模型优化的全流程实践,特别针对国内开发者遇到的网络问题提供了镜像加速等解决方案。这种私有化部署方案尤其适合金融数据分析、企业知识管理等对数据安全要求高的场景,通过模块化设计实现多智能体协作,同时保持对NVIDIA显卡和普通CPU的兼容性。

weixin_34302561的博客 377

Effective C++ 学习笔记

C++程序员分为两种,一种是读过Effective C++的,一种是没读过。这本《Effective C++》 能够协助成为高效的C++开发者。简直是C++开发者的分水岭。 必须细读多遍。 本人小硕菜鸡一枚,非科班,准备今年7月从事C++开发者,修炼内功,一天学习一个effective C++条款。欢迎大佬指导讨论。 fighting!

Ref.Ptr.的博客 3844

使用 MATLAB/Simulink + Simscape Electrical 构建一个他励直流电机的启动与制动过程仿真模型

直流电机在工业控制、电动车辆、自动化设备中广泛应用。其中,他励直流电机(Separately Excited DC Motor)因其励磁绕组与电枢绕组分别供电,具有良好的调速性能和启动特性,常用于需要平稳启动和精确控制的场合。在实际应用中,电机的启动过程和制动过程对电网、机械系统以及电机本身都具有重要影响。因此,仿真分析他励直流电机的启动与制动特性,是电机控制设计的重要环节。本文将详细介绍如何使用构建一个他励直流电机的启动与制动过程仿真模型,并通过仿真分析其动态响应。本文详细介绍了如何使用构建一个。

amy_mhd的博客 218

Effective Modern C++ 完全解读笔记汇总

Effective Modern C++ 系列学习和解读笔记汇总。

Dong_HFUT的博客 7766

C++primer、Effective C++应该怎么读,如何读?

导读 刚开始C++学习肯定就是拿起书就开始读,读了一会就放下就干别的,带最后没翻过几页。下面我就说一下,我是怎么读的,我大概一个暑假就把这两本读完了。 C++ primer 计划 有人听到计划可能退缩了,计划都是骗人的,都是假的。我的计划有点和别人不一样。听我细细道来。 首先我规定自己一天必须读完一章。这一章不管大小(当然后面的泛型或者虚函数的地方可以规定半章一天)。大家不用分的太细,几点到几点...

曲怪曲怪 1875

Effective C++学习笔记

融合了多种编程思维方式这四种范式不是“可选”的,而是交织在一起的,你必须都懂,才能看懂别人写的代码,甚至才能看懂标准库。1.静态成员变量:只有一份存储,不属于任何对象 → 编译器必须在一个翻译单元里给它真正的内存定义。规则是:声明放在类体内(带 )。定义(即分配存储)放在类外且只能出现一次;通常放在 文件。例外:如果它是整型或枚举类型的 const 静态成员,并且初始化值是常量表达式,C++11 起允许在类内直接给初值,此时可省略类外定义——只要代码里从不取它的地址或绑定引用即可。一旦有人 或把它传给

weixin_51904572的博客 856

effective c++学习笔记

effective c++ 学习笔记

weixin_43646672的博客 568

Effective Modren C++》 进阶学习(上)

在阻止类的某些特定成员函数被外部调用时,有两种常见的方法:使用private访问修饰符将其声明为私有,或者使用delete关键字将其声明为已删除。一般情况,优先考虑deletedelete明确表示该成员函数被删除或禁止使用。C++11中实现一个空类,编译器会自动声明六个函数:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符。由于编译器会自动生成上述函数,导致即使不定义,第三方仍然可以调用编译器自动生成的这些函数,这不是期望的动作!若使用private。

LinuxTaoist的博客 723

C++之《Effective C++》读书总结(1)

**将 C++ 视为一个语言联邦(C、Object-Oriented C++、Template C++、STL)**,是《Effective C++》中极具洞察力的抽象。这种观点强调:C++ 并非单一范式语言,而是由多个相互重叠、规则各异的子语言共同构成。理解这一点,有助于开发者在不同语境下采用恰当的思维模型,避免因误用某一子语言的规则而引发隐蔽缺陷或性能问题。

梅花香自苦寒来,宝剑锋从磨砺出。 2043

约瑟夫环问题 Josephus

用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。(约瑟夫环问题 Josephus),据说是M.O.哥去面google的时候碰到的一道题,Josephus问题在《具体数学》里面的第一章有详细的描述并且建立了一套数学模型...但是面试无非就是写个简单的程序,考验一下链表处理能力吧提示:   由于当某个人退出圆圈后,报数的工作要从下一个人开始继续,剩下的人仍然是

zhao0057的专栏 855

C++学习(1)--基础知识(1)--一些基本的格式

本来想写道csdn里面去,可是连开两个blog也够麻烦的,先写到这里吧。宗旨就是写出来的一定要是自己弄明白的。弄不明白的写在这里是自己骗自己。 *类名和函数名用大写字母开头的单词组合而成*变量和参数用小写字母开头的单词组合而成*常量全用大写的字母,用下划线分割单词*静态变量加前缀s_*全局变量加前缀g_*类的数据成员加前缀m_(可避免数据成员与成员函数的参数同名

zhao0057的专栏 775

C++学习(7)--转向effective c++(3)

条款18: 争取使类的接口完整并且最小本条款中的一些基本概念:// 返回可以读/写的元素t& operator[](int index);// 返回只读元素const t& operator[](int index) const;概括起来就是说,无端地在接口里增加函数不是没有代价的,所以在增加一个新函数时要仔细考虑:它所带来的方便性(只有在接口完整的前提下才应该考虑增加一个新函数以提供

zhao0057的专栏 726

C++学习(8)--转向effective c++()

条款42: 明智地使用私有继承如果两个类之间的继承关系为私有,编译器一般不会将派生类对象(如Student)转换成基类对象(如Person)。从私有基类继承而来的成员都成为了派生类的私有成员,即使它们在基类中是保护或公有成员。私有继承意味着 "用...来实现"。如果使类D私有继承于类B,这样做是因为你想利用类B中已经存在的某些代码,而不是因为类型B的对象和类型D的对象之间有什么概念上的关系。因

zhao0057的专栏 626

C++学习(3)--基础知识(3)--关于操作符的重载

只是看了点皮毛,自觉地要点有几条:1.目的是使对对象的操作和对象之间的操作更自然,更方便.使其直接运用在表达式中。2.如果不太会写,先写一个仿操作符的函数,比如sum(),然后将函数名改为operator+3.return的值就是操作符两边的元素经过操作符作用后的结果.以上几条针对“+”“-”“*”“/”“〉=”“〈=”“==”等运算符来说应该可以了。剩下的就是输入输出的运算符重载(怎么重载为

zhao0057的专栏 552

C++学习(2)--基础知识(2)--指针复习

1. 我们可以用下述方法来定义一个指针类型的变量。     int *ip;2.指针变量在定义中允许带初始化项。如:       int i, *ip=&i; 注意, 这里是用&i对ip初始化, 而不是对*ip初始化。3.地址运算     指针允许的运算方式有:     (1). 指针在一定条件下, 可进行比较, 这里所说的一定条件,  是指两个指 针指向同一个对象

zhao0057的专栏 551

C++学习(6)--转向effective c++(2)

条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符看到这个就开始恨他妈的《高质量c++编程了》这次搞明白了,之所以要自定义一个赋值操作符,比如建立了两个对象a和b,其成员为指针当执行b=a的时候,相当于b的指针指向了a,那么b原来指向的咚咚不会被删除,造成内存泄漏而且因为a,b指向同一地,那么只要其中一个离开了它的生存空间,其析构函数就会删除掉另一个指针还指向的那块内存。

zhao0057的专栏 524

C++学习(4)--基础知识(4)--关于const

Do Remember : Use const whenever you need*对于编译器来说,int和int const是两个不同的类型,对于一个指针变量,牵扯到两个对象:指针变量本身和指针所指的对象:Char s[]=”bupt”;Char* const cp =s;Cp=s+1//编译错误Char const* pc=s;*pc=’a’;//编译错误Char const* const

zhao0057的专栏 491

qt,c++为什么要进行序列化和反序列化。已经 1 字节对齐 `#pragma pack(1)`,为什么还要 QDataStream?

qt,c++为什么要进行序列化和反序列化。已经 1 字节对齐 `#pragma pack(1)`,为什么还要 QDataStream?

sunflower_2020的博客 55

c语言分支与循环语句

分支决定程序“走哪条路”,循环决定程序“重复多少次”,跳转语句则负责在必要时改变当前执行节奏。掌握这些语句的语法只是起点,更重要的是理解它们的执行顺序、作用范围和边界条件。当你能够熟练地把ifswitchwhilefordo...whilebreak和continue组合起来,就可以从简单的判断题、循环题,逐步写出登录验证、查找算法和交互式小游戏等完整程序。清晰的控制流,是写出可靠 C 程序的基础。

phltxy的博客 154

法人代表身份证明及授权委托书.pdf

法人代表身份证明及授权委托书.pdf

上一篇: C++学习(4)--基础知识(4)--关于const
下一篇: C++学习(6)--转向effective c++(2)
zhao0057
博客等级 码龄21年 1粉丝 10原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值