Effective C++ 第二版 1)const和inline 2)iostream

ADS SerDes仿真实战:深入解析Tx_Diff均衡器(EQ)参数对眼图质量的影响 本文以ADS仿真平台为基础,深入解析了SerDes设计中Tx_Diff均衡器(EQ)参数对信号完整性的核心影响。通过实战演示,详细对比了去加重(De-emphasis)与FIR抽头系数两种调节模式,揭示了它们如何有效对抗信道损耗与码间干扰,从而显著改善眼图的高度、宽度与抖动性能,为高速串行链路设计提供关键调优思路。 阅读详情

从C转向C++

C提供了宏, 指针, 结构, 数组, 函数;

C++还有私有和保护型成员, 函数重载, 缺省参数, 构造和析构, 自定义操作符, 内联函数, 引用, 友元, 模板, 异常, 名字空间等;

C++具有更多的选择;


条款1 尽量用const和inline而不用#define

>"尽量用编译器而不用预处理"
Ex. #define ASPECT_R 1.653    编译器永远不会看到ASPECT_R这个符号名, 在源码进入编译器之前, 就被预处理程序去掉, ASPECT_R 不会被加入到符号列表中; 编译报错时, 报错信息指向1.653, 让程序员无法跟踪错误;(这个问题也会出现在符号调试器中);

>Solution: 定义常量 const double ASPECT_R = 1.653; 常量定义一般是在头文件中, 许多源文件会包含它; [me: 如果只是局部使用的常量应该放在cpp中]
Note 定义指针常量时要注意, 除了指针所指的类型定义成const, 指针也经常要定义成const; Ex. const char* const kName = "Scott";

定义类的常量, 把常量限制在类中, 为了保证常量只有一份拷贝, 把它定义为静态成员:

1
2
3
4
5
6
class GamePlayer {
private:
    static const int NUM_TURNS = 5; // constant declaration (老的编译器不接受静态成员声明时初始化)
    int scores[NUM_TURNS]; // use of constant
...
};

Note 如果上面只是NU_TURNS的声明(没有 '= 5'), 必须在类实现代码中定义类的静态成员: const int GamePlayer::NUM_TURNS = 5; // mandatory definition; goes in class impl. file;

[文中可能是写反了, 头文件中有了 '= 5'就已经是定义了, 不需要在cpp中再定义;]

Note 类内只允许初始化整数类型的静态成员: int, bool, char...

Issue 必须在头文件中定义静态成员的情况: 当你的类需要用到这个类的常量时: e.g. GamePlayer::scores数组声明(编译时需要知道数组大小); [SIZE必须是静态常量或枚举数]

Solution 对于不支持头文件定义静态常量的编译器, 借用enum, 当需要int类型时可以使用枚举类型:

1
2
3
4
5
6
7
class GamePlayer {
private:
    enum { NUM_TURNS = 5 }; // "the enum hack" — makes
    // NUM_TURNS a symbolic name for 5
    int scores[NUM_TURNS]; //fine
...
}

#define 指令实现看起来像函数的宏, 但是不会导致函数的调用;

#define max(a,b) ((a) > (b) ? (a) : (b)) 要保证每个参数加上括号, 即使这样还是会有预期外的情况:

1
2
3
int a = 5, b = 0;
max(++a, b); // a 的值增加了2 次
max(++a, b+10); // a 的值只增加了1 次

>根据值来决定max的运行;

使用内联函数替代: inline int max(int a, int b) { return a > b ? a : b; }

使用模板来扩展int之外的类型:

1
2
3
template<class T>
inline const T& max(const T& a, const T& b)
return a > b ? a : b; }

>模板产生一套函数, 每个函数比较两个可以转换成同种类型的对象, 返回大的;

Note 在使用模板写max之类的通用函数前, 先检查标准库中是否已经存在;

const和inline减少了预处理的使用, 但是#include还不能缺少, #ifdef/#ifndef 在控制编译的过程中也很重要;


条款2 尽量用<iostream>而不用<stdio.h>

scanf/printf 轻巧, 高效, 但不是类型安全的, 没有扩展性; 需要把读写的变量和控制读写格式的信息分开(FORTRAN style);

