C++
文章平均质量分 52
Coding_Fly_
满招损,谦得益
展开
-
delete this 可行性分析
在类的成员函数中能不能调用dudelete this?答案是肯定的,能调用,而且很多老一点的库都有dao这种代码。假设这个成员函数名字叫release,而delete this就在这个release方法中被调用,那么这个对象在调用release方法后,还能进行其他操作,如调用该对象的其他方法么?答案仍然是肯定 的,调用release之后还能调用其他的方法,但是有个前提:被调用的方法不涉及这个对象的数据成员和虚函数。根本原因在于delete操作符的功能和类对象的内存模型。当一个类对象声明时,系统会为其分配内原创 2020-11-08 09:36:56 · 268 阅读 · 0 评论 -
平衡二叉树
二叉排序树的查找性能取决于二叉排序树的形状,在O(log 2n)和 O(n)之间平均查找次数的实现:平衡二叉树:或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树:(1)根节点的左子树和右子树平衡因子最多相差一;(2)根节点的左右子树也都是二叉平衡树。平衡因子:节点的平衡因子是该点的左子树深度与右子树的深度之差最小不平衡子树:在平衡二叉树构造过程中,以距离插入最近的、且平衡因子的绝对值大于1的节点为根的子树。为啥是绝对值呢?可以是左树减右树,也可以是右树减左树构造平衡二叉树思原创 2020-11-01 18:27:50 · 367 阅读 · 0 评论 -
二维数组的逆置
将一个二维数组进行逆置:最大的问题是:如何保证不越界?A[j][i] A[i][j]的转换,如果i 和 j相等的话就很好操作,但是假如i 和 j不相等呢?这个时候就会造成越界的操作。如果用C语言进行操作,确实会造成不小困难,但是很多语言封装好的接口。来看C++的。class Solution {public: vector<vector<int>> transpose(vector<vector<int>>& A) { int ro原创 2020-10-29 20:14:05 · 1037 阅读 · 0 评论 -
回溯法求全排列
如果求1 2 3 这个数组的全排列,如果我们不用递归,就会造成使用多个循环结构,这样造成了代码极大的冗余。来看代码第一种方法void PrintArray(int Array[],int n){ for (int i = 0; i < n; ++i) { cout << Array[i] << " "; } cout << endl;}void Swap(int arr[], int left, int right){ int temp原创 2020-10-19 15:07:13 · 223 阅读 · 1 评论 -
继承中有关static成员 const函数常见问题
1:const成员函数能不能调用非const的方法?原创 2020-10-17 14:30:06 · 342 阅读 · 0 评论 -
如何判断开辟的空间在栈上?
我们需要借助两个寄存器来看(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。这两个指针就记录着栈空间地址,我们想判断一个空间是否在栈上只需要判断这个空间的地址是否在这个范围内。例:void PrintTest(){ int i = 0; printf("%d \n",原创 2020-10-14 16:32:48 · 240 阅读 · 0 评论 -
Map为什么要提供按位置插入的方法?
int main(){ map<int ,string> ismap = {{1,"student"},{2,"size"},{3,"I dont know"}}; int n = sizeof(ismap) / sizeof(ismap[0]); cout<<"n = "<<n <<endl; ismap.insert(ismap.begin(),make_pair(8,"test1")); ismap.insert(ismap.e原创 2020-10-14 15:42:31 · 679 阅读 · 0 评论 -
各种符号在html中的表示
&属于HTML代码。表示符号 &<显示<,>显示>,&显示&,&quo显示", 显示空格字符栈地址是从高到低分配的原创 2020-10-08 20:42:34 · 817 阅读 · 0 评论 -
如何快速分离带有空格的字符串?
如果你的字符串中带有空格,你想用将其进行分割,使得每一个子串不带有空格,如何快速分割呢?streamstring函数例如:string str = "aa bb cc";分割int main(){ string str = "aa bb cc"; stringstream cc(str); string str1; string str2; string str3; cc >> str1 >> str2 >> str3; cout <&原创 2020-10-05 20:52:59 · 1829 阅读 · 0 评论 -
如何和获取时间戳
使用函数int gettimeofday(struct timeval*tv,struct timezone *tz )头文件#include<sys/time.h>struct timeval{ long tv_sec; /*秒*/ long tv_usec; /*微妙*/};struct timezone{ int tz_minuteswest;/*和greenwich 时间差了多少分钟* int t原创 2020-10-05 10:28:42 · 434 阅读 · 0 评论 -
C++接口实现汉字拼音转换
方法1:#define _CRT_SECURE_NO_WARNINGS #include<string>#include<iostream>using namespace std;void GetPinYin(unsigned char* Chinese, string& PinYin);int main(){ unsigned char chinese[] = "易烊千玺"; string pinyin; GetPinYin(chinese,原创 2020-10-03 22:24:22 · 2619 阅读 · 0 评论 -
利用短路运算实现递归
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)递归实现:但是递归会有出口,这个出口一般是使用if语句进行判断实现。使用短路运算实现这个递归出口class Solution {public: int Sum_Solution(int n) { int sum=n; sum && (sum+=Sum_Solution(n-1)); retur原创 2020-09-05 07:36:51 · 403 阅读 · 0 评论 -
C对象内存布局
转载http://pan.baidu.com/s/1jHKcqb0转载 2020-08-29 21:21:44 · 105 阅读 · 0 评论 -
多态分类和父子类指针强制转换问题
1. 编译时多态(静态绑定)主要是重载在程序编译期间就已经确定了函数的行为2. 运行时多态(动态绑定)virtual在程序运行期间根据具体拿到的类型确定程序具体行为,调用具体函数原创 2020-08-26 11:25:58 · 337 阅读 · 0 评论 -
多态中特例
1:协变定义:派生类重写基类时,两个虚函数的返回值类型不同,基类返回的是基类对象的**指针或者引用,**派生类返回派生类对象的指针或者引用,就称为发生了协变。我们认为协变是一种多态的特例我们来看一组程序using namespace std;class Base{public: Base() { cout << "Base" << endl; } virtual void fun() { cout << "Base" << en原创 2020-08-25 21:47:55 · 115 阅读 · 0 评论 -
如何在linux下写一个c程序调用linux的可执行文件或者程序
使用system函数#include<stdio.h>int main(){ printf("hello\n"); return 0;}这是一个C程序,我们编译后生成一个可执行文件a.out我们想在另一个文件中调用这个生成的可执行文件#include<stdio.h>#include<stdlib.h>int main(){ system("/home/flf/linux_review/Aug_21/Test/te/a.out"原创 2020-08-21 16:56:58 · 1224 阅读 · 0 评论 -
C++异常处理
程序异常经常形式:1:除0错2:下标越界错误3:文件读取错误4:内存申请失败错误等等等等C++11引入了异常处理机制:基本思想:函数A在执行的过程中发现异常时可以不处理,而是抛出一个异常给A的调用者,假定为函数B。抛出异常而不加处理会导致A立即终止,这种情况下函数B可以选择捕获A抛出异常进行处理,也可以选择置之不理。然后这个异常会被抛给B的调用者,直到最外层的main函数。main函数要处理异常,如果不处理程序就会异常终止。处理情形1:try{}catch (const std:原创 2020-08-14 14:58:55 · 125 阅读 · 0 评论 -
智能指针
强制类型转换是有一定风险的,有的转换并不安全,C++中引入了四种功能不同的强制类型转换运算符以进行强制类型转换static_cast reinterpret_castconst_castdynamic_cast客服C语言强制类型转换缺点1:没有从形式上体现转换功能和风险的不同;2:将多态基类指针转换成派生类指针时,不检查安全性,无法判断转换后指针是否确实指向一个派生类对象;3:难以在程序中寻找什么位置发生了什么强制转换,如果C语言做法,强制类型转换发生了错误的话我们需要一个一个去排查,原创 2020-08-14 09:49:34 · 203 阅读 · 0 评论 -
多态实现原理
在继承中构成多态有两个条件1:必须通过基类的指针或者引用调用虚函数;2:被调用的函数必须是虚函数,并且派生类必须对于虚函数进行重写;原创 2020-08-13 11:40:04 · 149 阅读 · 0 评论 -
为什么析构函数可以为虚函数但是构造函数不能为虚函数
构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。构造函数不能声明为虚函数的原因是:1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。无法确定。。。2 虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在原创 2020-08-12 17:06:03 · 1056 阅读 · 1 评论 -
什么是抽象类
定义:含有纯虚函数 的类称为抽象类,它不能生成对象。什么是纯虚函数?纯虚函数是在基类声明的虚函数,它在基类中没有定义,但是要求派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后面添加“=0”比如 virtual void f()=0;而c++中包含纯虚函数的类称为抽象类,由于抽象类中包含了没有定义的纯虚函数,所以不能定义抽象类的对象。总结:1.抽象类只能用作其他类的基类,不能定义抽象类的对象。2.抽象类不能用于参数类型、函数返回值或显示转换的类型3.抽象类可以定义抽象类的原创 2020-08-11 10:27:19 · 1384 阅读 · 0 评论 -
exit和return的区别
(1)return退出当前函数,exit()退出当前进程,在main函数里面exit(0)和return具有相同的功能;(2)return仅从子函数中返回,并不退出进程,调用exit()要调用一段终止处理程序,然后关闭所有的IO流。_exit()不会处理标准I/O缓冲区。...原创 2020-08-11 10:21:06 · 1676 阅读 · 1 评论 -
保护成员的理解
可以直接通过外进行访问,也可以用派生类进行访问但是不可以通过基类进行访问。原创 2020-08-10 09:38:46 · 354 阅读 · 0 评论 -
C++中文件的输入/输出操作
1:ifstream类,从istream 类派生而来,该类的对象用来支持文件的输入;2:ofstream类,从ostream派生而来,该类的对象用来支持文件的输出;3:fstream类 ,由iostream派生而来,可以支持文件的输入输出;文件的写入int main(){ ofstream ofile; ofile.open("Test1.txt"); if (!ofile) { cout << "Can not open file test.txt\n"; } el原创 2020-08-10 09:30:36 · 312 阅读 · 0 评论 -
菱形继承与虚基类解决菱形继承问题
在多重继承中存在二义性问题我们来看第一类二义性问题:派生类函数与基类函数重名问题:class Fa{private: int m;public: void print() { cout << "aaa" << endl; }};class Stu1 :public Fa{public: void print() { cout << "sss" << endl; }};int main(){ Stu1 s;原创 2020-08-09 17:33:42 · 290 阅读 · 0 评论 -
含参数构造函数的类在继承的时候出现的问题
含有参数的构造函数的类在继承的时候有严格的语法要求,派生类的构造函数语法必须要求XiaoMing(int n, const char nam[], char s, int a, const char ad[]):Student(n,nam,a)其中:Student(n,nam,a)必不可少,如果我们不想写这个后半段我们可以在基类上自己构造一个无参构造函数。析构函数是相互独立的,因为所有的析构函数都没有参数,当基类的构造函数不带参数的时候,派生类不一定需要定义构造函数,然而当基类的构造函数带有至原创 2020-08-09 16:20:34 · 429 阅读 · 0 评论 -
临时对象错误
首先来看一个经典的错误class my_string{ char *s;public: my_string(const char *str); ~my_string() { if (s) delete[] s; cout << "Free s\n" << endl; } void show() { cout << "show:" << endl; cout << s << endl; }}原创 2020-08-09 11:02:04 · 156 阅读 · 0 评论 -
继承性与多态性的优点
面试被问到多态,我瞬间巴拉巴拉说了一堆,甚至说了同名隐藏重写很多多态中易出错的问题。然后面试官来了一句,既然你说多态这么多问题,那你说说为啥要用多态?我一时语塞,说了个减少代码量。很显然面试官不满意。我们一起来看看继承和多态的优点:继承优点:1:很好实现了代码的重用;2:能改进软件系统的可维护性;3:继承使得已有程序库具有清晰的层次结构关系多态可以简言之:不同对象接受到相同的消息产生不同的动作。一个接口多个方法。多态好处:1:降低了程序设计时的复杂性;2:支持程序开发人员的知识重用;原创 2020-08-09 03:52:33 · 1649 阅读 · 0 评论 -
6行代码判断邮箱类型
调用string的函数代码如下 string str = "1584968754@qq.com"; string email_type; size_t res1 = str.find('@'); size_t res2 = str.find('.'); email_type = str.substr(res1+1, res2-res1-1); cout <<"邮箱类型:"<< email_type << "邮箱"<<endl;关键点在于寻原创 2020-07-12 20:44:43 · 581 阅读 · 0 评论 -
对象生成与消亡
派生类对象生成时,先执行基类构造函数,再执行派生类构造函数,消亡时,先执行自身析构函数,再执行基类析构函数。为什么?执行期间会用到基类继承来的值,因此要先构造基类;消亡时,派生类自己的析构函数依然可能会用到派生类继承的成员,因此不能先析构基类。...原创 2020-06-16 12:04:50 · 464 阅读 · 0 评论 -
为什么要引入保护成员
在C++成员中我们需要一种成员比私有成员访问范围大比公有成员访问范围小的成员。因此就引入了保护成员。保护成员扩大范围表现在基类的保护成员在派生类的成员函数中被访问。基类的成员本身就是派生类的成员,但是出于隐藏目的不宜设为公有,但是又确实需要在派生类的成员函数中经常访问基类成员,将其设置成保护成员,既能达到隐藏目的,又能直接访问。1:派生类成员函数不能访问基类私有成员;2:派生类成员函数可以访问基类保护成员;3:派生类成员函数只能访问所作用的那个对象的基类保护成员,不能访问其他基类对象的基类保护成员原创 2020-06-16 10:31:13 · 683 阅读 · 1 评论 -
一文了解深浅拷贝
提及深浅拷贝,基础但是不是很容易掌握。因为涉及=运算符重载,涉及到内存管理,涉及到对象的析构等等。直到我看了《新标准C++程序设计》这本书后,让我对这个概念年醍醐灌顶。原创 2020-06-14 02:35:08 · 187 阅读 · 0 评论 -
函数调用步骤
1:在栈中为形参和局部变量分配存储空间;2:将实参值赋值给形参3:将函数的返回地址(该地址指明了函数执行结束后,程序会放到哪里执行,程序该回到哪里继续执行)放入栈中;4:跳转到函数内部执行。函数在执行return 语句的时候,需要从栈中回收形参和被局部变量占用的存储空间,然后从栈中取出返回地址,再跳转到该地址继续进行执行。inline函数很好解决了函数开销问题。内联函数在执行的时候,不会编译成函数调用的指令,而是将整个代码而是将整个代码插入到函数调用语句处。内联函数必须定义。...原创 2020-06-14 00:51:04 · 1702 阅读 · 0 评论 -
文本方式打开文件与二进制方式打开文件的区别
在Linux平台中,用文本方式或二进制方式打开文件没有任何区别。在Linux平台中,文本文件以‘\n’作为换行符号;在Windows平台中,文本文件以连在一起的‘\r\n’作为换行符号。在Windows平台中,如果以文本方式打开文件,当读取文件时,系统会将‘\r\n’转换成一个字符‘\n’.在写入文件时,系统会将‘\n’转换成‘\r\n’写入。如果用文本方式打开二进制文件进行读写,读写内容就可能和文件内容有出入。因此用二进制形式打开文件总是最保险的。...原创 2020-06-13 16:23:49 · 671 阅读 · 0 评论 -
求一个容器中第k大元素
相信各位小伙伴们都遇见过求第K大元素问题,我们首选就是将这个容器内元素进行个排序,但是我们有的情况下这个容器不能随便动,我们只需要返回第K大的元素就行,我们怎么办呢?我们当然是选择一个个比较,从第一大一直找到第K大,这种情况一般会在树结构和图结构中常见,我们来看一个简单的代码,寻找第一大和第二大的元素。我们注意要将这个temp的声明周期延长,不能声明成局部变量,全局更好点。int temp;int main(){ int arr[] = { 1,2,3,4,21,58,7,96,2,56 };原创 2020-05-18 09:50:48 · 103 阅读 · 0 评论 -
全排列的几种形式
1:暴力破解 求多少元素的全排列就写多少循环,最后添加if语句判断合适的条件语句打印/暴力穷举法 例如输出1 2 3 的全排列 for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3;++j) { for (int k = 0; k < 3; ++k) { if (i != j && i != k && j != k) { cout << i+1原创 2020-05-13 11:02:38 · 512 阅读 · 0 评论 -
Vector的二维形式以及迭代器访问Vector中的元素
vector的二维初始化:vector<int> array2(4, 50);//4个元素每个值为50数组初始化vectorint array[] = { 1,2,5,9,33,2,5,5,4,2 };vector<int>p(array,array+sizeof(array)/sizeof(array[0]);增加到二维vector<vector<int>> dp(5, vector<int>(array, array + siz原创 2020-05-09 18:04:49 · 3903 阅读 · 3 评论 -
冒泡排序及其三种优化模式
1:普通冒泡void Swap(int* a, int* b){ int temp = *a; *a = *b; *b = temp;}void bubble_sort(int* arr,int length){ clock_t start, finish; start = clock(); for (int i = 0; i < length; ++i) { f...原创 2020-05-06 11:49:25 · 374 阅读 · 0 评论 -
继承中构造析构
在继承中面临一个问题就是:我们的基类和派生类都有各自的构造函数和析构函数,那么再实例化派生类成员的时候,这个构造析构的顺序是怎么样的呢?class Animal{public: Animal()//构造函数 { cout << "constring Animal" << endl; } ~Animal() { cout << "destr...原创 2020-04-26 10:32:43 · 153 阅读 · 0 评论 -
保护成员(protected)和私有成员(private)的区别
我们接触C++的时候一定会涉及到保护成员和私有成员,并且我们知道这两个成员都不可以直接从外部进行访问,这两个成员的区别在哪呢?我们涉及到概念叫做继承1:如果B类以私有方式继承了A类,那么A类中的公有和保护成员在B类中都是私有成员,B类作为新的基类派生出C类,那么C类的成员和对象都是不能访问间接从A类中继承出来的成员;2:如果B类以保护方式继承了A类,A类中的公有和保护成员在B类中都是保护成员...原创 2020-04-25 11:44:53 · 9309 阅读 · 0 评论