Effective C++学习笔记
2014-03-04 09:13
253 查看
1 C++是一个复合式的语言
C++中不同部分有着不同的语言特性,例如:
1.1 在C中传递形参时,按照值传递比按照指针传递效率更高
1.2 在面向对象程序中,对象要按照const引用而不是按照值传递
1.3 在STL编程中采取按照值传递方式
所以说C++中没有统一的准则,要按照不同的特性采取不同的使用方式,这也是为什么C++难的原因
2 尽量以const,enum,inline替换#define
2.1 const用法
2.1.1 以const替换#define。在声明常量时要用const替换#define,因为#define定义的常量,在有的编译器中不进入函数表,这样在编译的时候就可能出错
2.1.2 在类中使用静态的常量时,由于不同的编译器处理方法不同,因为没有统一的标准,在编译出错时,所以需要尝试不同的方法,有的在类中声明时初始化,在类外进行定义,有的类内部声明时不赋值,但是在类外定义时赋值。
2.1.3 在重载=操作符时,要将返回类型声明成const,这样防止两个左值相加后,再被赋予另一个值
2.2 enum在类中用法
在类中如果要使用一个常量声明一个数组时,有的时候编译器不支持这么干,就要用枚举代替静态变量
2.3 inline用法
宏的使用带来了效率,但是有时候会让人误解,且会得到异常结果。inline函数在效率上不会比宏差,又容易理解其中所表达的计算逻辑,其是首选
3 尽量使用const
在重载运算符时要事返回的结果为const,作用是防止误操作a+b=c出现
4 在对象被使用之前被初始化
4.1 C++中C部分的特性和后扩展的特性不同,在C中为了保证性能,编译器不会对内置类型进行初始化,所以C中声明的数组就不是初始化为0,而在C++中的类型,如vector就被初始为0。所以C中的内置类型要手动初始化。
4.2 类在实例化时,构造函数中要使用函数的初始化列表,在此要分清赋值和初始化的概念,就知道赋值会导致性能低效,而初始化使得性能变高
5 了解C++类中默认函数
构造函数,析构函数,拷贝构造函数,拷贝赋值函数
6 若不想使用编译器默认生成的函数就应该明显拒绝
6.1 为了能将一个对象赋给另一个对象,需要实现拷贝构造函数和拷贝赋值构造函数
6.2 有时候又需要明显禁止对象被复制,将拷贝构造函数和拷贝复制构造函数声明为private,即可禁止对象的拷贝和赋值
7 为多态基类声明虚析构函数
7.1 如果基类中有虚函数存在,说明此基函数期待被继承的,就会出现多态性质,那么要求基类中的析构函数也要是虚的,这样用基类对象的指针释放继承对象时才不会发生“局部销毁”现象
7.2 如果不希望一个类成为基类,就不要在其中声明虚函数,因为声明虚函数会使性能下降
C++中不同部分有着不同的语言特性,例如:
1.1 在C中传递形参时,按照值传递比按照指针传递效率更高
1.2 在面向对象程序中,对象要按照const引用而不是按照值传递
1.3 在STL编程中采取按照值传递方式
所以说C++中没有统一的准则,要按照不同的特性采取不同的使用方式,这也是为什么C++难的原因
2 尽量以const,enum,inline替换#define
2.1 const用法
2.1.1 以const替换#define。在声明常量时要用const替换#define,因为#define定义的常量,在有的编译器中不进入函数表,这样在编译的时候就可能出错
2.1.2 在类中使用静态的常量时,由于不同的编译器处理方法不同,因为没有统一的标准,在编译出错时,所以需要尝试不同的方法,有的在类中声明时初始化,在类外进行定义,有的类内部声明时不赋值,但是在类外定义时赋值。
2.1.3 在重载=操作符时,要将返回类型声明成const,这样防止两个左值相加后,再被赋予另一个值
2.2 enum在类中用法
在类中如果要使用一个常量声明一个数组时,有的时候编译器不支持这么干,就要用枚举代替静态变量
2.3 inline用法
宏的使用带来了效率,但是有时候会让人误解,且会得到异常结果。inline函数在效率上不会比宏差,又容易理解其中所表达的计算逻辑,其是首选
3 尽量使用const
在重载运算符时要事返回的结果为const,作用是防止误操作a+b=c出现
4 在对象被使用之前被初始化
4.1 C++中C部分的特性和后扩展的特性不同,在C中为了保证性能,编译器不会对内置类型进行初始化,所以C中声明的数组就不是初始化为0,而在C++中的类型,如vector就被初始为0。所以C中的内置类型要手动初始化。
4.2 类在实例化时,构造函数中要使用函数的初始化列表,在此要分清赋值和初始化的概念,就知道赋值会导致性能低效,而初始化使得性能变高
5 了解C++类中默认函数
构造函数,析构函数,拷贝构造函数,拷贝赋值函数
6 若不想使用编译器默认生成的函数就应该明显拒绝
6.1 为了能将一个对象赋给另一个对象,需要实现拷贝构造函数和拷贝赋值构造函数
6.2 有时候又需要明显禁止对象被复制,将拷贝构造函数和拷贝复制构造函数声明为private,即可禁止对象的拷贝和赋值
7 为多态基类声明虚析构函数
7.1 如果基类中有虚函数存在,说明此基函数期待被继承的,就会出现多态性质,那么要求基类中的析构函数也要是虚的,这样用基类对象的指针释放继承对象时才不会发生“局部销毁”现象
7.2 如果不希望一个类成为基类,就不要在其中声明虚函数,因为声明虚函数会使性能下降
相关文章推荐
- effective c++学习笔记
- Effective c++学习笔记——条款10:令operator=返回一个*this的引用
- Effective c++学习笔记——条款10:令operator=返回一个*this的引用
- Effective C++学习笔记之“尽量使用初始化而不要在构造函数里赋值”
- Effective C++ 学习笔记(5)
- Effective C++学习笔记之第四章(1)
- Effective C++学习笔记 (1)
- Effective C++学习笔记 (8)
- Effective C++ 学习笔记(十五)
- Effective c++ 学习笔记——条款04:确定对象被使用前已先被初始化
- Effective c++学习笔记——条款11:在operateor=中自我赋值
- Effective c++学习笔记——条款11:在operateor=中自我赋值
- Effective C++ 学习笔记:让operator=返回*this的引用
- Effective C++学习笔记 (3)
- Effective C++学习笔记五(实现)
- 条款2:尽量用<iostream>而不用<stdio.h> [effective C++ 学习笔记]
- Effective C++学习笔记之第四章(2)
- 《Effective C++ 》学习笔记-第六章 条款33:避免遮掩继承而来的名称 Avoid hiding inherited names
- Effective C++学习笔记 条款07:为多态基类声明virtual析构函数
- effective c++学习笔记