>>和<<, 实现重载函数可以处理不同的类型; 读写语法形式相同, 不需要记住格式规定;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int i;Rational r; //有理数
cin >> i >> r;
cout << i << r;
class Rational {
public:
    Rational(int numerator = 0, int denominator = 1);
...
private:
    int n, d; // 分子,分母
    friend ostream& operator<<(ostream& s, const Rational& r);
};
ostream& operator<<(ostream& s, const Rational& r)
{
    s << r.n << '/' << r.d;
    return s;
}

>"opertaor<<"不是成员函数(是操作符);

相对不足:

1) 有些iostream的操作比起相应的C stream效率低; 

2) 标准化过程中, iostream库在底层做了很多修改, 对要求最大可移植性的程序来说, 不同的厂商遵循标准的程度不同;

3) iostream库的类有构造函数, <stdio.h>里的函数没有, 在某些涉及静态对象初始化顺序的时候, 如果可以确定没有隐患, 用标准C库更简单实用;

优点: iostream库的类和函数类型安全, 可扩展性好;

库的包含: <iostream>

#include <iostream.h> 得到的是置于全局空间的iostream库元素;

#include <iostream> 得到的是置于名字空间std下的iostream库元素;

全局空间获取元素可能导致名字冲突;


彩票的未来:基于人工智能与大数据的创新预测模型 随着人工智能(AI)大数据技术的迅猛发展,彩票行业正面临前所未有的变革。本文将探索如何通过结合深度学习、机器学习数据挖掘技术,构建先进的预测模型,以提高彩票开奖结果的预测准确性。通过分析历史数据、应用现代化的计算技术,我们提出了一种创新的彩票预测软件架构,旨在推动彩票行业向着更加智能高效的方向发展。 阅读详情

相关推荐

Effective C++_第2_中文.pdf

Effective C++_第2_中文.pdf,完美高清非扫描电子,带完整详细目录标签

Effective C++ 第二

r00tk1t 二进制安全 | Web安全 | 伪装成程序员的菜鸡 博客首页 所有文章 标签 mailgithubzhihuweiboQQ SEH overwritealgorithmbrowserchromechrome-sandboxcppcpp-primercpp-templatesdll hookingexploitglibcglibc-heaplinuxlinux-...

chenxuanhanhao的专栏 653

[python]基于机器学习的恶意加密流量监测平台.zip

[python]基于机器学习的恶意加密流量监测平台

effective C++学习文档(1

感觉自己已经对c++有了初步的了解,并有了点项目实践的经验,所以想要更进一步的学习c++,参考书籍effective C++ 一方面复习了C++,也有了进一步的理解   Effective 条款1constinline) 尽量用编译器而不用预处理   用const代替#define   但要注意两点 (1)      除了指针所指的类型要定义成const外,重要的是指针也经常

张大彪的专栏 736

Effective C++ 2nd Edition》读书笔记

Effective C++ 2nd Edition》读书笔记 Section 1: 改变旧有的C习惯( Shifting from C to C++ )       Item 1: 尽量以 const inline 取代 #define           Perfer const and inline to #define.      Item 2: 尽量以 取代           

lxu的专栏 1082

Effective C++笔记(1) 从C转向C++

条款1:尽量用constinline(编译器)而不用#define(预处理) 理由:1.#define(预处理)进入编译器之前预处理程序会将符号去掉,代以常量,在编译的时候报错信息指向常量而难以理解,定义一个const常量能很好的解决这个问题;2.用#define来实现那些看起来象函数而又不会导致函数调用的宏:#define max(a,b) ((a) > (b) ? ...

a1341188的博客 117

Effective C++ 2nd Edition (1)

一.  尽量以const inline 取代#define也就是尽量“编译器取代预处理器”const编译器可以更好检查错误,带着数据类型,调用,传递,做函数参数及返回值,长得也帅(呵呵);#define 这玩意也就是个替换不检查错误;类的inline,效率高,调用开销低;inline好歹是个函数,调试时候检查错误方便;类的保护,private什么的也方便。好处多多,记住就行了吧。二 .  尽量以取代废话不说,记住就行。属于历史遗留问题。。。。。三 . 尽量以newdelete取代mallocfree

