C++相关

来源:互联网 发布:网络机顶盒还是网络app 编辑:程序博客网 时间:2024/05/22 17:40


1 C++的STD与windows的min、max冲突
冲突的解决办法是对于引用std的min和max时,用(std::min)(a,b),同样对于其他的min和max要将作用域和函数名先包起来。

2 inline函数要在哪个文件中声明就在哪个文件中定义,比如在.h文件中声明了inline函数,那么,要么在声明的时候就直接定义,要么就在当前h文件的下面给出定义,如果在h文件中声明,在cpp文件中定义,这样会报错。同理,对于模版函数也是一样的。但是静态inline函数是可以将定义和声明分开的。
目前c++还不支持模板定义与实现分开的写法(包括模板类、模板函数、模板结构体等与模板有关的),不过,这个功能已经在0x标准里出现了。
函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误。

3 C++公共函数及初始化问题
a 如果一个函数要在声明的时候就定义,则需要加上inline这一行语句,或者加上static
特别是对与公共函数而言,要么就在h文件中进行声明,在cpp中定义,否则,
如果直接在h文件中进行定义的话,会报错,说多次定义,
b 而对于C++中的类中的函数,可以在其h文件中声明的候就进行给出定义,在这里就相当于
inline,即成为内联函数,而对与上面的不是类,而就是单纯的C的函数问题,要注意
c 对于类的初始化问题,我们可以在构造函数的定义中通过如下形式来进行初始化
1) 声明:以下是类Fir1的两个构造函数,在h文件中声明如下,其中有一个私有变量

Fir1(double *coefficients, unsigned number_of_taps); Fir1(const char* coeffFile, unsigned number_of_taps = 0); double        *coefficients; double        *m_input; double        *m_input_buffer; double        *buffer; unsigned      taps, offset,m_input_length;

2) 定义 构造函数时对私有变量进行初始化

Fir1::Fir1(double *coefficients, unsigned number_of_taps) :coefficients(coefficients),buffer(new double[number_of_taps]()),  taps(number_of_taps), offset(0){}Fir1::Fir1(const char* coeffFile, unsigned number_of_taps) :offset(0),taps(number_of_taps){}

4 与static函数定义相关的一些简单总结:
与static相关的更全面的总结见网址:http://baike.baidu.com/view/536145.htm#21
static对于函数而言,主要表示其作用域,对于只在当前文件下使用的函数,加上static后就相当于限定了该函数的使用范围,在其他文件里面即使有该函数也不会出现重复定义2 当函数在h文件中声明的时候就定义,需要在函数的前面加上static inline,这样就不会报错,如果在h文件中声明的时候直接定义,不上关键字的话,会报错
对于类的静态成员函数,其只能够访问类内部的静态数据,在opencv中有很多类中有静态成员函数,比如,stitcher类,里面有一个静态函数createdefault(),该函数的主要作用是在内部定义一个stitcher,并将其参数设定为默认参数,然后将该对象返回,需要注意的是,该类定义了一个stitcher对象,并将该stitcher返回,并没有访问该类的成员变量,虽然定义了一个stitcher的对象,但是该类的访问就是作为一个数据类型来访问,与前面提到的静态函数只能够访问类的静态数据并不矛盾。

0 0
原创粉丝点击