C++笔记
1.虚函数
类包含虚函数,不论一个还是多个,都会有一个隐藏成员 vTable。 Vtable 指向所有虚函数存储得列表。 不使用虚函数声明时,访问函数时,直接调到类函数定义地址,调用函数;函数使用虚函数声明时,会先跳转到Vtable指向函数泪飙,再匹配函数名称获取函数执行地址。概括说:1)非虚函数,调用函数得对象,直接按照挡墙对象得类::成员函数;2)虚函数,类-》原始类虚函数列表地址VTable-》原始类关联函数。 C++ Primer 说到前者是静态编译,效率高。 后者是动态编译,程序执行得时候,才知道跳转到哪个函数(VTable 执行时才有具体值),效率慢。
这个Vtable似乎是每个对象独立得。因为不能声明static 修饰得函数为vitural 。
2. 调试时监视变量 和实际变量值不一致;监视结果值和执行不一致;声明和定义,同类型变量,名称互换,监视结果和实际不一致。
调试代码过程,发现 监视运行结果值和实际执行值不一致。反复测试,都出现。大体代码如下
声明 void GetRefRoi(int height,int width,cv::Rect sourceRoi,cv::Rect& validRoi); 定义 void GetRefRoi(int width,int height,cv::Rect sourceRoi ,cv::Rect& validRoi) { cv::Rect processRect ; int x = sourceRoi.x ,y = sourceRoi.y , tempWidth = sourceRoi.width , tempHeight = sourceRoi.height; processRect.x = y; processRect.width = tempHeight; processRect.y =width- x -tempWidth;
processRect.height = tempWidth;
…… }
以上代码执行时, processRect.y 数值始终不对。 将“width - x -tempWidth” 拷贝到监视器执行时,这个数据又是对的。鼠标移到 “width”或者将“width”添加到监视,值也是对的。但是 processRect.y运算结果始终不对。
后面试着计算“height- x -tempWidth”,发现 数值和processRect.y数值一致。相当于 width和height数值发生对调。到头文件,发现height和width对调。更改回来,结果正确。
原因:
1.监视和鼠标移动查看变量,是以函数声明为准;
2.执行是以定义实参为主。