C++人该知道的N个问题与做法
文章平均质量分 70
C++人该知道的N个问题与做法,归纳总结笔者读书或实际遇到的问题及做法,予以分享。
阿尔兹
将生活技能点满,活成百科全书
展开
-
段页式存储,虚拟内存计算(多种题型)
段页式存储,虚拟内存计算,多种题型,看完包会原创 2022-03-13 15:31:46 · 4342 阅读 · 1 评论 -
C++人该知道的N个问题与做法:确保拷贝对象的每一个成分
考虑一个 class 用来表现颜色,然后手动写出(而非由编译器创建) copy函数使得外界对它们的调用会被记录( logged)下来:void logcall(const std::string& funcname); //日志打印class Color{public: Color(const Color& rhs); Color& operator(const Color& rhs);private: string color;};原创 2020-09-17 22:04:00 · 176 阅读 · 0 评论 -
C++人该知道的N个问题与做法:让operator=返回一个& to *this
关于赋值,你可以把它们写成连锁形式:int x, y, z;x=y=z=5;赋值采用右结合律,所以上述连锁赋值被解析为:x=(y=(z=5));这里5先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x为了实现“连锁赋值”,赋值操作符必须返回一个 “引用”,指向操作符的左侧实参。class Color{ public: Color& operator=(const Color& rhs){ //返回一个&,指向原创 2020-09-10 21:34:32 · 241 阅读 · 0 评论 -
C++人该知道的N个问题与做法:别让异常逃离析构函数
前言:class Color{ public: ~Color( ) {...} //假设这个可能吐出一个异常};void doSomething(){ vector<Color> v; //v在这里被自动销毁}当 vector v被销毁时,它需要销毁其内包含的所有Color,假设内含五个Color,而在析构第一个元素期间,有个异常被抛出。其他九个Color还是应该被销殿(否则它们保存的任何资源都会发生泄漏),因此v应该调用它们各自的析构函数。但假设在原创 2020-09-10 21:05:42 · 170 阅读 · 0 评论 -
C++人该知道的N个问题与做法:为以实现多态的基类声明虚析构函数
前言--问题所在假设我们需要记录颜色,因此设计一个Color基类和一些派生类:class Color{public: Color(); ~Color();};class Red: public Color {...};class Green : public Color {...};class Blue: public Color {...};有时我们只想操作对应的颜色,但不操心其内部的计算,通常会用指针指向一个Color对象;Color* getColor(原创 2020-09-08 21:51:58 · 121 阅读 · 0 评论 -
C++人该知道的N个问题与做法:了解C++类偷偷干的那些事,如何拒绝它
了解C++默默编写并调用哪些函数当你创建一个类,但是如果你自己没声明其中一些东西,编译器就会为它声明(编译器版本的)一个拷贝构造函数、一个 copy 操作符和一个析构函数。此外如果你没有声明任何构造函数,编译器也会为你声明一个 默认构造函数。所有这些函数都是 public且 inline。例:当你写下class Empty{ };就相当于你写下了:Class Empty { public: Empty() {...} // 默认构造函数原创 2020-09-08 10:49:23 · 152 阅读 · 0 评论 -
C++人该知道的N个问题与做法:确保对象被使用前已先初始化
前言:int n;在某些语境下x可以保证被初始化(为0),但在其他语境中却不保证。如果你这么写:class Point{ int x,y;};...Point p;p的成员变量有时候被初始化(为0),有时候不会,如果你是其他某些语言,并不存在“无初值对象”,那么请小心,因为这颇为重要。有些平台读取未初始化的值会使程序终止运行,但大多数情况下是读入一些随机的数据,污染程序对象,导致不可预测的程序行为,以及许多令人不愉快的调试过程,如果是业务相关,那麻烦就大了。初始原创 2020-09-03 15:34:44 · 265 阅读 · 0 评论 -
C++人该知道的N个问题与做法:浮点数在计算机中的存储方式与精度丢失问题(float,double)
浮点数在计算机中的存储方式对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit。不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。 无论是单精度还是双精度在存储中都分为三个部分:符号位(Sign) : 0代表正,1代表为负 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移...原创 2020-08-20 21:33:00 · 982 阅读 · 0 评论 -
C++人该知道的N个问题与做法:内联函数(inline)与宏(#define)
Prefer const,enum and linline to #defines(尽量使用const enum inline替换#define).上面这句话是Scott meyers在EffectIve C++中提到的。一、先说说#define先看这句代码:#define ASPECT 1.35知道#define的,就知道名称ASPECT在编译时并没有被编译器所看见,也许在编译器开始处理源码之前就被预处理器移走了,所以ASPECT有可能没进入到sysmbol table(记号表)中。原创 2020-08-27 22:36:52 · 301 阅读 · 0 评论 -
C++人该知道的N个问题与做法:尽量使用引用传递代替值传递
对于C++一种继承自C的方式缺省情况就是以值传递。传递对象至函数,除非特殊指定,否则函数参数都是以实际实参的副本为初值,而且调用端所获得的也是函数返回值的副本,值传递带来的后果一值传递有很多的耗时操作;看如下例程序:class Person { public: Person(); //构造 virtual ~Person(); //析构 private: string name; string address;原创 2020-09-01 23:08:36 · 368 阅读 · 0 评论