让自己习惯c++
1、c++可以看成是多种语言的集合:
- C:c++基于c,所以c语法是通用的,包括数组的一系列常用到的东西。
- Object-Oriented c++:包括类、封装、继承、多态等类属性
- 泛型编程:是比较高级的编程技术,用的可能比较少
- STL:我们常用到的容器库
使用的时候根据使用语言的不同有不同的约束,具体参考具体语言,他们并不是遵守统一的规则。
2、尽量以const、enum、inline 、替换#define
因为#define是直接在预处理器中处理,代码中直接使用字符替换,因此编译器不会检查它,没有编译器的检测并不安全,但是使用变量的话,编译器会进行检测,如果发生错误编译器就会进行提示。并且因为#define是直接使用替换,所以在目标代码中可能会造成大量的冗余。
常量替换#define有两种特殊的情况:
- 定义常量指针:由于常量式通常放入头文件,方便其他文件包含使用,因此指针本身必须是const:
const char* const val = "ss";
const需要写两次,将指针也变成const类型,因为在不同的文件中指针可能会发生改变。可以使用string,比char要好:const std::string str("ss");
- class的专属常量,也就是类内的常量,为了将常量的作用域限制在类内,定义为成员变量,同时为了确保这个变量只保留一份,将变量定义为static。c++中一般要求变量具有声明和定义,如果这个成员变量是专属常量并且是static的整数类型,在不取其地址的情况下可以直接在声明的时候进行赋值而不提供定义式。如果需要取地址或者一定需要定义,则定义写入cpp中,不在头文件中进行定义(整型可以在头文件中进行赋值,cpp文件中要写定义式但是不需要重新赋值)最好统一在cpp中定义。
使用const等替换#define的原因还有,#define没有作用域,只要被定义后面就都有效,无法被封装。简单点说就是对于检测错误以及作用域的判断等方面const都要好用,比较方便。
enum同#define相同不能被取地址,但是可以被编译器识别并且具有作用域。(enum的许多用法都比较好用,例如qt中的类型)
利用宏定义的宏函数确实比较快,没有调用函数的额外开销,但是可能因为语义的解析错误造成一些我们不希望的结果,并且类型的安全性也没有保障,可以使用inline来代替。(实际开发的时候还是会使用一些#define,不过一般主要是字符的替代或者比较简单的语句替换,我自己一般写的是调用某个函数,很少在里面定义函数)。不过出于对程序的安全性等方面的考虑(最常见的报错信息),还是尽量不要写#define。快是比较快,但是造成的麻烦也可能比较多。
未完待续。