C++
努力的小带土
这个作者很懒,什么都没留下…
展开
-
模板类,具体化
在申明模板类的开头应该使用:template<typename Type>,关键字template告诉编译器将要定义一个模板,Type是一个通用类型说明符,在使用模板时,将使用实际类型代替它,如(string或Int)。模板类的成员函数申明应该为:template<typename Type> bool Stack<Type>::push(),和普通函数不同之处便为函数限定符从Stack::改为Stack<Type>::。值得注意的是,模板类的应该和模板类的申原创 2022-04-13 20:51:34 · 424 阅读 · 0 评论 -
多重继承(虚基类)
存在基类Worker,其中包含名字信息name(string)以及编号信息id(int),现有Singer和Waiter类均继承于Woker类,即 class Singer:public Worker{.....} ;和 class Waiter:public Worker{.......};。假设再由Singer和Waiter派生出SingingWaiter类即class SingingWaiter:public Singer,public Waiter{.....};因为Singer和Waiter.原创 2022-03-22 21:48:46 · 547 阅读 · 0 评论 -
使用using重新定义访问权限
在使用保护派生和私有派生时,基类的公有成员函数,将成为保护成员或私有成员。假设要让基类方法在派生类外可用,则此时就用到了using重新定义访问权限,假设存在以下类:class Student : private string, private valarray<double>{...public: using valarray<double>::min; using valarray<double>::max; ...};上述申明是的min()和原创 2022-03-20 20:53:12 · 413 阅读 · 0 评论 -
抽象类(简单描述)
使用一个通俗且易理解的方法来讲纯虚类,假设有动物类,但动物包含很多属性,比如牛可以算动物,牛的食物是草,但老虎也算动物,它的实物却是肉。在比如圆和椭圆,在数学定义中圆是属于特殊的椭圆,若我们按照定义去取椭圆为基类,会发现有很多不需要的点,比如椭圆存在长轴,短轴,同时椭圆旋转角度不一样,它的形状便不一样,这些对于圆来说都是不需要的,因此简单的将圆继承于椭圆显然不合适,因此便发明了抽象类。纯虚类的申明,首先依靠于纯虚函数,virtual void food() = 0; 便为纯虚函数,即在虚函数申明之后再在虚.原创 2022-03-10 20:26:18 · 1229 阅读 · 0 评论 -
(virtual)虚函数
虚函数用在多态公有继承中,假设存在Brass类和BrassPlus类,且BrassPlus公有继承于Brass类,BrassPlus将针对自己的类属性,对Brass类部分公有函数进行更改,此时便需要申明virtual。如下例代码所示:class Brass{ private: string fullName; long acctNum; double balance; public: // 默认构造函数 Brass(string fn = "None", long原创 2022-03-07 08:57:21 · 266 阅读 · 0 评论 -
初始化列表
假设存在类A代码如下所示/******A.h******/class A{ private: const int n; string a ; public: A(int,string);}/******A.cpp*****/ A(int temp1,string temp2){ n = temp1; a = temp2;}该代码存在一定的问题,原因出在成员n身上,因为n是常量成员,所以应该在初始化类对象的时候就对它进行初原创 2022-03-01 21:26:31 · 621 阅读 · 0 评论 -
自建类的赋值问题
潜复制和深复制以及复制构造函数_努力的小带土的博客-CSDN博客续潜复制及复制构造函数。关于自建类的赋值问题假设存在类Tperson,如下所示:(主要用到的成员变量为_name 和address)class Tperson{private:char* _name ;char* address ;// len1 和 len2分别存储_name和address的字符长度int len1 ;int len2 ;.........public:.........}我们肯定希望该类原创 2022-02-26 15:53:58 · 167 阅读 · 0 评论 -
类的静态成员变量以及静态成员函数
类静态成员的作用:假设存在多个string对象,即string A ;和 string B ; 若string类存在静态成员static c,则针对于该变量A,B均共享同一个c,其实可以等同于在一个家庭中你和你的父母,女朋友共享同一个腾讯视频会员账号。类静态成员的使用:如下述代码,在类A中申明了静态变量a,此时不能进行初始化,是因为类申明只描述如何分配内存,但并不分配内存,类分配内存是在原文件创建对象后进行分配。// A.h A的头文件class A {private : stati原创 2022-02-24 22:32:50 · 807 阅读 · 0 评论 -
自建类与标准类型之间的转换
1、自建类转换为标准类首先任何接受唯一一个参数的构造函数都可以作为变量类型转换函数,即将该参数所在的类型转换为自定义类的类型。若将与该参数相同类型的对象赋值给自建类对象,那么C++将会隐式的调用构造函数。假设存在一个String类,它包含一个将char*值作为唯一参数的构造函数...原创 2022-02-22 21:49:16 · 250 阅读 · 0 评论 -
c++生成随机数
rand()函数是在0 - RAND_MAX中来生成一个随机数的,一般生成区域随机数的方式都为取模,即如下代码所示:v1 = rand() % 100; // v1 in the range 0 to 99v2 = rand() % 100 + 1; // v2 in the range 1 to 100v3 = rand() % 30 + 1985; // v3 in the range 1985-2014在使用随机数函数rand()之前,一般使用srand(ti翻译 2022-02-21 10:39:47 · 2491 阅读 · 0 评论 -
介绍友元函数
友元函数的介绍现给出一个这样的例子,当我们只能使用成员函数进行操作的时候,假设存在一个类class Time{public: // 在类申明中写的函数都是内联函数 Time() { hour = 0; minutes = 0; } Time(int h, int m) :hour(h),minutes(m){; } // 放大倍数 Time operator*(double)const;private: int hour; int minutes;};它具有一个放大倍数的原创 2022-02-20 12:11:47 · 684 阅读 · 0 评论 -
作用域内枚举
传统的枚举,其中两个枚举中定义的枚举量可能会发生冲突。假设有一个处理鸡蛋和T恤的项目,其中包含类似的代码。enum egg {small,medium,large,jumbo}enum t_shirt{small,medium,large,jumbo}这将无法通过编译,因为egg中的small 和 t_shirt中的small位于相同的作用域中,这会引发冲突。解决方案:创建枚举量作用域为类的枚举enum class egg {small,medium,large,jumbo}enum c原创 2022-02-19 11:24:03 · 201 阅读 · 0 评论 -
在构造函数中使用new时应注意的事项
1、如果在构造函数中使用new来初始化指针成员,则应在析构函数中使用delete。2、new和delete必须相兼容。new对应于delete,new[]对应于delete[]。3、若有多个构造函数,则必须以相同的方式使用new,要么都带中括号,要么都不带。4、应定义一个复制构造函数,通过深度构造函数,通过深度复制将一个对象初始化为另一个对象。类似下面代码:String::String(const String & st){num_string++;len = st.len;转载 2022-02-13 22:08:00 · 489 阅读 · 0 评论 -
类作用域常量
在创建类作用域内的常量时,你可能以为这样可行:class A{private: const int Months = 12 ; double consts[Months] ;}其实这是个错误用法,因为类只是提供对象的创建方式,并不能创建对象,因此在A对象没有被申明前,Months是不会通过编译的,因此consts数组不知道Months是什么。目前有两种方式可以解决这个问题:第一种方式申明枚举常量class A{private: enum {Months = 12}...原创 2022-02-13 22:02:47 · 210 阅读 · 0 评论 -
成员函数的内联方法
定义于类声明中的成员函数都将自动成为内联函数,类声明中常将短小的函数作为内联函数,也就是说在下面代码中set_tot()函数为内联函数。class A{ private: int a; int b ; public : int set_tot() {return a*b;}}这段代码同理于下段代码:class A{ private: int a; int b ; public : int set_tot();}inli原创 2022-02-08 21:32:07 · 467 阅读 · 0 评论 -
C++函数模板
编写代码时,若只是参数类型发生改变,核心算法并没有变,此时便能使用模板来自动生成其他类型参量的函数。以下例子给出一个swap模板函数,通过该模板函数在程序内部自动生成swap(char&,char&),及swap(int&,int&),注:模板并不创建任何函数,它只是告诉编译器如何定义函数。#include <iostream>#include <string>using namespace std;// 模板函数申明template &原创 2021-12-19 21:38:32 · 575 阅读 · 0 评论 -
函数返回数组的方法
返回数组的实质便为返回指针,那么我们应当注意,不能返回局部变量的地址。如下述代码所示:int *fun1(){ int temp[arrlen]; for (int i = 0; i < arrlen;++i) { temp[i] = i; } return temp;}这段代码将会造成内存泄漏,原因是它返回了临时变量的数组。正确的返回方式如下所示:// 第一种方法int* returnarray(int U[]){原创 2021-11-25 21:20:40 · 16231 阅读 · 2 评论 -
函数指针(浅)
与数据变量相似,函数也有地址,函数地址是存储函数机器语言代码内存开始的地址。接下来从三个方面来讲解函数指针。1、获取函数的地址获取函数地址很简单,只要使用函数名即可。即think()是函数,则think是该函数的地址,若想将函数作为参数来传递则必须传递函数名。一定要区分传递的是函数的返回值,还是函数名。process(think); // 传递的是函数名process(think()); // 传递的是函数返回值2、声明函数的指针声明的函数指针应指定函数返回值与函数的特征标如下例代码原创 2021-11-04 20:28:02 · 115 阅读 · 0 评论 -
函数递归(浅)
函数递归即函数自己调用自己,注意在C++中不允许,main()进行递归。那有同学就会问,函数的递归这不就陷入了死循环嘛?答案是对的!因此我们需要给定一个判定条件,迫使调用链断裂,例如void类型的递归函数recurs()的代码如下:void recurs(argumentlist){ statements1 if(test) recurs(arguments) statements2}对于上述递归函数,只要test为true 则每个recurs()函数都将执行s原创 2021-10-31 16:27:23 · 95 阅读 · 0 评论 -
二维数组与函数
二维数组在函数中的表现形式同一维数组一样,都是以指针的形式进行表述,那么以二维数组为参数的函数是什么样的形式呢?// 假设现有数组int data[3][4] = {{1,2,3,4},{9,8,6,7},{2,4,6,8}};// 则int total = sum(data,3);说明data是一个数组名,数组中包含三个元素,各元素本身均是一个数组,由4个int组成,故函数原型表达如下:int sum(int (*ar2)[4],int size);// 或者int sum(i.原创 2021-10-30 21:06:11 · 578 阅读 · 0 评论 -
数组与函数
当你想在函数中使用数组的时候,第一时间的想法,唉直接将数组作为参量嘛~,简单。void fillArray(int arr[size]);当运行的时候便傻眼了,hhhhh。其实函数中的参数列表中是没有数组变量的,当我们需要使用函数调用数组的话,被调用的对象只能是数组地址,即以下两种形式。void fillArray(int arr[],int size);void fillArray(int* arr,int size);特别注意:int* arr 与 int arr[] 只在函.原创 2021-10-30 20:57:24 · 387 阅读 · 0 评论 -
读取数字循环
int n ;cin >> n;总所周知,这段代码为输入一个整数,假设我输入了字符'q'那么结果又会如何呢?这种类型不匹配的情况将发生4种情况(同时发生):n的值保持不变; 不匹配的输入将被留住输入队列中 cin对象中的错误标志点将被置位 对cin的调用将返回false(这为cin放在判断语句中设立了条件)cin返回False意味着可以使用非数字输入来结束数字输入循环。非数字输入将导致cin置位错误标志点意味着必须重置错误标志位才能继续读取输入。接下来看一段程序例子,对上面四.原创 2021-10-07 21:44:28 · 168 阅读 · 0 评论 -
continue在while和for循环中的区别
二刷primerPlus的时候发现了一个很有趣的细节,大家都知道continue的作用是跳过本次循环的剩余部分而直接开启下次循环。那么在for循环中,continue将跳转到更新表达式,然后跳到测试表达式处。而在while循环中,continue将直接跳转到测试表达式处。记录一下这个有趣的现象!...原创 2021-10-05 22:19:52 · 939 阅读 · 0 评论 -
C++编写准确延时
说到编写延时,很多人想当然的使用循环去遍历一个变量,比如下例程序:long wait = 0;while(wait < 1000)wait++;但这类程序并没有考虑编译器的计算速度,因此该程序在某些编译器上处理的快然而在某些编译器上则处理的慢。故C++提供了一种准确定时的方法即使用<ctime>头文件中的函数。这个函数名叫做clock() 返回当前时间,但返回时间不一定是秒,故在该函数里面定义了clock_t作为返回别名,来统一管理。在该函数中还有一个常量CLOCK_PER原创 2021-09-24 21:58:07 · 1274 阅读 · 1 评论 -
逗号运算符
逗号运算符允许把两个表达式放在一个表达式的地方,最常见的例子便为for循环:for(i = 0,j = word.size();i>j;i++,j--)但C++还为逗号运算符添加了其他特性:首先是顺序点,它能确保先计算第一个表达式,再计算第二个表达式。例如:i = 20,j = 2*i; // i为20,j为40其次C++规定逗号表达式的值为第二部分的值,即上述表达式的值为40.在所有运算符中逗号表达式的优先级是最低的,例如下面语句:cata = 17,240;其实原创 2021-09-24 16:55:43 · 679 阅读 · 0 评论 -
自动存储、静态存储、动态存储
自动存储在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),意味着它们所属的函数被调用时自动产生,在该函数结束时消亡。自动变量是一个局部变量,其作用域为包含它的代码块。代码块是被包含在花括号中的一段代码。自动变量通常存储在栈中。这说明执行代码块时,其中的变量将以此压入栈中,而在离开时将按相反的顺序释放,即先进后出。静态存储静态存储是在整个程序执行期间都存在的一种存储方式。使变量成为静态的方式有两种:一种是在函数外面定义它;另一种是在函数中使用原创 2021-09-19 19:13:15 · 640 阅读 · 0 评论 -
1、有趣的指针
1、今天发现指针数组一个有趣的现象,众所周知,数组是基于指针而生成的,故指针和数组是可以进行相互转换,如下所示:int num[20];num[1] = *(num+1);但指针和数组还是存在不同点,其中之一便是指针名称是变量而数组名称是常量:int num[20];int* num1 = num;num += 1 ; // 无效,因为数组名称是常量,不允许修改。num1 += 1 ; //有效,且指针指向num[1]2、指针数组和数组的名称均代表第一个元素的首地址,并且带引号原创 2021-09-18 22:27:22 · 117 阅读 · 0 评论 -
字符串的多种形式
以char数组形式申明字符串,需要注意最后结尾一定是\0 即空字符,char数组字符串有多种形式,如:char value[] ,wchar_t value[] ,char16_t value[] ,char32_t value[]等。wchar_t,char16_t,char32_t申明时应该分别带有前缀L , u ,U。 char charr1[] = "What stuiation ? "; wchar_t title[] = L"Chief Astrogator"; ..原创 2021-09-15 15:28:05 · 630 阅读 · 0 评论 -
C++字符串输入
C++中的字符串输入,大体分为三种输入方式 1、cin >> () 2、cin.getline 3、cin.get当通过cin进行输入时,若输入字符中存在空格,回车等,程序将自动结束剩下的字符输入,剩下的字符将全部放在下个cin进行输入,即cin 只能实现简单的单词输入。代码如下所示: const int SIZE = 20; char name[SIZE]; char dessert[SIZE]; cout << "Enter your n.原创 2021-09-14 16:28:41 · 1505 阅读 · 0 评论 -
vector::earse() 函数
本篇文章主要讲解单个删除的例子:#include <iostream>#include <vector>using namespace std;int main(){ vector<int> InVec; // int 类型的容器 for (int i = 0; i <= 7; i++) { InVec.push_back(i); } InVec.push_back(5); for (auto i = InVec.begin(); i原创 2021-07-24 10:49:40 · 2369 阅读 · 0 评论 -
函数操作符operator()
函数操作符():可以将对象当作函数来使用#include <iostream>using namespace std;class Square{public: double operator(doublex) {return x*x;} int operator(int a,int b,int c = 9) {return a + b - c;}};int main(void){ Square square; cout <转载 2021-07-14 10:53:13 · 479 阅读 · 0 评论 -
10、人脸识别
通过级联分类器实现人脸识别,即CascadeClassifier其将N个单类的分类器串联起来,如果 *如果一个对象满足该一系列串联起来的所有分类器,则就能决策其为该分类器对象 *比如人脸,它有很多属性,如两条眉毛,两只眼睛,一个鼻子,一张嘴,一个U型下巴...原创 2021-05-29 10:28:43 · 1558 阅读 · 3 评论 -
C++输出CSV文件(最简单的方式)
参考之前写的输出文件博客,https://blog.csdn.net/qq_42138448/article/details/110307984。总结得下列程序:#include <iostream>#include <fstream>int main( int argc, char* argv[] ){ std::ofstream myfile; myfile.open ("example.csv"); myfile <&.原创 2021-05-13 10:05:21 · 2124 阅读 · 0 评论 -
“错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题
运行别人给的程序时,突然弹出下列界面。项目->属性。将调试信息格式改为程序数据库。在代码生成中启用函数级链接 是(/Gy)。原创 2021-05-07 08:44:28 · 250 阅读 · 0 评论 -
枚举
枚举的句法和结构很相似,例如下面语句:enum spectrum {red,orange,yellow,green,blue,violet,indigo,ultraviolet}该语句具有两个作用:使spectrum 成为新类型的名称; 使red、orange...等作为符号常量,它们对应的值分别为(0~7);枚举具有的特殊语法特性:可以用枚举名声明枚举变量如:spectrumband ; 在不进行强制转换的时候只有同一个枚举量之间可以进行赋值;band = blue ; /..原创 2021-05-05 17:00:45 · 63 阅读 · 0 评论 -
new delete 详解
常规的new 和 delete当需要内存时,可以使用new申请内存,但在用完内存时应当使用delete 去归还内存,以防止内存泄漏,具体使用方案见下面代码:int* ps = new int ; // 使用new 申明变量空间......delete ps ; '// delete 删除所申明的变量空间上述代码将删除ps 指针指向的内存空间,但不会删除指针本身,即仍然可以使用该指针去指向其他int 类型的变量。new 和 delete 一定需要成对的使用否则极易发生内存泄漏。注意:不原创 2021-03-29 16:52:56 · 6682 阅读 · 0 评论 -
潜复制和深复制以及复制构造函数
源对象的每个成员只是被盲目的复制到目的对象中,这种现象称之为浅复制,常见的浅复制有默认复制构造函数以及以下构造函数(假设_name以及_address为指针类型的私有元素)。Tperson::Tperson(const Tperson& source):_birthDate(source._birthDate),_name(source._name) ,_ssn(source.ssn),_address(source.address){}浅复制直接复制数据成员的地址。除了_name和原创 2021-02-16 21:17:11 · 233 阅读 · 0 评论 -
Qt使用Tcp传输文件
实现功能:在首先在客户界面上点击连接,连接成功之后在服务器界面上点击传输文件按钮,弹出文件对话框,选择所需传输的文件之后,点击发送文件即可。接着查看对应路径便会发现文件已在对应路径之下。具体操作流程如下:点击客户端上的connect按钮,服务器上显示成功链接。点击选择文件,弹出文件对话框,点击打开。点击发送文件,弹出对话框,点击ok,待进度条长满100%之后文件传输完成,便能在相应文件夹中查看。好啦,话不多说,附上代码:clientWidget.h#ifndef C原创 2020-12-09 10:35:39 · 1964 阅读 · 2 评论 -
QTcp编程
服务器端:服务器端有两个套接字—QTcpServer(监听套接字)、QTcpSocket(通信套接字) 。为实现QT环境下的网络编程首先应在“pro”工程文件中添加QT += network ,如下图所示:接着便可以着手编写服务端程序,首先在头文件中声明两个套接字,在服务器主函数中,使用监听套接字调用listen()函数。 /*动态分配通信套接字**/ tcpSocket = NULL ; /*动态分配监听套接字**/ tcpServer = new QT..原创 2020-12-05 10:57:53 · 316 阅读 · 0 评论 -
Event()函数
当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。使用程序代码对event的事件分发进行相关描述:bool MyWidget::event(QEvent *event){ //事件分发,若在MyWidget中产生了事件则必须经过该函数去进行事件分发。 /*原创 2020-11-19 10:22:14 · 1892 阅读 · 0 评论