IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Effective C++ -> 正文阅读

[C++知识库]Effective C++

view c++ as a federation of languages

把C++语言,当成是一个由多个次语言subLanguage所组成的 federation联邦,而不是单个编程语言!!
这些次语言有:

  • C语言(内置数据类型、指针、预处理、数组)
  • 面向对象编程(class、继承、virtual)
  • Template泛型
  • STL

对于C-like内置类型(int、指针),用 ( int a, int * p) pass-by-value 要好。
对于C++的class,则使用(const T &) pass-by-ref-const 要好。

因为STL里的 迭代器和函数对象,本质是使用的C指针。所以,对于STL的迭代器和函数对象,用pass-by-value 要好。

prefer const/enum/inline to #define

#define PI 3.14 这样的缺点是:
假如出了问题,编译器进行Debug时,就会是:3.14 ....
因为,PI并没有进入symbol table符号表

最好是用: const double PI = 3.14;,用const常量 来替代 #define,这样 出了问题,编译器会提示PI ...,而不是3.14 ...


class ST{
	static const int N = 100;
	int A[ N ];
}

假如说,编译器不允许 static const int 在 类内初始化 = 100,此时A[N]就会出错。
有个补救办法是:

enum { N = 100 };
int A[ N ];

enum 很多行为 类似#define,比如(&N)这是不允许的!! 这等价于:(&100)

对于常量,最好使用const对象 或 enum,来替代#define


#define MAX(a,b) (a > b ? a : b) 这种写法 非常不好。 不要对复杂函数进行宏定义,让宏定义只负责简单的 文本替换。

应该写成:

template< typename T >
inline T MAX( const T & a, const T & b ){
	return a > b ? a : b; 
}

宏:MAX(++a, ++b) 他会变成:(++a) > (++b) ? (++a) : (++b),导致 a和b 都++了 2次!!
而函数的话,到了函数参数这一步,此时参数列表里的ab就固定了,就++了1次

对于#define宏,最好使用inline函数!!


因此,用const, enum, inline 尽量来替代 #define!!!
当然,对于#include #ifdef这些仍然是必需品。

use const whenever possible

  • 请尽量使用const,会帮助编译器检测出错误的行为!! 是一个非常方便实用的助手。
    const可作用域: 变量/对象、函数返回值、函数参数、成员函数
  • 编译器强制对const 实施:bitwise(按位) constness,他不允许对对象的每一个bit内存 进行修改。
    他很简单,不允许对该对象 及其成员变量,进行 赋值操作。C++对常量const的定义,就是bitwise const
class ST{
public:
	int a = 123;
	int * p = &a;
	
	void func() const {
		// p = xx, a = xx; 这都是错误的,违背bitwise
		*p = 888;  // 这是正确的!!! 间接修改了a的值。但符合bitwise
		
		// 如果说,你就想在这里,修改a的值
		// 可以使用: mutable int a = 123;
	}
};	
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:36:17  更:2021-09-20 15:37:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 21:04:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码