配套视频课程已更新完毕,大家可通过以下两种方式观看视频讲解:
关注公众号:爱编程的大丙,或者进入大丙课堂学习。
friend关键字在C++中是一个比较特别的存在。因为在大多数编程语言中是没有提供friend关键字的,比如Java。friend关键字用于声明类的友元,友元可以无视类中成员的属性( public、protected 或是 private ),友元类或友元函数都可以访问,这就完全破坏了面向对象编程中封装性的概念。但有的时候,friend关键字确实会让程序猿少写很多代码,因此 friend 还是在很多程序中被使用到。
1. 语法改进在 C++11 标准中对 friend关键字进行了一些改进,以保证其更加好用:
声明一个类为另外一个类的友元时,不再需要使用class关键字,并且还可以使用类的别名(使用 typedef 或者 using 定义)。
我们可以看看下面的例子:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525 ...
配套视频课程已更新完毕,大家可通过以下两种方式观看视频讲解:
关注公众号:爱编程的大丙,或者进入大丙课堂学习。
相比于C++98标准,C++11整型的最大改变就是多了long long。但事实上,long long 整型本来就离C++标准很近,早在1995年,long long 就被提议写入 C++98标准,却被C++标准委员会拒绝了。而后来,long long类型却进入了C99标准,而且也事实上也被很多编译器支持。于是辗转地,C++标准委员会又掉头决定将 long long纳入 C++11标准。
1. long long 类型C++11 标准要求 long long 整型可以在不同平台上有不同的长度,但至少有64位。long long 整型有两种∶
long long - 对应类型的数值可以使用 LL (大写) 或者 ll (小写) 后缀
12long long num1 = 123456789LL;long long num2 = 123456789ll;
unsigned long long - 对应类型的数值可以使用 ULL (大写) 或者 ull (小写) ...
配套视频课程已更新完毕,大家可通过以下两种方式观看视频讲解:
关注公众号:爱编程的大丙,或者进入大丙课堂学习。
1. C++98 标准的类成员初始化在C++98中,支持了在类声明中使用等号 = 加初始值 的方式,来初始化类中静态成员常量 。这种声明方式我们也称之为”就地”声明。而非静态成员变量的初始化则必须在构造函数中进行。
下面通过一段代码来举例说明:
123456789101112struct Base { Base() : a(250) {} Base(int num) : a(num) {} int a; int b = 1; static int c = 0; static const double d = 3.14; static const char* const e = "i am luffy"; const static int f = 0; };
如果按照 C++98 标准来解读上面这段代码 ,其中有这么几行语法是 ...
配套视频课程已更新完毕,大家可通过以下两种方式观看视频讲解:
关注公众号:爱编程的大丙,或者进入大丙课堂学习。
1. 异常异常通常用于处理逻辑上可能发生的错误,在C++98中为我们提供了一套完善的异常处理机制,我们可以直接在程序中将各种类型的异常抛出,从而强制终止程序的运行。
1.1 基本语法关于异常的基本语法如下:
12345678910111213int main(){ try { throw -1; } catch (int e) { cout << "int exception, value: " << e << endl; } cout << "That's ok!" << endl; return 0; }
异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上构造的所有对象,都会被自动析构 ...
配套视频课程已更新完毕,大家可通过以下两种方式观看视频讲解:
关注公众号:爱编程的大丙,或者进入大丙课堂学习。
1. 断言断言(assertion)是一种编程中常用的手段。在通常情况下,断言就是将一个返回值总是需要为真的判断表达式放在语句中,用于排除在设计的逻辑上不应该产生的情况。
比如:一个函数总需要输入在一定的范围内的参数,那么程序员就可以对该参数使用断言,以迫使在该参数发生异常的时候程序退出,从而避免程序陷入逻辑的混乱。
从一些意义上讲,断言并不是正常程序所必需的,不过对于程序调试来说,通常断言能够帮助程序开发者快速定位那些违反了某些前提条件的程序错误。
如果我们要在C++程序中使用断言,需要在程序中包含头文件<cassert>或<assert.h>,头文件中为我们提供了 assert 宏,用于在运行时进行断言。举例说明:
12345678910111213141516171819202122#include <iostream>#include <cassert>using namespace std;// 创建 ...
配套视频课程已更新完毕,大家可通过以下两种方式观看视频讲解:
关注公众号:爱编程的大丙,或者进入大丙课堂学习。
1. 类与默认函数在C++中声明自定义的类,编译器会默认帮助程序员生成一些他们未自定义的成员函数。这样的函数版本被称为”默认函数”。这样的函数一共有六个,我们一起来看一下:
无参构造函数:创建类对象
拷贝构造函数:拷贝类对象
移动构造函数:拷贝类对象
拷贝赋值函数:类对象赋值
移动赋值函数:类对象赋值
析构函数
:销毁类对象
在C++语法规则中,一旦程序员实现了这些函数的自定义版本,则编译器不会再为该类自动生成默认版本。
有时程序员会忘记上面提到的规则,最常见的是声明了带参数的构造,如果还需要无参构造函数,这时候必须定义出不带参数的版本。不过通过编译器的提示,这样的问题通常会得到更正。但更为严重的问题是,一旦声明了自定义版本的构造函数,则有可能导致我们定义的类型不再是POD类型,我们便不再能够享受POD类型为我们带来的便利。
对于上面提到的这些,我们无需过度担心,因为C++11非常贴心地为我们提供了解决方案,就是使用=default 。
2. = ...
配套视频课程已更新完毕,大家可通过以下两种方式观看视频讲解:
关注公众号:爱编程的大丙,或者进入大丙课堂学习。
1. POD 类型POD是英文中 Plain Old Data 的缩写,翻译过来就是普通的旧数据 。POD在C++中是非常重要的一个概念,通常用于说明一个类型的属性,尤其是用户自定义类型的属性。
POD属性在C++11中往往又是构建其他C++概念的基础,事实上,在C++11标准中,POD出现的概率相当高。因此学习C++,尤其是在 C++11中,了解 POD的概念是非常必要的。
Plain :表示是个普通的类型
Old :体现了其与C的兼容性,支持标准C函数
在C++11中将 POD划分为两个基本概念的合集,即∶平凡的(trivial) 和标准布局的(standard layout ) 。
2. “平凡”类型一个平凡的类或者结构体应该符合以下几点要求:
拥有平凡的默认构造函数(trivial constructor)和析构函数(trivial destructor)。
平凡的默认构造函数就是说构造函数什么都不干。
通常情况下,不定义类的构造函数,编译 ...
在项目开发过程中,如果涉及到数据的存储,那么肯定会用到数据库。常用的关系型数据库(操作的时候需要使用sql语句)有:mysql、oracle、sqllite等。在Qt框架中也同样提供了对这些数据库的支持,我们使用Qt提供的数据库类就可以在上层使用相同的接口对各种数据库进行操作了,非常的nice。
关于在程序中连接数据库有很多种处理方式,比如:odbc、ado等,在Qt底层也对数据库的连接进行了封装,基于不同的连接方式为我们提供了不同的插件(二进制代码,在需要的时候被加载,表现形式为动态库、静态库)。虽然如此,但是有一点很杯具:在高版本的Qt中官方并没有为我们提供可用的mysql和oralce插件,只提供了源代码(不能直接使用),需要我们基于这些源码自行编译得到对应的动态库(静态库)之后,才能被程序加载从而连接上相应的数据库。
由于mysql是我们日常工作和学习中用的最多的一种数据库,所以下面为大家讲解一下如何在 Qt 中编译出可用的 MySql 插件。
本文演示使用的版本说明:
使用的IDE:QtCreator
Qt 版本:5.15.2
数据库版本:MySql 8.0.27 ...
1. 游戏概述
1.1 游戏简介“斗地主”是流行于湖北一带的一种扑克游戏,玩法简单,娱乐性强,老少皆宜。据传在万恶的旧社会,地主横行乡里,无恶不做,人们为了发泄对地主的痛恨,常常在一天的劳作之后,一家人关起门来“斗地主”。
1.2 游戏类型V1.0 版游戏是第一个版本为单机版,主要是用户和机器人对战。
后续会开发出网络版……
2. 游戏规则不同地域游戏规则可能有些许差异,游戏按照如下规则进行实现。
2.1 牌型
牌型
描述
王炸
大王+小王,最大的牌
炸弹
四张同数值牌(如四个 9)
单牌
单张的牌(如红桃 3 )
对牌
数值相同的两张牌(如梅花 4+ 方块 4 )
三张牌
数值相同的三张牌(如三个 Q )
三带一
数值相同的三张牌 + 1张单牌,例如: 333+6
三带二
数值相同的三张牌 + 1对牌,例如: 666+33
顺子
五张或更多的连续单牌,不包括 2 和双王
连对
三对或更多的连续对牌,不包括 2 和双王
飞机
二个或更多的连续三张牌,不包括 2 和双王
飞机带翅膀
飞机+同数量的单牌(或同数量的对牌)
四带二
...
C++
未读关于Json这种数据格式,在前面已经做了详细的介绍 Json的格式和用途,在项目开发过程中我们需要针对不同的语言使用不同的库对Json格式的数据进行解析,下面给大家介绍一个基于C语言的Json库 – cJson。cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。
cJSON 是一个开源项目,github下载地址:https://github.com/DaveGamble/cJSON
cJSON,目前来说,主要的文件有两个,一个cJSON.c 一个cJSON.h。使用的时候,将头文件include进去即可。如果是在Linux操作系统中使用,编译 到时候需要添加数学库libm.so,如下所示:
1gcc *.c cJSON.c -lm
1. cJSON结构体在cJSON.h中定义了一个非常重要的结构体cJSON,想要熟悉使用cJSON库函数可从cJSON结构体入手,cJSON结构体如下所示:
123456789typedef struct cJSON { struct cJSON *next,*prev; ...