源码分析 通过《Google Mock(Gmock)简单使用和源码分析——简单使用》中的例子,我们发现被mock的相关方法在mock类中已经被重新实现了,否则它们也不会按照我们的期待的行为执行...gmock关键字、是否有const属性、参数个数、方法名已经所在的行号组成。...MockSpec模板对象在之前我们见过,它是为了实现参数筛选而设计的。其具体实现我们在之后会分析。 无参数的版本忽略了很多函数参数的问题,但是其让我们可以清晰的看见实现的脉络。...EXPECT_CALL、ON_CALL宏 在介绍MOCK_METHOD系列宏是,我们发现其在我们mock的类中定义两个方法和一个变量: GMOCK_RESULT_(tn,...gmock##Method方法是在EXPECT_CALL宏中被调用的。
三,gmock简介 gmock的全称是Google Mock,是Google于2008年推出的C++测试工具,gmock是编写和使用C++模拟类的框架。...gmock可以快速轻松地定义模拟对象,模拟对象提供与真实对象相同的接口。gmock允许开发者定义模拟对象的行为,例如调用哪些方法,以什么顺序,调用多少次,传哪些参数,返回什么样的值等等。...四,gmock的主要特性 1.提供了用于定义模拟行为的声明性语法。 2.支持对任意类型的函数或被重载的函数进行模拟。 3.拥有丰富的匹配器,用于验证函数参数。...开发步骤 测试之前: 确定需要模拟的类接口 定义Mock类,并继承需要被模拟的类 利用MOCK_METHOD宏来模拟虚函数 测试期间: 使用testing命名空间 实例化Mock类,创建模拟对象 设置模拟对象的默认行为或期望行为...第4个参数(Specs)为限定符: const——重写const方法时需要带上 override——覆盖virtual方法时需要带上 noexcept——重写noexcept方法时需要带上 b.定义预期行为
正确性和脚本 代码风格 代码风格最重要的是一致性,其次是遵循C++程序员习惯的阅读风格。 C++允许任意长度的标识符名称,因此在命名时没必要非要保持简洁,建议使用描述性名称,并在风格上保持一致。...使用t_前缀命名函数参数,t_可以被认为是“the”,但其可以表示任意含义,关键是要将函数参数与作用域内的其他变量区分开来,同时遵循一致的命名策略。...使用nullptr C++11引入了nullptr表示空指针,应该用来代替0或NULL来指示空指针。 注释 注释块应该使用//,而不是/* */,使用//可以更容易的在调试时注释掉代码块。...总是使用命名空间 几乎没有理由需要全局命名空间中声明标识符。相反,函数和类应该存在于适当命名的命名空间中,或者存在于命名空间里的类中。...放在全局命名空间中的标识符有可能与来自其他库(主要是没有命名空间的C库)的标识符发生冲突。
注:如果不用gmock,仅仅用到gtest,可以将上述gmock部分内容去掉。 对于 c++ 来说写单元测试和 mock 框架不是一件容易的事情。...,言简意赅地讲解了C/C++单元测试框架gtest的主要使用方法和注意事项,并设计了若干可编译的精简示例,给出了运行效果图。...gtest中常用的所有结构体、类、函数、常量等,都通过命名空间testing访问,不过gtest已经把最简单常用的单元测试功能包装成了一些带参数宏,因此在简单的测试中常常可以忽略命名空间的存在。...,参数为 (statement, type) 需要注意,这些测试宏都接受C/C++语句作为参数,所以既可以像前面那样传递表达式,也可以传递用大括号包起来的代码块。...在 C中,可以实现诸如 SetUp、 TearDown等方法。特别地,测试参数由 TestWithParam实现的 GetParam()方法依次返回。 3.
参考链接: C++继续声明 C++入门 C++关键字命名空间C++输入&输出缺省参数和函数重载为什么C语言不能重载(原理) C++关键字 1、asm _asm是一个语句的分隔符。...一组被大括号包含的指令或一对空括号。...36、void 特殊的"空"类型,指定函数无返回值或无参数。 命名空间 在C++的程序当中我们经常见到 using namespace xxxxxxx; 这就是运用了命名空间。...命名空间分为三种: 1.普通的命名空间 namespace N1 // N1为命名空间的名称 { // 命名空间中的内容,既可以定义变量,也可以定义函数 int a; int Add(int...同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
3.1 隐式转换 C++自定义类型在以下两种情况会发生隐式转换: 1) 类构造函数只有一个参数或除第一个参数外其他参数有默认值; 2) 类实现了operator type()函数;...type()在条件运算中,可以进行隐式转换,这就是为什么C++中的智能指针如shared_ptr的operator bool()加了explicit还能直接进行条件判断的原因。...<明明在全局作用于有定义,为什么找不到匹配的函数?...前面的代码片段,应用ADL在ns内找不到自定义的operator<的定义,接着编译器从最近的作用域std内开始向外查找,编译器在std内找到了operator<的定义,于是停止查找。...好的实践:定义一个类时,应当将其相关的接口(包括自由函数)也放入到与类相同的命名空间中。
C++标准库是一套基于C++语言之上的函数和类库,其早期代码都定义在std命名空间中,大部分类都是用template模板实现的,它主要由IO流,string字符串类,和STL组成。...前面说过老版本C++标准库中的所有类的定义都是在std这个命名空间中。...子命名空间中的 inline关键字则是C++11中为命名空间添加的新关键字:可以在父命名空间中定义内联的子命名空间,内联的子命名空间可以把其包含的名字导入到父命名空间中,从而在父命名空间中可以直接访问子命名空间中定义的名字...++类是在std::这个命名空间中被定义的(因为C++的命名修饰规则的原因,一个方法或者函数被修饰后的名称是包含其所在的命名空间的)。...但是新版本的C++标准库中的所有符号都是在std::__1这个命名空间中,因此链接器将无法找到这个符号。
,未初始化的内存,你可以写一种operator new函数,在返回一个指针之前可以初始化内存以存储一些数值,可是一般不这么做。...void * operator new(size_t, void *location) { return location; } 它也是new操作符的一个使用方法,须要使用一个额外的变量...,第2个参数传递void*指针,第3个参数传递位置 { return &ptr[pos]; } new(p,3)int(10); //将10放在下标为3的空间中 关于new的内部实现机制...注意:真正的汇编中没有具体的函数名,只有相应的地址。显示函数名是VS的一个比较便利的功能。 ::new与new 在全局命名空间中有一个自带的、隐藏的operator new专门用来分配内存。...如果我们想要继续使用默认的operator new,就应该写成::new 字面意思就是调用最外层命名空间中的operator new 值得一提的是最外层的(也是默认的)operator new也是可以被重载的
命名空间的定义 当有两个同名变量时,会优先在找局部的,如果找不到,再找全局的。如果我们想打印1,就可以加上 ‘::’ 前面不加域的情况下,默认是空,也就是全局域,该符号叫域作用限定符。...第三种:使用using将命名空间中某个成员引入 命名空间的嵌套使用 当定义两个同名函数且在同一个命名空间时,可以在里面继续嵌套命名空间,这样就能区分开了。使用时记得有多层解开。...C++输入&输出 说明: 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含头文件 以及按命名空间使用方法使用std。...std命名空间的使用惯例: std是C++标准库的命名空间,如何展开std使用更合理呢? 在日常练习中,建议直接using namespace std即可,这样就很方便。...:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。
和的最大区别在于,其中声明的名称都是位于std命名空间中的,而不是后者的全局命名空间。...string是c++语言中string类模板的申明 CString是MFC中定义的字符串类,MFC中很多类及函数都是以CString为参数的,另外CString类重载了(LPCSTR)运算符,所以如果你在...如果你在MFC下使用C++语言中标准的 string类,那么在调用需要C语言风格的字符串为参数的win api时,你必须显示调用sting.c_str()成员函数,来完成同样的转换,也就是说在使用MFC...h”扩展名的库文件,比如 iostream.h,在新标准后的标准库中都有一个不带“。h”扩展名的 相对应,区别除了后者的许多改进之外,还有一点便是后者的东东都塞进了 “std”名字空间中。...生成 新头文件的方法只是是将现有C++头文件名中的。h 去掉,方法本身不重要,正 如结尾发作的效果不一致也并不重要相同。所以变成了,变成了,等等。
文章目录 一、第一个C++程序 二、命名空间 1、什么是命名空间 2、命名空间的定义 3、命名空间的使用 4、注意事项 三、C++的输入输出 四、缺省参数 1、缺省参数的概念 2、缺省参数的分类 五...命名空间有如下特点: 命名空间的名称是随意取的; 命名空间中可以定义函数/变量/类型; 命名空间可以嵌套; 同一个工程中允许存在多个相同名称的命名空间,编译器最后会将其合成到同一个命名空间中; 命名空间中定义函数...,这个域叫做命名空间域,命名空间中的所有内容都局限于该命名空间中; 2、命名空间中定义的变量都是全局变量:如下图,命名空间N中的成员变量a可以在函数test被访问,说明a的作用域是全局,所以a是全局变量...,就直接到命名空间中去找,再找不到就报错。...---- 三、C++的输入输出 C++的输入输出语句如下: #include // std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中 using namespace
命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。...同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。...left * right; } } 注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中 2.2 命名空间使用 命名空间中成员该如何使用呢?...#include // std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中 using namespace std; int main() { cout<...指针空值---nullptr(C++11) 10.1 C++98中的指针空值 在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针
在使用变量时,默认查找规则:先局部,再全局 图一是创建了命名空间bit,这会打乱默认查找规则,会直接到定义的rand的命名空间中找,即先找指定,所以输出的为10,且 命名空间名 + : : +...---- 2.命名空间的嵌套 命名空间可以嵌套多层 namespace N1 { int a; //全局变量 在命名空间中,只有在自定义函数中,才是局部变量。...---- 4.std官方库定义的命名空间 一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中 C++中,我们使用的函数都在std命名空间里,所以在我们使用时,经常会这样:...---- 三、C++的输入和输出 1.使用 cout 标准输出对象 ( 控制台 )和 cin 标准输入对象 ( 键盘 )时,必须 包含 头文件 以及按命名空间使用方法使用...---- 七、指针空值nullptr(C++11) 在C语言中,指针为空时为NULL; NULL实际是一个宏,在传统的C头文件(stddef.h)中, NULL可能被定义为字面常量0,或者被定义为无类型指针
编译器查找标识符规则: 默认情况:先在标识符所在作用域向上查找,找不到再去全局作用域向上查找,都找不到就报错; 指定(特定)查找:需要使用域作用限定符::,直接去指定的作用域去查找标识符,找不到直接报错...前面已经介绍了使用域作用限定符访问命名空间中成员的方法,接下来我们来看看另外两种访问命名空间成员的方法吧!...在介绍之前先来了解一下C++官方库定义的命名空间std std - C++标准库的命名空间名 C++中的头文件定义的所有内容成员(定义与实现)都处在一个命名空间(作用)域std中,用以与用户使用的成员相隔离...我们先来看一个输入输出的例子: #include // std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中 using namespace std; int...---- 缺省参数是啥 缺省参数即函数默认形参参数,在定义或声明函数时,其形参可以直接给出形参合适的缺省(默认)值;在调用含有缺省参数的函数时,调用者就可以选择对缺省参数是否进行实参的传入了,如果没有指定实参则采用该形参的缺省值
一切都在doctest命名空间中(实现细节在一个嵌套的detail命名空间中)。 所有宏都有前缀——默认情况下有些不带前缀,但这是可选的——请参阅配置。...可以在程序中设置选项,而不是通过argc/ argv从命令行传入。 自己被禁用时不会产生警告。...现代C++ benchmark库 nanobench也是C++11写的header only的库,使用起来也很简单,包含头文件即可。...+测试工具链:doctest+FakeIt+nanobench, 可以完美地替代gtest/gmock和google bench,没有任何依赖,无需安装,直接包含头文件就可以用,非常容易集成和使用,是时候抛弃...引用 C++单元测试工具——doctest_蓝月心语的博客-CSDN博客_c++ 单元测试 purecpp - a cool open source modern c++ community C++-doctest
编写单元测试可以帮助我们在开发阶段就发现错误,并且保证新的修改没有破坏已有的程序逻辑。 在 C++之中,常用的测试框架有 Gtest,Boost test,CPPUint 等。...正是由于 Gmock 的加持,让 Gtest 在多种测试框架之中脱颖而出。...TEST_F适用于多种测试场景需要相同数据配置的情况,利用了 C++继承类来实现对父类方法的测试。...这里我们用到了宏定义 MOCK_METHOD,后面的数字代表了模拟函数的参数个数,如MOCK_METHOD0,MOCK_METHOD1。它接受两个参数:参数1,方法名称。...这里要注意,在通过 Gmock 来编写 Mock Object 时,能够模拟的方法是对于原抽象类之中的virtual 方法。
);//参数列表为空时,()可以不写 //3....c语言中的结构体不允许定义函数成员,且没有访问控制权限的属性。 c++为结构体引入了成员函数,访问控制权限,继承,多态等面向对象特性。 c语言中,空结构体的大小为0,而C++中空结构体大小为1。...20 命名空间和异常处理 20.1 命名空间 命名空间实际上是由用户自己命名的一块内存区域,用户可以根据需要指定一个有名字的空间区域,每个命名空间都有一个作用域,将一些全局实体放在该命名空间中,...声明后,在using语句所在的作用域中使用该命名空间成员时,不必再用命名空间名加以限定。...标准C++库的所有标识符(包括函数、类、对象和类模板)都是在一个名为std的命名空间中定义的。 无名的命名空间,只在本文件的作用域内有效。
,根本不明白这什么意思);如果进行了左移的重载之后,那么程序将产生神奇的变化,所以在 main() 中不用 printf() 和格式化字符串 '\n' 了,因为编译器会通过重载的机制会为我们选择究竟使用哪一个重载机制...二、c++标准库: 1、标准库的特性: C++标准库并不是C++语言的一部分 C++标准库是由类库和函数库组成的集合 C++标准库中定义的类和对象都位于std命名空间中 C++标准库的头文件都不带.h后缀...,是一种将程序库名称封装起来的方法,它就像在各个程序库中立起一道道围墙 int main() { printf("Hello world!...c = 5.000000 注:关于命名空间的介绍,这里没有详细的去介绍,后面会重新做一个详细介绍。...三、总结: C++标准库是由类库和函数库组成的集合 C++标准库包含经典算法和数据结构的实现 C++标准库涵盖了C库的功能 C++标准库位于std命名空间中 本期的内容对于接触过C++的朋友来说,非常简单
命名空间 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。...: 自留地 // b、全局域找 : 村子野地 // c、到展开的命名空间中查找 : 相当于张大爷在自己的自留地加了声明,谁需要就来摘 // 指定展开某一个 //using bit::x; /...#include // std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中 using namespace std; int main() { cout<...std命名空间的使用惯例: std是C++标准库的命名空间,如何展开std使用更合理呢? 1. 在日常练习中,建议直接using namespace std即可,这样就很方便。...采用C++编译器编译后 结果结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。
领取专属 10元无门槛券
手把手带您无忧上云