C/C++
C
我在这里啊@
小白
展开
-
指针数组与数组指针
指针数组和数组指针原创 2022-12-09 15:25:26 · 219 阅读 · 1 评论 -
内联函数的几种形式
类定义的内联函数分为以下3种: 1.隐式内联 class Person{public: Person(const string &name) { Name = name; } void printName()//printName 定义在类里面是隐式内联函数 { cout << Name << endl; }private: string Name;}; 2)在类里面显...原创 2021-02-02 14:51:44 · 907 阅读 · 0 评论 -
C++的四种类型转换运算符:static_cast,dynamic_cast,const_cast,reinterpret_cast
集中转换原创 2021-02-01 13:52:46 · 374 阅读 · 0 评论 -
placement new
//new关键字创建对象的时候,对于内置类型,加上()会初始化,不加()不会初始化//对于自定义类型,都会调用默认构造函数,加不加括号没有区别原创 2021-01-30 20:27:06 · 250 阅读 · 0 评论 -
可变参数模板:template <class... Args>
从原创 2021-01-30 19:53:36 · 5601 阅读 · 0 评论 -
虚继承
什么叫做虚继承:重复基类,派生类间接继承同一基类使得间接基类(Person)在派生类中有多份拷贝,引发二义性。错误示范:#include<iostream>using namespace std;class A { public: void vf() { cout<<"I come from class A"<<endl; }};class B: public A{};class C: public A{};class D: public .原创 2020-12-18 14:16:40 · 113 阅读 · 0 评论 -
派生类和基类的关系
在C++中,我们允许将派生类对象赋给基类对象。(不允许将基类对象赋给派生类对象)只会将基类对象成员赋值,a1=b1;(A是基类,B是派生类)用基类指针指向派生类对象。(不允许用派生类指针指向基类对象)基类指针只能操作基类中的成员, pA=&b1; (A是基类,B是派生类)基类引用作为派生类的别名。(不允许派生类引用作为基类的别名)基类引用只能访问基类成员,A &a=b1;(A是基类,B是派生类)原因很简单,派生类一般含有基类没有的成员,将派生类赋给基类成员我们才能保证基类中每个原创 2020-12-18 13:47:27 · 555 阅读 · 0 评论 -
C++常用设计模式详解
1. 面向对象的设计原则:高内聚:设计封装模块的时候功能单一,针对性强低耦合:每个模块之间的交互量少2. 深入理解面向对象封装:隐藏颞部实现继承:复用先有代码多态:改写对象行为3. 单例模式:涉及到一个单一的类,该类负责创建自己的对象,一个类只有一个对象。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。单例模式有两种常见的方式,饿汉模式和懒汉模式:(1)、饿汉模式就是在使用之前先实例化要使用的单例对象(2)、懒汉模式就是在使用的时候再实例化要使用的单例对象原创 2020-08-30 15:40:05 · 787 阅读 · 0 评论 -
在循环中使用erase报错的情况
之前想写个程序,利用iterator遍历list,然后用if语句删除特定值像下面这样:for(list<int>::iterator iter=l...原创 2020-08-28 14:08:03 · 565 阅读 · 0 评论 -
C语言中int类型和char类型相互转换的问题
char类型转化成int类型a[i] - '0'int类型转化成char类型a[i] + '0'原创 2020-08-22 21:38:32 · 2529 阅读 · 0 评论 -
C语言中函数传递参数的三种形式
值传递,就是把你的变量的值传递给函数的形式参数,实际就是用变量的值来新生成一个形式参数,因而在函数里对形参的改变不会影响到函数外的变量的值引用传递,实际是通过指针来实现的,能达到使用的效果如传址,可是使用方式如传值。地址传递,就是传变量的地址赋给函数里形式参数的指针,使指针指向真实的变量的地址,因为对指针所指地址的内容的改变能反映到函数外,也就是能改变函数外的变量的值。只有这三种形式,传递数组也是属于地址传递...原创 2020-08-22 17:43:59 · 1220 阅读 · 0 评论 -
二叉树非递归遍历的统一写法(前序,中序,后续,层序)
前,中,后序遍历这种写法是相反的,比如说前序,在代码里相应部分的顺序是右中左前中后都可以用这个模板,改变一下顺序就可以了class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; stack<TreeNode*> s; if(root!=nullptr) s.push(root); .原创 2020-08-20 14:02:46 · 198 阅读 · 0 评论 -
C++中使用map容器实现哈希表的简单功能
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。使用哈希表求解,记录每个元素出现的次数,最后统计,如果大于数组长的一半就输出class Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers) { map<int,int>原创 2020-08-18 13:32:08 · 664 阅读 · 0 评论 -
C++11中遍历的新方法
1.使用智能指针#include "stdafx.h"#include<iostream>#include<vector> int main(){ std::vector<int> arr; arr.push_back(1); arr.push_back(2); for (auto it = arr.begin(); it != arr.end(); it++) { std::cout <<原创 2020-08-18 12:47:28 · 467 阅读 · 0 评论 -
指向字符串常量的指针
char p[] = “string”char *q = p;这样子是定义了一个字符数组和一个指向该字符数组的指针,可以通过指针对该该字符数组进行操作char *p = “string”这种情况下,指针指向的是一个字符串常量,不可以通过这个指针对该字符串常量进行修改操作...原创 2020-08-17 20:18:43 · 1131 阅读 · 0 评论 -
解决VS读取中文文件出现乱码的情况
解决方法:将文件另存为,编码方式选择ANSI,并覆盖原来的文件原创 2020-08-12 10:59:41 · 1210 阅读 · 2 评论 -
**Headnode** 是 0xCDCDCDCD的解决方案
在写一个单链表程序的时候VS报错Headnode 是 0xCDCDCDCD其实是因为链表的最后一个节点没有指向NULL,于是在创建头结点的时候顺便将Headnode->next初始化为NULL,问题解决原创 2020-08-07 15:45:15 · 623 阅读 · 0 评论 -
野指针和内存泄漏
什么是野指针? 野指针并不是NULL指针,它是一个指向“垃圾”内存的指针,也就是说指向的地址是随机的,无法得知他的地址,操作系统自动对其进行初始化。 在计...转载 2020-08-05 21:40:40 · 863 阅读 · 0 评论 -
*和++运算符
1.*p++和 * (p++)从值上看是对等的,++作为后缀时的优先级比*高,和()一样高,结合律从左到右。应该先p++,后取值,但因为是后++,所以先执行*p,然后等赋值完成以后,p再++。2.*++p的意思是先自增,然后再解引用...原创 2020-07-18 10:41:43 · 1805 阅读 · 0 评论 -
C++中的虚函数以及动态绑定和静态绑定(值得收藏)
什么叫虚函数:①.父类中的函数声明前加上virtual关键字,子类在重写的时候可加可不加②.父类如果有虚函数,则会产生一个虚函数表,记录虚函数的入口地址,子类在继承父类后,会 将地址一并继承下来,但是在重写父类中的虚函数的时候,会将地址替换成子类的虚函数地址,在调用的时候也会调用子类的函数动态类型和静态类型静态类型:对象在声明时采用的类型,在编译期既已确定;动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的;静态绑定:绑定的是静态类型,所对应的函数或属性依赖于..原创 2020-07-17 11:14:16 · 586 阅读 · 0 评论 -
C语言实现约瑟夫问题
可设定总人数和间隔#include <stdio.h>#include <stdlib.h>typedef struct node{ int data; struct node *next;}linknode, *linklist;linklist Create_Head(); //创建一个空表头linklist Create_Node(int nu...原创 2020-04-13 19:57:31 · 379 阅读 · 0 评论 -
类的静态成员和常成员(static,const)
静态成员变量(static加在前面)①.所有对象共享同一份数据②.在编译阶段就分配内存③.必须在类内声明,类外初始化,形式为类似int Person::m = 100;④.静态成员变量不属于任何一个对象,因此可以通过对象访问,也可以直接通过类名访问⑤.类外同样无法访问私有的静态变量静态成员函数(static加在前面)①.所有对象共享同一个函数②.静态成员函数只能访问静态成员变量③.静态成员变量不属于任何一个对象,因此可以通过对象访问,也可以直接通过类名访问④.类外同样无法访问私有..原创 2020-07-10 14:34:37 · 388 阅读 · 0 评论 -
发生隐式类型转换的几种情况
在混合类型的表达式中,操作数会被转换为相同类型int ival; double dval;ival >= dval; ival converted to double条件表达式会被转换为bool类型int ival; if (ival) ival converted to bool while (cin) , cin converted to bool条件操作符(? :)中的第一个操作数,逻辑非(!)、逻辑与(&&)、逻辑或(||)的操作数都是条件表达.转载 2020-07-04 17:56:34 · 855 阅读 · 0 评论 -
枚举类型
在一些实际应用问题中,有些变量的取值被限定在一个有限的范围内。例如一周只有七天,一年只有12个月等,可以把此类变量定义为枚举类型。枚举类型的定义中列举出所有可能的取值,说明为该枚举类型的变量取值不能超过定义的范围。·注意:枚举类型是一种基本的数据类型,而不是构造类型,因为枚举类型变量只能取一个值,它也不能再分解为任何类型。1.定义定义枚举类型的一般形式为:enum 枚举名 { 枚举常量表 } ;在枚举常量表中应列出所有可用的常量,这些常量也称为枚举元素。例如:enum weekday {su转载 2020-06-28 21:18:19 · 468 阅读 · 0 评论 -
printf的压栈顺序和输出顺序
printf从右往左入栈,x或++x只改变x的值,x++确定最后此位置的输出,x最后计算完后,x和++x位置的值都是此时x的值。看了可能不知道啥意思,举个例子就明白了x=1; printf("%d %d\n",x,x++);x=1; printf("%d %d\n",x++,x);x=1; printf("%d %d %d\n",x,x++,x);x=1; printf("%d %d %d %d\n",x,++x,x++,x);这段代码的输出是:2 11 22 1 23原创 2020-06-28 21:07:29 · 1412 阅读 · 1 评论 -
QT中报错‘xxx’ dose not name a type
在Qt5.8中实现一个类间通信的时候,出现了这样的错误:“‘xxx’ dose not name a type”;报错说xxx没有声明一种类型,但是在使用中明明已经有声明。可以看一下头文件是否互相包含(QDialog中包含了QWidget)...原创 2020-06-07 17:18:42 · 1507 阅读 · 0 评论 -
write函数的第三个参数(sizeof和strlen的区别)
1.sizeof和strlen的区别int main(void){ char s1[] = "hello"; //这种写法系统会把s1当成一个字符串,有'\0'结尾 int len1 = sizeof(s1); int len2 = strlen(s1); printf("sizeof(s1) = %d\n",len1); printf("strlen(s1) = %d\n",len2); char s2[10] = {'h', 'e', 'l', 'l', 'o'}; //这原创 2020-06-02 21:44:51 · 2182 阅读 · 0 评论 -
set容器,map容器,对组
一.set容器和multiset容器:1.所有容器在插入的时候都会被自动排序2.multiset容器中允许有重复元素,但是set容器不允许有重复元素3.set在插入数据的时候会返回值确定是否插入成功,multiset就不会1.set容器的创建: set<int>s; //默认构造 set<int>s1(s2); //拷贝构造 set<int>s1; s1 = s; //拷贝构造2.set容器的输入: s.insert();3.无法插入重复元素,原创 2020-06-02 16:22:01 · 133 阅读 · 0 评论 -
STL中的常用算法使用简介
1.for_each:遍历容器中的元素void Print(int value){ cout << value << " ";}class Print1{public: void operator()(int value) { cout << value << " "; }};int main(int argc, char *argv[]){ vector<int>v;原创 2020-05-31 12:10:40 · 234 阅读 · 0 评论 -
函数对象(仿函数)和内建函数对象的使用
1.对()进行重载就形成了仿函数1.函数对象在使用时,可以像普通函数一样使用,有参数,有返回值2.仿函数的本质是一个类,不是函数3.函数对象可以作为参数传递class Person{public: int operator()(int op1, int op2) { return op1+op2; }};void Test(Person &p, int op1, int op2){ cout << p(op1,op2)原创 2020-05-30 04:06:21 · 141 阅读 · 0 评论 -
stack,queue,list容器和随机访问
1.stack容器2.queue容器3.list容器:插入和删除操作都不会造成原有迭代器的失效,这在vector中是不成立的vector和list容器是stl中最常用的两个容器sort函数是标准算法,在使用的时候需要加上#include <algorithm>头文件,但是list容器不支持随机访问迭代器,不可以使用标准算法,只能使用内部的成员函数,因此需要以L.sort()和L.reverse()的形式来使用,而不能直接使用sort();只有vector和deque容原创 2020-05-29 22:17:41 · 2008 阅读 · 0 评论 -
deque,string,vector容器的综合应用
#include <iostream>#include <vector>#include <string>#include <deque>#include <algorithm>#include <ctime>using namespace std;/*有五名选手ABCDE,10个评委分别给每一个选手打分,去掉一个最高分和一个最低分,算出总成绩*/class Person{public: Person(st原创 2020-05-29 21:36:18 · 132 阅读 · 0 评论 -
C++中的Deque容器
deque中没有容量的概念,并且两端都可以操作,比较方便,但是访问速度相较vector比较慢deque得内部原理:1.构造函数:2.deque的赋值操作:deque<int> d2; //重载等号的方式进行赋值d2 = d1;3.deque容器的大小操作deque没有容量的概念,现有的空间佣金以后就会重新开辟,并继续由中控器来控制4.deque容器中的插入和删除操作...原创 2020-05-29 20:38:22 · 141 阅读 · 0 评论 -
vector容器
1.vector的遍历操作vector中也可以存放自定义的数据类型,比如一个类vector<int> v; //创建一个容器(理解为数组) v.push_back(10); //尾插法向容器中插入一个元素 v.push_back(20); v.push_back(30); v.push_back(40); v.push_back(50);第一种遍历方式: //迭代器可以理解为指针// vector<原创 2020-05-28 16:39:34 · 615 阅读 · 0 评论 -
C++中的模板
1.函数模板的使用#include <iostream>#include <string>using namespace std;template <class T>void Myswap (T &a, T &b){ T tmp; tmp = a; a = b; b = tmp;}int main(void){ int a = 10; int b = 20; //Myswap<int>(a,b); 第二原创 2020-05-28 15:18:57 · 96 阅读 · 0 评论 -
string容器
1.string是一个类,下面是string 的构造函数#include <string> //包含头文件using namespace std;int main(int argc, char *argv[]){ string s1; //默认构造 const char * str = "hello world"; //使用字符串s进行初始化 string s2(str); string s3(s2); //拷原创 2020-05-28 10:26:51 · 139 阅读 · 0 评论 -
C++中的文件操作
1.C++中对文件进行操作需要包含头文件#include 其中读文件 ofstream写文件 ifstream读写文件 fstream2.写文件的步骤 1.创建流对象, ofstream ofs; 2.设置打开方式, ofs.open("文件位置", 打开方式); 3.写入数据, ofs << "数据内容"(后面根据需要也可以加上<<endl); 4.关闭文件,ofs.close();文件的打开方式 ios::in 读文件的方式打开 ios::ou原创 2020-05-23 09:33:39 · 427 阅读 · 0 评论 -
C++中运算符的重载
运算符重载就是对已有的运算符重新定义,使其适应不同数据类型的运算运算符重载也可以发生函数重载,例如可以将类与类相加或者类中某变量与一个整型相加1.加号运算符的重载(举例实现类的对象的相加减)#include <iostream>#include <string.h>using namespace std;class Person{ public: int m_A; int m_B; Person operator+ (Person &p) //原创 2020-05-18 15:10:58 · 196 阅读 · 0 评论 -
C++中构造函数初始化
1.括号Person p1; //默认构造函数Person p2(10); //构造函数Person p3(p2); //拷贝构造函数2.显示Person p1; //默认构造函数Person p2 = Person(10); //构造函数, Person(10)单独写就是匿名对象,当前行结束后机会被析构Person p3 = Person(p2); //拷贝构造函数3.隐式转换法Person p2 = 10; //构造函数 //编译器会转化成第二种方法Person原创 2020-05-17 11:09:20 · 343 阅读 · 0 评论 -
C++中的继承
#include <iostream>using namespace std;class father{ public: int a; private: int b; protected: int c;};class son1 : public father{ public: void fun() { a = 10; //父类中是公共权限,子类依然是公共权限 cout << "公共继承,访问父类公共权限" << .原创 2020-05-14 16:23:47 · 104 阅读 · 0 评论