Effective C++ ——让自己习惯C++
条款一:视C++为一个语言联邦
为了理解C++,你必须认识其主要的次语言。幸运的是总共只有四个:
- C:C++是由C语言继承而来的,必然对C有很好的兼容性,这一部分主要包括C中的一些语言,库函数等。但当你以C++内的C成分工作时,高效编程守则照出C语言的局限:没有模板、没有异常、没有重载。。。
- Object-Oriented C++:这部分也就是C with Class所诉说的:classes(包括构造函数和析构函数)、封装、继承、多态、virtual函数(动态绑定)。。。。等等。
- Template C++:这一部分主要是泛型编程。
- STL:标准模板库,主要是以template C++为基础实现的,里面提供了很多有用的类和对应的算法,帮助我们很好的结果了C语言中要自己去解决的问题,主要有容器(数组就是一个特殊的容器)、迭代器(智能指针,之所以用迭代器是为了通用性)、算法(包括容器特殊的算法和容器间通用的算法)、函数对象(能想函数一样被调用的对象,通过重定义对象中的()操作符来完成的)、适配器(可以理解为修改了容器接口实现的一种容器),这一部分是c++强大的后盾,学习C++。不能不学STL,不仅会用最好能知道STL中成员的实现方式,这样就能更加高效的使用!
在头文件中以#define定义的常量在预编译期间直接对对应的符号进行替换,没有内存的申请,这也是#define可以放到头文件中的原因,对于const常量定义中,它将常量直接放入到符号表中,不会申请固定的内存,除非对该常量有内存的引用,这也就是为什么const定义的常量能像#define一样放到头文件中,在const常量的使用中主要常量重叠的出现,相关知识自行查阅!
class GamePlayer{
private:static const int NumTurns = 5;//常量声明式int score[NumTurns];//使用该常量.....
}
上面中NumTurns是常量的声明而不是定义式,在后面的使用中如果只是使用该常量并没有用到该常量的地址,就可以不用再对该常量做定义,否组需要如下的定义:
const int GamePlayer::NumTurns;
请把这个式子放进一个实现文件而非头文件。由于class常量已在声明时获得初值,因此定义时不可以再设初值。
class GamePlay{
private:static const int NumTurns;//static class常量声明位于头文件内.......
}
后面接着定义:
const int GamePlay::NumTurns=5;//static class常量定义位于实现文件内
enum
1 比较像#define而不像const。取一个enum的地址不合法,所以可以防止pointer或reference指向你的某个整数常量。
2 模板元编程的基础技术
Template Inline代替宏
#define CALL_WITH_MAX(a,b) f((a) > (b)) ? (a) :(b))
int a = 5,b = 0
CALL_WITH_MAX(++a,b); //a被累加两次
CALL_WITH_MAX(++a,b+10);//a被累加一次
对应的替代方案就是采用inline函数来替换:
template<typename T>
inline void callWithMax(cosnt T &a, cosnt T &b)
{f(a > b ? a : b);
}
其中用到了template模板函数,之所以用引用时为了自定义的类型,如果只是内置类型,可以不需要引用!
- 对于单纯常量,最好以const对象或enums替换#defines;
- 对于形似函数的宏,最好改用inline函数替换#defines。
const int * pi;
int * const pi;
在STL中,迭代器也是一种指针,const可以对迭代器进行修饰,对应的也有两种修饰的方式:
const std::vector<int>::iterator iter;
std::vector<int>::const_iterator iter;
class Ration{};
const Ration operator*(const Ration& lhs,const Ration* rhs);
class Ration{
private:int n_;
public:int getn(){return n;}int getn() const{return m;}void setn(int i) const{n = i;}
};
在C++中有函数重载的概念,对同名的函数,如果函数的参数类型或者个数不相同,就可以作为不同的函数,这个主要是通过在编译源代码过程中对不同的函数重新命名来实现,对于const修饰的函数,不能对对象的任何成员进行修改,并且const修饰的对象只能调用对象的const成员函数,其中const对象主要是作为函数的参数进行传递的!
class Ration{
private:int n_;
public:int getn(){return n;}int getn() const{return m;}void setn(int i) const{n = i;}
};
定义一个const Ration test,则test调用getn()函数的时候只能调用const的get函数,不能调用普通的成员函数,如果没有const的成员函数,将报错,对应的例子中的setn函数定义为const函数,但是它却对成员n进行了赋值,因此是不允许的,编译也不会通过,如果想让setn()函数编译通过,我们可以借助关键词mutable,将n定义为mutable int n,这样即使在const函数中也可以对n进行修改!咱们一般的应用中很少直接定义一个const的对象,一般const的对象是用在函数的形式参数中出现的!
ABEntry::ABEntry(char&name,char& address,list &phones):theName(name),theAddress(address),thePhones(phones)
{
…….
}
编译器会为用户自定义类型(user-definedtypes)之成员变量自动调用default构造函数--- 如果那些成员变量在“成员初始化列表”中没有被指定初值的话。
成员变量是 const 或references,它们就一定需要初值,不能被赋值。
C++有着十分固定的“成员初始化次序”。Base classes 更早于其derived classes 被初始化,而class的成员变量总是以其声明次序被初始化。
Static 对象,其有效时间从被构造出来直到程序结束为止,因此stack和heap-based对象被排除。
为内置对象进行手工初始化,因为C++不保证初始化它们;
构造函数最好使用成员初始化列表,而不要在构造函数本体内使用赋值操作。初始化列表列出的成员变量,其排列次序应该和它们在类中的声明次序相同;
为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。
转载于:https://www.cnblogs.com/wangfengju/p/6172478.html
Effective C++ ——让自己习惯C++相关推荐
- [.NET] 《Effective C#》快速笔记(一)- C# 语言习惯
<Effective C#>快速笔记(一)- C# 语言习惯 目录 一.使用属性而不是可访问的数据成员 二.使用运行时常量(readonly)而不是编译时常量(const) 三.推荐使用 ...
- More Effective C++之 Item M35:让自己习惯使用标准C++语言
自1990年出版以来,<The Annotated C++ Reference Manual >(见原书P285,附录:推荐读物)是最权威的参考手册供程序员们判断什么是C++拥有的而什么不 ...
- 《Effective C++》-第一章-让自己习惯C++
本节介绍<Effective C++>前言以及第一章相关. 仅作为本人学习<Effective C++>的学习笔记. 送给各位的一句话:种一棵树最好的时间是十年前,其次是现在. ...
- 【Cpp】《Effective C++》第一章-让自己习惯C++
这是我在学习<Effective C++>中总结得出的心得与体会,完全是以我自己的理解所作的笔记,是对个人经验的积累.基于第三版我以每个章节进行总结,全书一共九个章节. 第一章-让自己 ...
- Effective C++ 3nd 笔记——让自己习惯C++
Effective C++ 3nd 笔记--让自己习惯C++ 尽量以const,enum,inline替换#define 宏定义在预处理阶段就进行了字符串替换,于是你的宏名有可能没进入符号表: 对于浮 ...
- 阿龙的学习笔记---Effective C++---第一章:习惯C++
条款1:视C++为一个语言联邦 C++发展至今已经不只是C with classes的概念了,他是一个多重范式的编程语言.可将其视为一个多重语言的联邦. C++的次语言被总结为以下4个: C语言.说到 ...
- seven habits of highly effective people 高效能人士的七个习惯
习惯的模型 : dependent 依赖 -- independent 独立自主 --interdependent 互相依赖 1: be proactive 主动积极 what you can ...
- Effective C++ 01 让自己习惯 C++
1. 让自己习惯 C++ 条款 01:视 C++ 为一个语言联邦 为了理解 C++,必须认识其主要的次语言: C:C++ 仍以 C 为基础.很多时候,C++ 对问题的解法起始是较高级的 C 的解法(如 ...
- 《Effective C#》读书笔记——条目11:理解短小方法的优势C#语言习惯
在应用程序开发过程中,开发者都力求写出更加高效的代码.但是当你想手工为C#编译器优化代码时,你的种种优化可能反倒会阻碍JIT进行更加高效的优化.因此,我们最好尽可能的写出最清晰的代码,将优化工作交给J ...
最新文章
- 在HTML网页中巧用URL
- 增长黑客入门:手把手教你增长模型的实践操作
- python划分数据集用pandas_用pandas划分数据集实现训练集和测试集
- 你真的了解 Cookie 和 Session 吗?
- Spring 的前世今生
- java 桥梁模设计,Java设计模式学习篇(九)桥接设计模式
- 华为发布岳云鹏手机_刚刚,华为发布鸿蒙2.0!手机可用!
- gduuu 中旅 他最恨的是猎人
- 经验分享:Web前端入门要怎么开始学?
- git常用命令与常见错误
- MySQL(一):分别基于mysqldump、lvm2、xtrabackup三种方式实现备份恢复
- Linux内核空间与用户空间信息交互方法
- c语言mppt例子,mppt太阳能控制器电路原理
- MSF利用ms17_010实验
- 五、Sql Server 基础培训《进度5-数据类型(知识点+实际操作)》
- 微信成语接龙小程序|微擎框架|带流量主|前端+后端完整源码
- 新技术焦虑症?来这里拿药 ~~
- Error: Failed to load config “standard“ to extend from
- 干货 | 播音主持必知的五十个知识
- 华为否认因“子承父业”挤走孙亚芳( 转载)
热门文章
- AM3354开发 -- bash: /root/opt/arm-arago-linux-gnueabi/bin/arm-arago-linux-gnueabi-gcc: No such file or
- UNIX再学习 -- 网络IPC:套接字
- USB OTG ID 检测原理
- 复习1 - String,StringBuilder,StringBuffer的执行效率区别
- 更别致的词向量模型(一):simpler glove
- Linux系统中,read文件过程分析
- 深入FFM原理与实践
- JZOJ 5197. 【NOIP2017提高组模拟7.3】C
- python 生产者和消费者模式_Python爬虫:生产者和消费者模式
- 公文字体字号标准2020_党政机关公文格式典型错误20例,引起重视!