C++代码书写中一些常见错误整理与常见字符含义

常见编译错误:
1、 类的声明与实现中容易忽视的重定义默认参数的错误:在C++中, 关于类的声明与实现,要遵守“实现抽象”、“数据隐藏”的原则。因此一般将声明部分放在头文件中,类的成员函数的具体实现放在源代码文件中。但有时为了省事,将头文件中的类的成员函数的声明直接复制到代码文件中,一般情况下是不会出现问题的。但当成员函数的声明中为形参指定了实参时,这样直接复制过去就会造成:error C2572: 重定义默认参数。因此只需要在头文件,或者源文件中声明一次该默认参数,习惯上在头文件中声明。
例如:我再头文件中声明了:
void  CreateInitSmoothGray(const Mat &src, Mat &dst, double sigma = SIGMA);	
在源文件中又声明了:
void  CreateInitSmoothGray(const Mat &src, Mat &dst, double sigma = SIGMA);	
就会出现编译器错误C2572:重定义默认参数了,原因是:我在源文件中定义的sigma(形参),为它赋予了一个(实参)SIGMA,e而我的头文件中也赋予了sigma实参,所以出现上述错误。修改头文件为:
void  CreateInitSmoothGray(const Mat &src, Mat &dst, double sigma);	
2、关于宏定义出错问题:
宏定义如下,当进行宏调用时M(3+3,2),结果发现时9
# define M(x,y)(x*y)

修改为:

# define M(x,y)((x)*(y))
原因分析:出现这样的问题宏定义本身的特性造成的:define仅仅是字符替换,因此调用M(3+3,2)时,x是3+3,y是2,直接将表达式x*y替换字符后,则变成了3+3*2,其计算结果在乘法优先于加法的作用下会得到9这个数值。




常见字符含义:
1、 "::"与“->”含义:

::是作用域运算符, A::B表示使用作用域A中的名称B,A可以是名字空间、类、结构;                                                                   ->是成员提取, A ->B表示提取A中的成员B,A只能是指向类、结构、联合的指针

2、“?:”的含义:

z = x > y ? x : y;	

? :是三元运算符,整个表达式根据条件返回不同的值,如果x>y为真则返回x,如果为假则返回y,之后=赋值给z。相当于:          

 if (x>y) z= x;    else z = y;
3、 "double","int","float",和“char”,"uchar",“const”含义:



猜你喜欢

转载自blog.csdn.net/zhu_hongji/article/details/79993502