1.关于结构体中定义函数
在C++中,结构体中定义函数没问题
在C中, 则不行。会报expected specifier-qualifier-list before...
2.在C++中,结构体与类的区别:
在C++中,结构体是一种特殊形态的类。 结构体和类的唯一区别就是: 结构体和类具有不同的默认访问控制属性。
3.C与C++中结构体的区别:
一、相同之处:结构体中可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。但C中的结构体不允许有函数;也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。
二、不同之处:结构体定义中默认情况下的成员是public,而类定义中的默认情况下的成员是private的。类中的非static成员函数有this指针,(而struct中没有是错误的,一直被误导啊,经过测试struct的成员函数一样具有this指针),类的关键字class能作为template模板的关键字 即template<class T> class A{}; 而struct不可以。
实际上,C中的结构体只涉及到数据结构,而不涉及到算法,也就是说在C中数据结构和算法是分离的,而到C++中一类或者一个结构体可以包含函数(这个函数在C++我们通常中称为成员函数),C++中的结构体和类体现了数据结构和算法的结合.
4.关于C++ 类中的this 指针
1).this指针的经典描述:
当你进入一个房子后,
你可以看见桌子、椅子、地板等,
但是房子你是看不到全貌了。
对于一个类的实例来说,
你可以看到它的成员函数、成员变量,
但是实例本身呢?
this是一个指针,它时时刻刻指向你这个实例本身
.this 指针的特点:
1)this只能在成员函数中使用。指向被调用函数所在的类实例的地址
全局函数、静态函数都不能使用this,
2)this在成员函数的开始前构造,在成员函数的结束后清除。
生命周期:同任何一个函数的参数一样
实际上,成员函数默认第一个参数为T * const this。
当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。
如:class A
{
public:
int func(int p)
{}
};
其中,func的原型在编译器看来应该是: int func(A * const this,int p);
this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;
3)一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
4)我们只有获得一个对象后,才能通过对象使用this指针
更进一步:在c语言的结构体中,也可以模拟C++ interface的行为, this 指针的使用如下:
typedef struct IMPIVSInterface IMPIVSInterface;
struct IMPIVSInterface {
void *param; /**< 输入参数 */
int paramSize; /**< 参数空间大小 */
IMPPixelFormat pixfmt; /**< 算法需要数据格式 */
int (*init)(IMPIVSInterface *inf); /**< 初始化函数 */
void (*exit)(IMPIVSInterface *inf); /**< 注销函数 */
int (*preProcessSync)(IMPIVSInterface *inf, IMPFrameInfo *frame);/**< 预处理函数,不对传入此函数的frame额外加锁,故无需free frame,返回值:>=0 正确,<0:错误 */
int (*processAsync)(IMPIVSInterface *inf, IMPFrameInfo *frame);/**< 处理函数, SDK IVS 模块对传入此函数的frame 额外加了锁,故此函数必须在该frame使用完毕后尽快使用free_data函数解锁; 此函数是必须实现的函数,算法结果由此函数产生;返回值:0->实际检测正常返回,1->跳帧检测正常返回,-1->错误 */
int (*getResult)(IMPIVSInterface *inf, void **result); /**< 获取结果资源 */
int (*releaseResult)(IMPIVSInterface *inf, void *result); /**< 释放结果资源 */
int (*getParam)(IMPIVSInterface *inf, void *param); /**< 获得算法参数 */
int (*setParam)(IMPIVSInterface *inf, void *param); /**< 设置算法参数 */
int (*flushFrame)(IMPIVSInterface *inf); /**< 释放由外部通过processAsync输入给算法后被缓存的所有frame */
void *priv; /**< 私有变量 */
};
标签:IMPIVSInterface,函数,int,成员,c++,学习,C++,指针,经验总结
From: https://blog.51cto.com/danielllf/6838301