Kaka的专栏 312

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

“C是一种简单的语言。它真正提供的只有有宏、指针、结构、数组函数。不管什么问题,C都靠宏、指针、结构、数组函数来解决。而C++不是这样。宏、指针、结构、数组函数当然还存在,此外还有私有保护型成员、函数重载、缺省参数、构造析构函数、自定义操作符、内联函数、引用、友元、模板、异常、名字空间,等等。用C++比用C具有更宽广的空间,因为设计时有更多的选择可以考虑。”开始我的effective之旅

zhao0057的专栏 553

Effective C++

条款1:尽量用constinline而不用#define条款2:尽量用而不用条款3:尽量用newdelete而不用mallocfree条款4:尽量使用c++风格的注释条款5:对应的newdelete要采用相同的形式条款6:析构函数里对指针成员调用delete条款7:预先准备好内存不够的情况条款8:   写operator newoperator delete时要遵循常规条款9:   避免

梦开始的地方  1716

effective C++ 第一章:从C转向C++

一、使用constinline取代#define 1.使用const定义常量来代替预处理宏 定义一个常量:const double ASPECT_RATIO = 1.653 这种方法很有效。但有两个特殊情况要注意。 - 定义指针常量时会有点不同,因为常量定义一般是放在头文件中(许多源文件会包含它),除了指针所指的类型要定义成const外,重要的是指针也经常要定义成const。例如

wssjlrw的专栏 804

Effective C++ 总结

条款1:尽量用constinline而不用#define尽量用编译器而不用预处理常量的代码在编译时报错,就会很令人费解。因为报错的是常量。代替函数调用的宏会有很多问题。如:#define max(a,b) ((a) > (b) ? (a) : (b)) 比如里面带有++之类的操作定义某个类(class)的常量一般也很方便,只有一点点不同。要把常量限制在类中,首先要使它成为类的

痞子龙3D编程 1364

Effective C++ 1-6

1.尽量用const inline 而不用#define: 即尽量用编译器,而不是预处理。宏命令导致编译器永远看不到被声明为宏的符号名,而编译器的处理会进行一些错误判断,但预处理不会。 如果出错,调试无法找到宏声明的错误来源,因为这些符号不存在于符号列表中。 宏调用时会出错,如使用自加或自减操作符时。宏应该使用inline 内联函数代替。 在类中可以使用enium来代替宏,如下,在类中声

四夕日 月 837

中文Effective C++:改善程序与设计的55个具体做法

第一章 从C转向C++ 对每个人来说,习惯C++需要一些时间,对于已经熟悉C的程序员来说,这个过程尤其令人苦恼。因为C是C++的子集,所有的C的技术都可以继续使用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来很古怪,他们会问:为什么不用指针的引用来代替呢

robertin的专栏 6405

1.c++入门基础【由浅入深-C++

本文介绍c++入门的相关内容。

插花弄玉的博客 2万+

Effective C++ 学习笔记

Item 1 . 尽量以const inline  取代 #define    原因1:  #define 出错编译器找起来困难,用const可以代替。一、常量   普通常量:    #define ASPECT_RATIO 1.653 // c程序员常用方法    const double ASPECT_RATIO = 1.653;   // c++const替代   指针常量:  con

AOL's Web Log 3774

effective C++(第一章 从C转向C++)

对每个人来说,习惯C++需要一些时间,对于已经熟悉C的程序员来说,这个过程尤其令人苦恼。因为C是C++的子集,所有的C的技术都可以继续使用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来很古怪,他们会问:为什么不用指针的引用来代替呢?C是一种简单的语言。它真正提供的只有有宏、指针、结构、数组函数。不管什么问题,C都靠宏、指针、结构、数组函数来解决。而C++不是这样。宏、指针、

zxy_zs的专栏 1305
上一篇: Qt(QML)本地化
下一篇: Effective C++ 第二版 3)new/delete和malloc/free 4)C++注释
罗伊yc
博客等级 码龄22年 23粉丝 113原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值