My inspiration from reading *C++ Primer*, *Effective C++*, *More Effective C++*, *The C++ Standard Library* and some experience from coding.
Include:
* Debug
* C++ Syntax
* Habit && Optimization
* Trick
* Trap
* Reference
Convert to study guideBETA
Transform any presentation into a summarized study guide, highlighting the most important points and key insights.
3. 什么是IDE
? 集成开发环境(Integrated Development
Environment,简称 IDE)
? IDE通常包括编程语言编辑器、自动建立工具、通
常还包括调试器。有些IDE包含编译器/解释器
? Microsoft Visual Studio
? Dev C++
? Code::Blocks
? Lazarus
? Free Pascal IDE
31. 类的构造函数 Constructor
? struct Point
? {
? int x, y;
? Point(const int a, const int b): x(a), y(b) { }
? };
? Point p1(1, 2); //OK!
? Point p2; //Error!
? Point parr[10]; //Error!
? 错误:对 ‘Point::Point()’ 的调用没有匹配的函数
32. 默认参数
? struct Point
? {
? int x, y;
? Point(const int a = 0, const int b = 0):
? x(a), y(b) { }
? };
? Point p1(1, 2); //OK!
? Point p2; //OK!
? Point parr[10]; //OK!
? 可以用于任何函数,但是必须在形参表的最后面,并且赋给的值必须
为常量或者静态变量
33. 静态变量 static
? 和全局变量一样放在静态存储区,自动被初始化,丌占用栈的空间,
但是和局部变量一样有作用域限制
? void AddEdge(const int x, const int y, const int w)
? {
? static int LinkSize;
? Edge *node = g+(LinkSize++);
? node->v = y;
? node->w = w;
? node->next = header[x];
? header[x] = node;
? }
35. Effective C++ Item02
? Prefer consts, enums, and inlines to
#defines
? #define PI 3.14
? const long double PI = 3.14
? 用#define的话出错的信息非常难以理解,因
为编译器会告诉你3.14错了而丌是PI错了
36. Effective C++ Item02
? #define PLUS(A, B) A+B
? 3*PLUS(1*2,2*3) // ERROR! 3*1*2+2*3 = 12
? #define PLUS(A, B) ((A)+(B))
? 3*PLUS(1*2,2*3) // 3*((1*2)+(2*3)) = 24
? #define MAX(A, B) ((A)>(B)? (A) : (B))
? a = MAX(++x, ++y)
// if x=10, y=3 => x=12, y=4, a=12
? inline int plus(const int a, const int b)
? { return a+b; }
? inline int max(const int a, const int b)
? { return a > b ? a : b; }
37. Effective C++ Item02
? #define pointer int*
? const pointer p; // const int* p
? ERROR! p可变,*p丌可变
? pointer const p; // int* const p
? p丌可变,*p可变
? typedef int* pointer;
? const pointer p; // int* const p
? pointer const p; // int* const p
? typedef int Array[100];
? Array a, b, c;
38. Effective C++ Item03
? Use const whenever possible
1. 编译器可以优化
2. 防止错误
? void foo(int a, int b, int c)
? {
? if (c = a*b) // OK, but I want if (c == a*b)
? ...
? }
? void foo(const int a, const int b, const int c)
? {
? if (c = a*b) // ERROR!
? ...
? }
? 错误:向只读形参 ‘c’ 赋值
39. Effective C++ Item03
? class Bigint
? {
? int _data[MAXLEN];
? //...
? public:
? int& operator[](const int index) { return _data[index]; }
? const int operator[](const int index) const { return _data[index]; }
? //...
? };
40. Effective C++ Item20
? Prefer pass-by-reference-to-const to pass-by-value
? struct Matrix
? {
? int a[100][100];
? //...
? };
? void foo1(Matrix m) { }
? void foo2(const Matrix m) { }
? void foo3(Matrix& m) { }
? void foo4(const Matrix& m) { } // Prefer This
? 使用const可以防止修改并且允许字面值,&可以防止复制
41. Effective C++ Item53
? Pay attention to compiler warnings
? void foo(int a, int b, int c)
? {
? if (c = a*b)
? ...
? }
? 警告:建议在作用真值的赋值语句前后加上括号 [-Wparentheses]
42. More Effective C++ Item02
? Prefer C++-style casts
? C风格转换:
? (T) expr
? C++风格转换:
? static_cast<T>(expr) 最常用,如double -> int型
? const_cast<T>(expr) 去掉const,如const int -> int
? dynamic_cast<T>(expr) 不类的继承有关
? reinterpret_cast<T>(expr) 不编译平台有关
? C风格的抓换仍被保留,可以处理 static_cast const_cast
reinterpret_cast 能处理的转型
? C++风格转型操作符多,分类明确。优点一是语义明确,对程序员和对编
译器都很友好;二是方便编译器查错
? const long double average = static_cast<long double>(sum)/n;
43. More Effective C++ Item06
? Distinguish between prefix and postfix
forms of increment and decrement operators
? i++ 后自增式 postfix i+1并且返回原来的i
? ++i 前自增式 prefix i+1并且返回新的i
? 一般后自增式会有额外的开销,即备份原来的数值,因此在能使用前自增式的时候尽
量使用前自增式
? 但是对于内置类型(比如int)编译器会自动作出优化
? for (int i = 0; i < n; i++) ... // OK
? for (int i = 0; i < n; ++i) ... // recommended
? for (vector<int>::iterator iter = v.begin(); iter != v.end(); iter++)
... // OK, but NOT recommended
? for (vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter)
... // recommended
54. std::set::erase
? std::set std::multiset std::map std::multimap
都是红黑树写的,在插入和删除节点的时候会使迭代器失效
? for (set<int>::iterator iter = s.begin(); iter != s.end(); ++iter)
? if (condition to delete s)
? s.erase(iter); //ERROR! iter doesn't exist after erase, can’t ++iter
? for (set<int>::iterator iter = s.begin(); iter != s.end(); )
? if (condition to delete s)
? s.erase(iter++); //OK!
? else
? ++iter;
55. using namespace std
? 这句话会引入std::的所有东西
? #include <iostream>
? using namespace std;
? int left, right;
? int main()
? {
? cin >> left >> right;
? //...
? }
? 错误:对 ‘left’ 的引用有歧义
? 原因是在ios_base.h中有一个函数叫做left
56. using namespace std
? 解决办法:
? 丌引入
? #include <iostream>
? int left, right;
? int main()
? {
? std::cin >> left >> right;
? }
? 或者using需要的东西
? #include <iostream>
? using std::cin;
? int left, right;
? int main()
? {
? cin >> left >> right;
? }
63. Reference
? Effective C++: 55 Specific Ways to Improve Your Programs and Designs
(3rd Edition)
Scott Meyers
? More Effective C++: 35 New Ways to Improve Your Programs and Designs
Scott Meyers
? The C++ Standard Library: A Tutorial and Reference
Nicolai M. Josuttis
? C++ Primer (4th Edition)
Stanley B. Lippman, Josée Lajoie, Barbara E. Moo
? C++操作符重载手册
http://www.adintr.com/myarticle/operator.html
? Standard Template Library Programmer's Guide
http://www.sgi.com/tech/stl/
? C++ Reference
http://www.cplusplus.com