c++语言
文章平均质量分 74
ZWE7616175
这个作者很懒,什么都没留下…
展开
-
用c++语言实现学生管理系统
#define _CRT_SECURE_NO_WARNINGS 1#include #include //用getch()#include #include #include #include using namespace std;class student//定义一个学生类{private: char name[20]; char sex[4]; int number原创 2017-07-23 10:37:50 · 923 阅读 · 1 评论 -
C++支持重载的幕后---名字修饰规则(调用约定、extern "C")
C语言名字修饰我们知道C语言是不支持函数重载的,而C++支持。原因很简单,编译器对C函数的修饰和对C++函数的修饰是不同的。编译器对于C语言的修饰是在其函数名前加一个下划线,只与函数名相关,与其他无关。C++名字修饰规则的由来我们都知道,C++是一门强大又复杂的语言,包含类、继承、虚函数、重载、命名空间等,使得符号管理更加复杂。 举个简单的例子:void fun(in...原创 2018-07-17 21:49:06 · 393 阅读 · 0 评论 -
谈一谈this指针
什么是this指针?1.一个经典的例子当你进入一个房子,你可以看到房子里的桌子、沙发、地板,但是你看不到房子的全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但类实例的本身呢,这里就出现了this指针,始终指向该类的实例。在这个例子中,类就好比是一座房子,而this就好比是这座房子的钥匙,一旦有了钥匙,就可以对房子里的物品进行使用了。this是指向实例化对象本身的一...原创 2018-07-18 15:46:52 · 246 阅读 · 0 评论 -
解密之------const类型对象只能访问const类型成员函数
在学习const修饰的对象时,我们总会听到const和非cosnt间的访问原则如下: const类型对象可以访问非const类型成员函数,但是不能访问const类型成员函数。在一个对象调用构造函数时,会隐含一个新参this指针。 也就是说,当我们定义了一个类(A)的非const类型的成员函数为A::Fun()。 实际上在编译器中该函数的定义是A::Fun(A* con...原创 2018-07-19 15:44:38 · 2510 阅读 · 1 评论 -
C++内联函数和宏的区别
内联函数C++中用inline修饰的函数称为内联函数,编译时内联函数会在内联函数的位置展开,没有函数压栈,比较高效。内联函数的性质内联函数的声名和定义必须放在一起才是内联函数;内联函数采用的是以空间换时间,减少了参数压栈的时间;内联函数只是对编译器的一种建议,不一定inline修饰的函数就是被当做是内联函数,是由编译器决定的;如果函数内有循环或者是递归,就不被当做内联函数处...原创 2018-07-19 16:58:41 · 362 阅读 · 1 评论 -
C和C++的区别
C语言是面向过程的,C++是面向对象的,而C和C++的区别也就是面向过程和面向对象的区别。面向过程(OP)和面向对象(OO)其实是相辅相成的,面向过程是以“事件”为中心的,分析完成这个事件需要做的工作,最后用函数来实现,并按照顺序调用。而面向对象是以“对象”为中心,建立对象的目的不是为了完成某个工作,而是为了描述某个事物在整个解决问题中的行为。总之,面向过程的思维是分析综合,面向对象的思维...原创 2018-07-25 12:49:14 · 235 阅读 · 0 评论 -
C++输入输出运算符的重载
C++中的流插入运算符“>>”和流输出运算符“<<”在C++类库中提供的,所有的C++编译系统都会在提供输入流istream和输出流ostream,cin、cout是分别是istream类和ostream类的对象,在类库的头文件中已经对“<<”、“>>”运算符进行了重载,原创 2018-07-26 10:49:48 · 9582 阅读 · 2 评论 -
【C++内存管理】malloc/calloc/realloc的区别
malloc/calloc/realloc的区别malloc/calloc/realloc都是进行动态内存管理的,均在堆上开辟空间,必须用free将申请的空间释放。//函数原型void* malloc(size_t size);void* calloc(size_t nmemb, size_t size);void* realloc(void* p, size_t newsize...原创 2018-07-20 23:29:42 · 472 阅读 · 0 评论 -
如何检测内存泄露
C++大量的手动分配、回收内存是存在风险的,很有可能因为我们的操作不当导致内存泄露的问题。介绍一种在Debug模式下测试内存泄露的方法。 先在文件的开头加上如下代码,切记顺序不可以改变。#define _CRTDBG_MAP_ALLOC#include<crtdbg.h>#include <stdlib.h>第一行的宏,是实现一些内存分配函数向Debu...原创 2018-07-20 23:33:32 · 774 阅读 · 0 评论 -
设计一个类,只能在堆上创建?只能在栈上创建?只能创建一个对象?
设计一个类 只能在堆上创建? 只能在栈上创建? 只能创建一个对象?(单例模式**)C++中创建对象的方法有两种,静态创建和动态创建。1.静态创建静态创建是由编译器为对象在栈空间中分配一块内存,通过直接移动栈顶指针,取出需要多大的空间,然后再这块内存上钓调用构造函数形成一个栈对象。直接调用类的构造函数。2.动态创建通过new运算符将对象建立在堆空间中。首先,调用op...原创 2018-07-21 16:00:26 · 702 阅读 · 0 评论 -
C++之引用的理解
C语言中没有引用,引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效,是提高代码执行效率和增强代码质量的一个很好的办法。一、概念引用就是给已经存在的 变量取的一个别名,和引用变量共同占用一块内存空间。 引用声明:类型标识符 &引用名 = 目标变量名 举个例子:int a;int &ra = a;//定义变量...原创 2018-08-01 14:59:21 · 606 阅读 · 0 评论 -
C++之虚函数(为什么构造函数不可以声明为虚函数,析构函数可以声明为虚函数)
构造函数不能声明为虚函数,而析构函数可以声明为虚函数,在有的情景下析构函数必须声明为虚函数。 不建议在构造函数和析构函数里调用虚函数。构造函数不能声明为虚函数的原因?构造一个对象时,必须知道对象实际类型,而虚函数是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功,编译器就无法知道对象的实际类型,是该类本身,还是派生类,还是其他。虚函数的执行依赖于虚函数表,而虚函...原创 2018-08-01 17:29:29 · 1982 阅读 · 0 评论 -
浅析Debug和Realse
Debug版本通常称为调试版本,通过编译选项的配合,编译的结果通常包含调试信息,可以设置断点、单步调试等,而且不做任何优化,可以使开发人员提供强大的程序调试能力。Release版本通常称为发布版本,是为了用户的使用,一般发布版本上不允许调试,Release版本通常不包含调试信息,同时进行了各种优化,以期达到代码量最小和效率最高的目的。Debug版本通常要比Release版本程序慢,特别是在...原创 2018-08-12 19:19:57 · 3908 阅读 · 0 评论 -
在C语言中,struct和class的区别
在C语言中,struct是用户自定义的数据类型;而在C++中,struct定义的是抽象数据类型,支持成员函数的定义。在C++中,struct是有访问权限的,分为private、protected、public。在C++中,struct和class其实是一样的,只不过struct默认的访问权限是public,class默认的访问权限是private。在C++中struct和class的区别?...原创 2018-08-18 11:19:46 · 11244 阅读 · 0 评论 -
C++中voliate关键字
voliate变量是随时变化的,用voliate修饰的运算,编译器不进行优化,以免出错。对于一个普通变量,为提高存取速率,编译器会先将变量的值存储在一个寄存器中,以后再取变量值时,就存寄存器中取出。但是用voliate修饰的变量,就说明这个变量会发生意向不到的改变。也就是说,优化器每次在读取该值时,不会假设这个值了,每次都会小心的在读取这个变量的值,而不是在寄存器中取保留的备份。那么,...原创 2018-08-18 14:15:28 · 7100 阅读 · 1 评论 -
类和对象
一、类的定义类是一种复杂类型,将不同的类型的数据和相关的操作封装在一起。类是对象的抽象,对象是类的一种实例。类定义方式将类的声明和定义放在类内。优点是编译器可以将其识别为内联函数,缺点是会出现头文件包含的问题。 将类的声明和定义分开,声明在类内,定义在类外,以便于重复利用。二、访问限定符类的访问限定符分为public、protected、private。说明:...原创 2018-08-18 17:44:57 · 254 阅读 · 0 评论 -
static总结
一、修饰变量static可以修饰变量,修饰变量又分为:全局变量、局部变量。全局变量static修饰的全局变量改变了链接属性,使得其具有文件作用域,不能被同一个工程下的其他源文件访问到。局部变量static修饰的局部变量改变了变量的生命周期,使其不再是生命周期函数,函数调用结束后保留其值。存储位置没有被static修饰的全局变量存储在静态区,没有被static...原创 2018-08-26 10:39:11 · 233 阅读 · 0 评论 -
面向对象的三大特性
面向对象的三大特性:继承、封装、多态。继承:继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”。 被继承的类称为“基类”、“父类”或“超类”。 继承的过程,就是从一般到特殊的过程。 要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。封装:封装将函数...原创 2018-07-17 20:37:53 · 252 阅读 · 0 评论 -
空类的大小是多少?原因是什么?
首先,我们要知道,一个类是没有大小的,应该说成是类的实例的大小。class A;A a;其中,sizeof(A) == sizeof(a); 一个对象的大小 大于等于所有的非静态成员大小的总和。 这是为什么呢?1.指向虚函数表的指针对于有虚函数的类,需要有一个方法为它的实体提供类型信息和虚函数入口,一般的方法是建立一个虚表(虚函数表)。在实例化时,在对象中增加一个指向虚函...原创 2018-07-17 17:17:05 · 3521 阅读 · 0 评论 -
智能指针剖析
C++11中引入了智能指针包括auto_ptr、shared_ptr、weak_ptr、unique_ptr。我们在写C++程序时,动态内存需要自己维护,动态开辟的空间,在出函数作用域或者程序正常退出前必须释放,否则会造成内存泄露。void fun() { T *t = new T(); //do something delete t; return;}在do...原创 2018-07-10 19:53:48 · 178 阅读 · 0 评论 -
复数类的运算符重载
#include <iostream>using namespace std;class Complex{public:Complex(const double _real, const double _image);Complex(const Complex& complex);~Complex();Complex& operator=(const ...原创 2017-09-23 18:34:13 · 520 阅读 · 0 评论 -
C++日期类的实现
#include using namespace std;class Date{public: Date(int year = 2017, int month = 9, int day = 24)//构造函数 : _year(year) , _month(month) , _day(day) {} bool IsLeapyear(int year);//判断是否为闰年原创 2017-09-24 16:46:24 · 287 阅读 · 0 评论 -
深拷贝&浅拷贝
浅拷贝,实际上就是对指针进行拷贝,两个指针指向同一块地址空间。而深拷贝不仅仅是对指针进行拷贝,而且对指针指向的内容进行拷贝。经深拷贝两个指针指向不同的地址空间。class String{public: String(const char* _pStr = "")//构造函数 :m_iSize(strlen(_pStr)+1) { m_pStr = new char[m_iSi...原创 2017-09-24 20:02:19 · 312 阅读 · 0 评论 -
C++继承[详细]
1.继承概念所谓继承,就是在已有类上派生出新类(派生类或子类),保持原有类特性的基础上进行扩展,增加新功能,被继承的类叫做基类(或父类),产生的新类叫做派生类(或子类)。2.继承定义格式class 派生类名称:继承类型(public,protected,private) 基类(父类)名称3.访问限定符总结:(1)公有继承实现的是一个接口继承,基类可用的成员派生类原创 2017-10-03 09:20:51 · 315 阅读 · 0 评论 -
深度剖析虚拟继承
虚拟继承函数与普通继承class Base{public: int _a;};class P :public Base{public: int _b;};class X :virtual public Base{public: int _c;};int main(){ //普通继承 P p; p._a = 0; p._b = 1; //虚拟继承原创 2017-10-09 18:36:18 · 536 阅读 · 0 评论 -
用C++实现顺序表
SeqList.h #include <iostream>#include <assert.h>using namespace std;typedef int DataType;class SeqList{public: SeqList();//普通版构造函数 SeqList(DataType* array, size_t size);//数组版...原创 2017-10-11 12:13:48 · 590 阅读 · 0 评论 -
浅谈C++多态
多态是什么呢?Step1:多态的概念:通俗的讲,就是同一个东西表现出不同的形态。Step2:多态分为两种--->静态多态(发生在编译阶段)--->函数重载原创 2017-10-11 22:49:41 · 352 阅读 · 0 评论 -
虚拟继承+虚函数,含有虚函数的菱形虚拟继承
1.虚拟继承+虚函数场景①:派生类没有自己的虚函数,只是继承基类的虚函数我们看一个例子:class Base{public: virtual void FunTest1() { cout << "Base::FunTest1()" << endl; } virtual void FunTest2() { cout << "Base::FunTest2()" <<原创 2017-10-14 09:20:09 · 399 阅读 · 0 评论 -
模板&泛型编程
我们如果要写一个Add()函数,那么会有泛型编程:编写与类型无关的逻辑代码,是代码复用的一种手段,模板是泛型编程的基础。原创 2017-10-15 14:03:13 · 314 阅读 · 0 评论 -
[栈的应用]括号匹配问题
括号匹配问题会出现以下几种场景:①左括号多于右括号②右括号多于左括号③括号类型不匹配④括号匹配成功首先,我们要考虑几个问题:①遇到不是括号的字符,应该向后走;②从前往后遍历,遇到左括号,入栈;③遇到右括号,和栈顶元素匹配,看是否匹配成功,若这时栈为空,说明左括号少于右括号,若不匹配,则输出提示信息,j结束函数,若匹配,则栈顶元素出栈,继续向后走。④若遍历到最后一原创 2017-11-19 19:47:15 · 479 阅读 · 0 评论 -
用C++语言实现链表面试题
#include #include #include #include using namespace std;typedef int DataType;typedef struct Node{ DataType data; struct Node* next;}Node,*pNode,*pList;void Init(pList* head){ *head = NU原创 2017-11-19 19:49:08 · 384 阅读 · 0 评论 -
[数据结构]队列实现、循环队列的不同实现
队列的概念:只允许在一端进行插入,一端进行删除的特殊线性表。进行插入的称为队尾,删除一端的称为队头。队列具有先进先出的特性(FIFO)。一、顺序队列:1、队头不动,入队时,尾部后移一位,出队时,队头后的每一个元素向前搬移。程序实现#define size 10templateclass Queue{public: Queue() :array(ne原创 2017-11-20 23:19:54 · 318 阅读 · 0 评论 -
C++中四种类型转换的关键字
C++中四种类型转换的关键字分别为: static_cast、dynamic_cast、const_cast、reinterpret_cast1.reinterpret_cast 该函数将一个类型的指针转换为另一个类型的指针。 这种转化不用修改指针变量值存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可以做到。 reinterpret_cast可以将指针值转换为一个整型数...原创 2018-04-20 21:16:33 · 607 阅读 · 0 评论 -
new/delete、malloc/free底层实现剖析和区别
new和malloc的区别malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。 malloc/free没有构造函数和析构函数,应尽量使用new/delete。new和delete与mallo...原创 2018-05-15 23:12:16 · 3732 阅读 · 0 评论 -
C++操作符重载(不能被重载的操作符)
C++中的运算符: 名称 运算符 算数运算符 +、-、/、%、++、– 位操作运算符 &amp;amp;、 逻辑运算符 !、&amp;amp;&amp;amp;、 比较运算符 &amp;lt;、&amp;gt;、&amp;lt;=、&amp;gt;=、==、!= 赋值运算符 =、+=、-=、*=、/=、%=、 其原创 2018-05-24 18:35:19 · 7276 阅读 · 2 评论 -
delete 一个数组时,为什么不需要指定数组的大小?
为了管理malloc的空闲空间,每一个独立块的最前面都包含了一个“头部信息”,属于额外开销。对于这个“头部信息”,做出以下解释。malloc实际分配的内存会大于我们需要的size,主要有两方面因素造成: ① 字节对齐。会对齐到机器最受限的类型。 ② “块头部信息”,每个空闲块都有“头部”控制信息,其中包含一个指向链表中的下一块的指针、当前块的大小和一个指向本身的指针。为了简化对齐,所有...原创 2018-05-31 10:23:32 · 1596 阅读 · 0 评论 -
const总结
1.在C语言中,const修饰的变量是常变量,而在C语言中,const修饰的变量是常量。原因是,C语言中不可以用一个N来定义数组的大小,而C++语言中可以。2.const修饰的指针const int *p1;//表示p1指向的内容不可以改变int* const p2;//表示p2这个指针不可以改变总结一句话就是,“近水楼台先得月”,const离谁近就修饰谁。3.const不仅...原创 2018-08-25 18:13:18 · 307 阅读 · 0 评论