c++经验和规范

来源:互联网 发布:地基承载力简单算法 编辑:程序博客网 时间:2024/06/05 15:28

1.现代c++尽量使用vector和迭代器代替使用数组和指针;尽量使用string,另外自己编程时一定要注意内存的释放。

2.自己以前编程的时候有几个判断条件喜欢用if嵌套,实际上可以用例如:index!=s.size()&&!isspace(s[index])来表示,因为只有左边的表达式为真时右边才会执行

3.最近做了一个笔试,有个unsigned char *的图像数据,当时觉得char好像不能直接进行数学运算,然后转换了下。实际上数字采用unsigned char和unsigned int区别不大都可以进行运算,只不过uchar占一个字节表示的是0~255的范围,uint占两个字节,表示的范围是 0~65535。而一个像素的灰度阶是0~255,所以一般用uchar或者byte表示图像。注意有符号的char是在-128~+127之间,肯定是不符合实际表示要求的。

4.“,”运算:首先对左侧的表达式计算求值,然后丢弃掉,再计算右侧的表达式,最终的结果是右侧表达式的值

5.用switch的时候,一定不要漏了break,最好加上default   
6.函数内的局部静态对象(static),可以保持变量一直存在,直到程序终止时才被销毁,此期间即使函数对象所在的函数结束执行也不会对他有影响。但要记得“名字有作用域,对象有生命周期”

7.函数和变量声明最好放在头文件中,而在源文件中定义

8.以前遇到一个考试题:int * matrix[10]表示的是10个指针构成的数组;int (*matrix)[10]是指含有10个整数的数组的指针

9.有一次看代码,看到多次用到assert(expr),不是很明白。这个函数通常用于检测不能发生的条件,当判断为真时什么也不做,判断为假时,输出信息并终止程序的执行。

10.类的成员函数后面加上const 表示函数不改变类里面的对象,在函数前面加const表示函数返回值不可修改

11.函数前加&,之前一直不懂为啥要返回地址,看到一个百度里面的回答挺好的放过来:

这个和函数参数加地址符的作用是一样的,用于返值返回的是引用而不是赋值。也就是说,该函数返值会通过地址传送的方式给到函数调用者要求的返回值,这样可以节省对象赋值造成的内存浪费,通常用于返值是大型对象(而不是简单变量类型)的时候。



比如你有个class T,而这个函数的返值是return T; 加上地址符返值后,返回T变量的地址,将地址传递给接收返值的变量,而不是新建一个类T,调用类的复制函数创建一个新类。”
12.很多需要动态内存的类应该使用vector对象或者string对象管理必要的存储空间。它们可以避免分配和释放内存带来的复杂性。
13.友元就是允许其他类或者函数访问当前类的prviate数据成员。它的声明最好与类本身放在同一个头文件中(类外部),当然,类的内部也需要进行友元声明。
14.最近遇到的一个问题没查出来bug后来知道了。成员函数定义在类的外部的时候,返回类型中使用的名字都位于类的作用域之外返回类型必须指明它是哪个类的成员,当时忘记了在函数明前面加上myQT::这个类的作用域。
15.关于函数指针参数传递的问题:也就是说将指针作为参数进行传递时,事实上也是值传递,只不过传递的是地址。当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参
16.内存释放问题,在函数结束后如果使用的是智能指针会自动释放内存,当有内部的内置指针管理内存时,主要手动在括号结束前加上delete释放掉,如果在delete之前出现异常,内存一样不会被释放,这样可能导致这块内存一直不会被释放。也可以采用自己的释放操作,解除智能指针的绑定,使链接被关闭,从而使智能指针自动释放。
17.用memcpy时老是报错,后来发现是自己使用前未对指针分配内存。。。。还有指针作为形参从外部传输的问题,发现传进取的老是拷贝的,出来接过没变化,目前我采用的是用外部变量图像数据结构里的data直接传值进去。
另外需要注意的是图像指针,窗口,以及内部new 或者malloc要记得手动释放。
18.模板的头文件,既包含声明也包含定义。
19.不要返回局部对象的引用或者指针(自己很喜欢干这事。。。)

原创粉丝点击