常见编译错误:
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”含义: