在使用c/c++时有许多细节和技巧需要注意的,但很多时候时间一长不用就忘掉了,故一点一滴记录下来,以作备忘!
1、函数调用
函数调用的参数不改变参数内容的应在参数前加上const,如void function(const char * ServerName),防止误修改。
但函数参数是结构体或者对象时,传入的参数应为指针或者引用,如void function(struct OneStructure & Parameter)或者void function(struct OneStructure * pParameter),而不应该是void function(struct OneStructure Parameter),因为后者方法会在传参是复制一个结构体而前者则只是复制一个指针或者引用。
函数接受的参数越少越好。
当一个频繁被调用而且函数比较小巧时使用内联inline来提高效率,如inline void f(void)。
2、基本语句
if的效率问题,一定要把最容易成立的条件放在最前面进行判断,如if( (float)rand() / RAND_MAX > 0.2 ) //有80%的可能运行if部分;而不是if( (float)rand() / RAND_MAX < 0.2 ) //只有20%的可能运行if部分。应该把最难成立的条件放在第一的位置上,如
if ( (float)rand() / RAND_MAX < 0.2 // 只有%20的可能
&& (float)rand() / RAND_MAX < 0.3
&& (float)rand() / RAND_MAX < 0.4 )
while循环比for循环在每次的循环中都少一条汇编语句. 主要是因为while循环是从大到小的顺序循环,不需要和10进行比较就可以跳转.而且可以直接利用--j语句设置的符号标志进行条件判断
3、构成函数
只要类里有指针时,就要写自己版本的拷贝构造函数和赋值操作符函数。
尽量使用初始化而不要在构造函数里赋值。
4、explicit关键字
c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的。如class MyClass{public:MyClass( int num );},当使用MyClass obj = 10时,编译器会进行隐式的转换,即MyClass temp(10);MyClass obj = temp;所以这样的赋值是合法的吗,编译器不会报错,而已这样的赋值却不是我们想要的,往往这样很容易造成程序潜在的bug。因此,如果写成explicit MyClass( int num );,再出现上面的赋值时编译器就会报错,防止了这种意外赋值情况的发生。