![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++学习
文章平均质量分 61
菜鸡二号的学习室
大学生毕设
分享知识,增长见识,需要安装包,私发我邮箱
展开
-
vs2013连接数据库
连接数据库原创 2022-06-27 13:37:17 · 599 阅读 · 0 评论 -
重新理解指针:用实例分清int* int** int*[] (int*)[]四者的区别
一,int * int**这种就是最简单的指针指向一个对象。int *直接指向一个对象;int **指向一个指针如下: int initialInt = 10; int *initialIntPoint = &initialInt; 一个指针对象指向对象 int **initialIntPointPoint = &initialIntPoint; 这个是双指针,指向一个指针对象 cout << "对象: " &...原创 2021-03-31 20:22:11 · 11323 阅读 · 3 评论 -
从源代码到可执行程序的过程
先上结论:预处理 编译 汇编 链接首先创建文件vim hello.ceg:最初文件为:#include<stdio.h>int main(){ //测试 return 0;}一,预处理就是将文件中的宏和注释全部去掉 gcc -E hello.c -o hello.ieg:经过预处理后文件*************int main(){ return 0;}上面的****代表是stdio.h的库的拆分,然后注释原创 2021-02-14 16:23:21 · 382 阅读 · 1 评论 -
main函数之前还能运行程序?
在了解这个之前,我们首先要知道代码四区的概念:运行前:全局区,代码区 运行后:堆区,栈区堆区和栈区显然都是在程序运行后进行的,所以它们都是在main后面。因此就需要从全局区和代码区入手,代码区显然不行,因此只剩下全局区了。结果也就是可以定义全局对象或者变量。方法一:定义全局对象或者变量全局变量:当定义全局变量a的时候,就会调用show函数,因此也就在main函数前运行了show函数这段程序。全局对象:此时定义了全局对象a,所以就会调用类中的构造函数,因此构原创 2021-02-13 22:57:20 · 1815 阅读 · 0 评论 -
关于extern的用法
这种方法出现的原因:当多个文件中需要共享同一个变量时,可以使用extern首先我们要清除知道extern的作用:表明该变量是在其它文件中定义的定义时分配内存,其它文件引用时不再分配内存extern引用方法:extern 类型 变量名如果某个模块文件中需要使用另一个模块文件中的全局变量,就要用extern说明如下:模块文件test3.cpp中定义了变量a。此时另一个模块x.cpp想要使用模块文件test3.cpp的变量a,因此需要对a进行声明/定义:exter原创 2021-02-13 21:32:58 · 478 阅读 · 0 评论 -
智能指针:什么是shared_ptr类和weak_ptr类
我们从之前对于auto_ptr和unique_ptr介绍可以的知:已经消失的智能指针——auto_ptr:https://blog.csdn.net/qq_46423166/article/details/113764347C++智能指针——unique_ptr:https://blog.csdn.net/qq_46423166/article/details/113777696auto_ptr有很多问题,比如指针之间可以互相赋值,移动之后一个为空的问题。现在已经被弃用 然后unique_pt原创 2021-02-13 00:43:35 · 1576 阅读 · 2 评论 -
子类为什么先死后生
首先我们看一段代码:class A{public: A(){ cout << "构造A " << endl; } ~A(){ cout << "析构A " << endl; }};class B:public A{public: B(){ cout << "构造B " << endl; } ~B(){ cout << "析构B " << endl; }};...原创 2021-02-12 20:31:49 · 1613 阅读 · 3 评论 -
this指针的意义?
首先我们要知道类中函数和数据的布局:如同上面这个图所示,每个对象都有自己的数据成员的位置,但是共同调用类的函数成员。原因:因为函数成员满足公用的条件,如果每个对象都保存一个函数成员,则消耗很大。然后我们看下面代码:根据上面所说,多个对象共同使用类的函数成员。那么当对象a,b传到函数中时,函数怎样判断是哪个对象呢?此时就使用到了this指针:上面的a其实被隐含转化成了this->a;看下面的图:当第一次进入类构造函数时,this指针的地址和a的地址原创 2021-02-10 17:11:20 · 1282 阅读 · 1 评论 -
了解不同情况下的static关键字
1,全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显示初始化);作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。和普通全部变量的区别:就是不能在多个文件之间使用。而普通的使用extern后可以全文档使用。2,局部静态变量在全局变量前加上关键字stati,局部变量就定义成一个局部静原创 2021-02-10 02:00:55 · 252 阅读 · 0 评论 -
纯虚函数与抽象类
我们假设一种情况:基类名字是东西,里面有showname(),price()等函数然后继承的子类就是各种存在的事物,比如家具,冰箱,桌子等。这种情况下,显然定义出一个叫做东西的对象是不合适的,因为这个东西的名字和价格无法实际化。 而定义东西这个类的作用就是为子类规范一些函数使用,以及方便使用数组的方式实现一些子类对象的组合。此时我们便可以将东西这个类中的showname(),price()等函数定义为纯虚函数这样做可以清晰的告诉用户当前这个showname(),price()函数是原创 2021-02-10 01:19:11 · 1230 阅读 · 0 评论 -
C++智能指针——unique_ptr
unique_ptr和auto_ptr类似。但是unique_ptr拥有它指向的对象。某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所指向的对象也被销毁。初始化:必须采用直接初始化形式:不能调用赋值或拷贝构造函数,避免了两个指针指向同一块地址的问题,避免了auto_ptr一定的错误。但是仍然可以用其他方法: int *x = new int(10); unique_ptr<int> c(x); uni...原创 2021-02-10 00:38:49 · 1318 阅读 · 1 评论 -
已经消失的智能指针——auto_ptr
动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向改该对象的指针。delete,接收一个动态对象的指针,销毁该对象,并释放与之关联的内存。出现问题:不能确保在正确的时间释放它:有时候我们会忘记释放内存,这种情况下会产生内存泄漏有时候再尚有指针引用内存的时候指针被释放了原创 2021-02-09 22:48:22 · 2611 阅读 · 1 评论 -
C++11新特性:移动构造函数和移动赋值
移动构造函数就是从拷贝构造函数演化而来的。拷贝构造函数又分为浅拷贝和深拷贝:浅拷贝:当类中有指针时,浅拷贝会发生错误 深拷贝:每次都是重新赋值一份,在某些情况下这种方法可能内存消耗较大因此就产生了移动构造函数,将原来对象的东西移动到新的对象上 移动后当对象销毁时不能发生错误 移动后原对象不再指向被移动的资源,这些资源的所有权已经归属新创建的对象 A(A&x){ this->num = new int(*x.num); cout &l...原创 2021-01-30 11:50:47 · 7234 阅读 · 4 评论 -
使用代码了解new/delete与malloc/free的区别与联系
new分配内存按照数据类型进行分配,malloc分配内存按照指定的大小分配 new返回的是指定对象的指针,而malloc返回的是void*,因此mallic的返回值一般都需要进行类型转化 new不仅会分配一段内存,而且会调用构造函数,malloc不会, new分配的内存要用delete销毁,malloc要用free来销毁;delete销毁的时候会调用对象的析构函数,而free不会 new是一个操作符可以重载,malloc是一个库函数 malloc分配的内存不够的时候,可以用realloc扩容。扩容原创 2021-01-29 16:29:54 · 1341 阅读 · 0 评论 -
深拷贝和浅拷贝问题
在了解了基础的拷贝问题之后:https://blog.csdn.net/qq_46423166/article/details/113382086我们继续探讨当数据在堆上的问题:即对象定义为:int *a; 那么析构的时候自然要加上:delete a;如下:此时如果还是使用默认的拷贝构造函数#include<iostream>using namespace std;class A{public: A(){ a = new int(10); cout <原创 2021-01-29 14:24:42 · 323 阅读 · 0 评论 -
拷贝构造函数
1,普通对象之间赋值我们知道普通对象的赋值是很简单的,如: int a = 10; int b = a;仅仅只用一个等号就能将对象a的值赋值给b。2,如果是类呢?#include<iostream>using namespace std;class A{public: A(){ cout << "构造函数" << endl; } //A(A &aa){ // cout << "拷贝构造函数" ...原创 2021-01-29 13:56:45 · 1123 阅读 · 3 评论 -
C++内联函数
首先我们看正常函数的定义如下:void xx(){ .....}此时当程序调用这个函数的时候那么首先找到这个函数的位置然后进行运算再将结果返回调用的地方。原创 2021-01-29 13:23:08 · 353 阅读 · 2 评论 -
这段代码你怎么看:*((int*)&a);
*((int*)&a)这段代码应该怎样理解呢?主要是记录下刚写的一篇博客里面的一个问题。首先&a取a地址 然后int*h转化为int型的指针 最后再*解引用当a是一个类的对象时呢,看下面代码:其中第13行和第14行输出的结果一样,但是这两个东西却是不同的东西。我问别人,别人给举的例子:将这个类比作一个村庄,而a就是这个村庄的第一户人,看似两个地址相同,但是一个代表村口一个是你家。下面将两个详细输出: cout << typeid(...原创 2021-01-26 00:36:53 · 2032 阅读 · 1 评论 -
重新学习顶层const和底层const
这个其实和我另一篇博客内容差不多,就是常量指针,指向常量的指针变量类似。顶层const:表示指针本身就是一个常量底层const:表示指针所指的对象是一个常量这个东西其实也没什么难度了,下面引用点书本上的原话:顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用,如算术类型,类,指针等底层const则与指针和引用等复合类型的基本类型部分有关。比较特殊的是,指针类型既可以是顶层const也可以是底层const。上面的话为什么顶层都适用呢?就是因为顶层co原创 2021-01-26 00:03:02 · 3287 阅读 · 6 评论 -
C++怎样访问私有成员函数
1,通过地址进行访问2,通过友元函数3,通过友元类原创 2021-01-25 22:13:36 · 7801 阅读 · 4 评论 -
结构体中怎样进行内存对齐:带你学习1+4=8的情况
1+4可能等于5,但是也可能等于8,你是否真的理解内存对齐?原创 2021-01-14 21:38:22 · 2421 阅读 · 3 评论 -
C++头文件重复编译
重复编译即为重复执行了某一个.h文件情况如下:下面是test1.h和test2.h;test2.h中包含了test1.h下面是main.cpp,包含了上面这个.h文件运行的时候,我们直到main.cpp运行时,先运行test1.h,然后运行test2.h,但是test2.h中包含了test1.h。所以就会产生test1.h重复定义。因此就会报错解决方法第一种: 在test1.h代码最前面加上#pragma once 此时当第二次调用test1....原创 2021-01-09 21:43:14 · 768 阅读 · 0 评论 -
内存泄露查看方法
定义:内存被占用,使用完成后没有释放产生原因:使用malloc或者new操作之后没有相应的free或者delete危害:内存大量损耗后导致程序越来越慢发现内存泄露ps-aux 查看各个进程的内存占用率,如果某个进程占用的内存在一直上升,很有可能发生了内存泄露其他命令free 查看整个系统的内存使用情况...原创 2021-01-09 19:55:39 · 854 阅读 · 0 评论 -
C++静态多态和动态多态
静态多态和动态多态静态多态静态多态也称为编译时多态,即在编译时决定调用哪个方法; 静态多态一般是指方法重戟; 只要构成了方法重载,就可以认为形成了静态多态的条件; 静态多态与是否发生继承没有必然联系如下所示:void test(int a){ cout << "1" << endl; }void test(int a,int y){ cout << "2" << endl; }void test(int a,int y,int z){原创 2021-01-08 23:37:18 · 1494 阅读 · 0 评论 -
C++中什么是多态
多态性:不同类的对象对同一消息的不同响应如果此时有cat类,dog类,pig类。三种类里面都有show函数,正常显示三种应该怎样做呢?先将三个类写出来:然后分别定义出对象,然后再调用show函数: cat a; dog b; pig c; a.show(); b.show(); c.show();这种就是普通定义的方式,怎样把三种东西合到一块写出来呢?将三个东西都继承自animal类,然后使用基类和派生类之间类型转换的方式,用派生类转化为...原创 2021-01-08 22:33:54 · 364 阅读 · 0 评论 -
基类与派生类的类型转换
一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:派生类的对象可以隐含转换为基类对象。 派生类的对象可以初始化基类的引用。 派生类的指针可以隐含转换为基类的指针。通过基类对象名,指针只能使用从基类继承的成员下面的代码中展示了三种情况:类型转换之后,就可以使用基类中的成员;但是基类不能转化为派生类的对象#include<iostream>using namespace std;class A{public: void show原创 2021-01-08 21:42:25 · 1385 阅读 · 0 评论 -
代码四区
代码的内存主要分为四个区间代码区 全局区 栈区 堆区其中代码区和全局区是运行前的,栈区和堆区是运行后的。即如果exe文件不运行,就没有栈区和堆区。1,代码区即为程序编程exe文件后的代码特点:只有一份 因为程序不可能运行一次,重新把所有代码重新复制一遍,所以代码区只有一份保密性 程序变成exe文件之后,就不呢查看这个exe文件的源代码2,全局区全局变量 static静态变量 常量(需要注意只有全局变量才是全局区)常量需要注意的原因是因...原创 2021-01-06 23:41:21 · 1969 阅读 · 3 评论 -
虚函数表和虚表指针
1,虚函数的含义用virtual声明类的成员函数称之为虚函数2,作用用于实现多态存在继承关系,子类继承父类 子类重写了父类的virtual function 子类以父类的指针或者引用的身份出现3,虚函数的实现原理其中的关键就是两点:虚函数表指针 虚函数表想要理解其中的结构,还是要从内存布局看起下面都是用debug的方式,查看其中的布局大小一定要理解下面的四段代码1,普通类的内存布局代码:因为普通函数并不占内存,所以此时对象a的并不显示内存原创 2021-01-06 22:50:15 · 2936 阅读 · 0 评论 -
C++对象大小,你真的知道吗?
我们都直到char大小为1,int为4,那么C++中对象的大小是多少呢?原创 2021-01-06 21:48:06 · 3438 阅读 · 13 评论 -
C++继承时,关于构造函数以及为什么父类析构函数要定义为为虚析构函数的讲解
这个问题主要是由于子类继承父类时,构造函数和析构函数的调用问题产生的结果:首先我们看构造原则:如果子类没有定义构造方法,则调用父类的无参数的构造方法。 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数。 在创建子类对象时候,如果子类的构造函数没有显示调用父类的构造函数且父类自己提供了无参构造函数,则会调用父类自己的无参构原创 2020-12-05 17:13:04 · 1718 阅读 · 0 评论 -
一篇读懂面向过程编程和面向对象编程的区别
面向过程编程:面向过程的编程是面向流程的,就是一步一步的按照过程来进行;它的最重要特点是函数,即把执行一件事的过程拆分成一个一个步骤,然后将这些步骤变为一个一个的子函数,然后通过主函数按照顺序调用这些子函数来完成整个事件。这些子函数需要按照事件的发展顺序,或者程序中代码的编写顺序一步一步的进行执行。面向对象编程面向对象的编程,它的主要特点是类,类是独立个体。即先将所有需要执行的功能或者函数拆分,然后进行分类,封装到不同的类中。程序执行的过程中,通过不同的类或类的对象来调用不同的函数来完成程序的运行原创 2020-10-24 16:38:39 · 1919 阅读 · 0 评论 -
关联容器
关联容器支持高效的关键字查找和访问,两个主要关联容器类型:map和set。map:”关键字—值“,关键字起到索引作用,值则表示与索引相关联的数据。set:“关键字”,支持高效的关键字查询操作。关联容器提供的八个容器:主要体现三个维度:或者是一个set,或者是一个map 或者要求不重复的关键字,或者允许重复的关键字。(以multi开头) 按顺序保存元素,或无序保存。(以unordered开头)按关键字有序保存元素:(头文件为map和set)map 关联数组:保存关键字—值对原创 2020-08-22 05:45:46 · 196 阅读 · 0 评论 -
当类中有指针时的拷贝构造函数和拷贝赋值运算符
首先我们了解什么是拷贝构造函数和拷贝赋值运算符拷贝构造函数:如果一个构造函数的第一个参数时自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。class Test{public: Test(); //默认构造函数 Test(const Test&); //拷贝构造函数 //........};此处必须为引用的原因:如果此处为值传递,则想要进行拷贝的步骤,则首先需要将实参传递到形参,而此过程中就是实参拷贝...原创 2020-08-18 23:30:48 · 1105 阅读 · 0 评论 -
你学会lambda表达式了吗???
lambda表达式一个lambda表达式具有一个返回类型,一个参数列表和一个函数体;和函数不同,lambda定义在函数内部表达式形式: [capture list](parameter list)->return type{ function body} //捕获列表 参数列表 返回类型 函数体可以忽略参数列表和返回类型,但是必须永远包含捕获列表和函数体eg: auto f = [ ]{return 5; };...原创 2020-08-17 21:12:55 · 264 阅读 · 0 评论 -
sting流:istringstream,ostringstream,stringstream。教会你str()和clear()的区别
istringstream#include<iostream>#include<string>#include<sstream>using namespace std;int main(){ string a, b; a = "asdas asdas asdfasd fdgbtrhh"; istringstream stream(a); while (stream >> b) { cout << b <<原创 2020-08-16 11:38:26 · 722 阅读 · 0 评论 -
类的静态成员与静态成员函数
声明静态成员使用类的静态成员定义静态成员静态成员的类内初始化静态成员能用于某些场景,而普通函数不能原创 2020-08-14 22:49:54 · 4109 阅读 · 0 评论 -
再谈友元函数
友元函数一个类如果想要其它类或者函数能够访问到它的非共有成员,方法就是使得其它的类或者函数成为它的友元。只需要增加一条friend关键字即可。友元函数的声明仅仅指定了访问的权限,而非函数声明。因此如果需要调用某个友元函数,就必须在友元函数的声明之外,在进行一次声明。注意:友元函数是不能传递的 友元函数单向的 友元关系是不被继承的一,友元函数友元函数是在类中用关键字friend修饰的非成员函数。友元函数可以是一个普通的函数,也可以是其他类的成员函数。虽然它不是本类的成员函数,但是在它原创 2020-08-14 16:50:48 · 322 阅读 · 0 评论 -
函数指针和指针函数:超详解——函数指针形参
函数指针:指向的是函数而非对象。和其它指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定。与函数名无关void show(int a); //想要声明一个可以指向该函数的指针,只需用指针替换函数名即可void(*print)(int a); //print指向一个函数,该函数由一个int形参,返回值是void类型1,使用函数指针当有与指针相同类型的函数时,直接赋值即可: print = show; //...原创 2020-08-13 23:27:35 · 3981 阅读 · 0 评论 -
命名的强制类型转换static_cast ,const_cast,reinterpret_cast
一,static_cast用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。 把空指针转换成目标类型的空指针。 把任何类型的表达式转换成void类型任何具有明确定义的类型转换,只要不包含底层const,都可以使用原创 2020-08-13 12:14:47 · 350 阅读 · 0 评论 -
关于标准库类型1:vector
标准库类型vector表示对象的合集,其中所有对象的类型都相同。集合中每个对象都有与之对应的索引,索引用于访问对象,我们也常常称之为对象定义和初始化vector对象vector<T> a1 //a1是一个空vector,他潜在的元素是T类型的,执行默认初始化vector<T> a2(a1) //v2中含有v1所有元素的副本vector<T> a3=a1 //等价于a3(a1)vector<T> ...原创 2020-08-12 21:41:38 · 213 阅读 · 0 评论