C++学习
文章平均质量分 62
踏实IT精英
这个作者很懒,什么都没留下…
展开
-
快速排序详解
快速排序假如现在对6 1 2 7 9 3 4 5 10 8这10个数进行排序。首先在这序列中找到一个基准数作为参考。为了方便,这里可以使用6作为基准数。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列。3 1 2 5 4 6 9 7 10 8快排的实现其实:分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。原创 2021-01-07 23:58:24 · 213 阅读 · 0 评论 -
插入排序详解
插入排序详解插入排序的原理很简单,讲一组数据分为两组,分别称为有序组与待插入组,每次从待插入组中取一个元素,然后与有序的元素进行比较,并找到合适的位置,然后将该元素插到有序组当中。这样的话,每次插入一个元素,有序组增加,待插入组减少,一直到待插入元素个数为0,当然,插入过程涉及到元素移动,这一点不能忽略了。一般为了方便,都会把第一个元素作为有序组,其他的均为待插组。这里有动图的演示:链接: link代码演示:#include<stdio.h>void InsertSort(int原创 2021-01-07 23:30:44 · 140 阅读 · 1 评论 -
c++构造函数和析构函数的调用顺序
在使用构造函数和析构函数时,需要特别注意对他们的调用时间和调用顺序,在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反,最先被调用的构造函数,其对应(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。简单的说:其构造函数的顺序就一句话:基类构造函数->成员的构造函数->构造函数体语句看一下实例代码:#include <iost...原创 2019-04-22 14:33:45 · 6978 阅读 · 1 评论 -
C++继承下的构造函数
我们知道了构造函数的功能和用法,派生类同样有构造函数。当我们创建一个派生类对象的时候,基类构造函数将会被自动调用,用于初始化派生类从基类继承过来的成员变量,而派生类中新增的成员则需要从新定义构造函数用于初始化了。#include<iostream>using namespace std;class book{public: book(); book(char *a,dou...原创 2019-04-17 16:50:35 · 6291 阅读 · 1 评论 -
c++参数初始化表
我们知道构造函数的主要用途就是初始化对象的,除了采用上节所讲述的那种在函数体中一一赋值的方法外,通过参数初始化表同样可以对对象进行初始化,请看下面的代码(例1):class book{public:book(){}book(char* a, double p);void setprice(double a);double getprice();void settitle(char*...原创 2019-04-15 09:32:57 · 1822 阅读 · 0 评论 -
C++利用构造函数限制对象的创建
我们提到,如果不声明默认构造函数book(),而只声明带参构造函数book(char *a, double p)的时候,语句book Alice;是无法创建对象的。无法创建的原因在上一节已经讲明,这节就不再赘述了。不过类的构造函数的这一特性却可以用来限制对象的创建。[例1] 还是用 book 类来说明这节的内容:class book{public:void setprice(doubl...原创 2019-04-15 10:00:48 · 456 阅读 · 0 评论 -
拷贝构造函数
拷贝构造函数,顾明思议,就是通过拷贝对象的方式创建一个新对象。拷贝构造函数有两种原型:book(book &b);book(const book &b);这两种原型都是book类对象的引用。下面一种原型则规定在创建新对象的时候不得修改被拷贝的对象,如果拷贝构造函数的参数不是对象的引用,则是不允许的。如下面这种构造函数形式则是无法编译通过的。book(book b);为什么...原创 2019-04-15 11:07:18 · 9384 阅读 · 0 评论 -
常量引用
#include<iostream> 2 3 using namespace std; 4 //常引用的知识架构 5 void main1() 6 { 7 //普通引用 8 int a = 10; 9 int &b = a;10 printf("b:%d\n0", b);11 12 //常引用13 int...原创 2019-04-15 13:56:56 · 105 阅读 · 0 评论 -
C++类与static关键字
到目前为止,我们设计的类中所有的成员变量和成员函数都是属于对象的,如我们在前面定义的book类,利用book类声明两个对象Alice和Harry,这两个对象均拥有各自的price和title成员变量,同时还拥有类中所有的成员函数。除了这种情况以外,我们还有另外一种类型的成员,那就是与static结合的成员变量和成员函数。类中的成员变量或成员函数一旦与static关键字相结合,则该成员变量或成员函...原创 2019-04-15 14:41:03 · 82 阅读 · 0 评论 -
c++友元函数和友元类
通过friend关键字,我们可以将不属于当前类的一个函数在当前类中加以声明,该函数便可以成为当前类的友元函数例1:#include<iostream>using namespace std;class book{public: book() {} book(char *a,double p) friend void display(book &b);priv...原创 2019-04-15 15:58:36 · 239 阅读 · 0 评论 -
拷贝构造函数与赋值操作符的一些要点
拷贝构造函数首先看下列一段代码:#include<iostream>using namespace std;class A{private: int value;public: A(int n) { value = n; } A (A other) { value = other.value; } void Print() {...原创 2019-04-23 13:10:42 · 185 阅读 · 0 评论 -
c++中虚继承的作用
在c++中虚继承的作用主要是在多重继承的问题上防止二义性的产生。但是具体什么是虚继承呢?就是在被继承的类前面加virtual关键字,这时候被继承的类就叫做虚基类。具体请看下面的代码。class Person;class Son1 :virtual public:Person;class Son2: virtual public:Person;class Son3:public Son...原创 2019-04-23 14:08:36 · 2895 阅读 · 0 评论 -
在c++基类中,为什么析构函数要声明为虚函数
在类中,构造函数用于初始化对象及相关操作,构造函数是不能声明为虚函数的,因为在执行构造函数前对象尚未完成创建,虚函数表并不存在,此时就无法去查询虚函数表因此也就无法得知该调用哪一个构造函数了。析构函数则用于销毁对象完成时相应的资源释放工作,析构函数可以被声明为虚函数。我们可以通过下面这个例子来了解一下基类析构函数声明为虚函数的必要性。#include<iostream>using...原创 2019-04-23 15:10:50 · 2426 阅读 · 5 评论 -
c++内存管理操作符重载
内存管理操作符new,new[],delete和delete[]同样也可以进行操作符重载,其重载形式既可以是类成员函数的形式,又可以是顶层函数的形式。在设计一般的程序时,使用内建的内存管理操作符基本够用了,只有在需要进行自己内存管理时才会对内存管理操作符进行重载。操作符new的重载函数有两种形式:void *类名::operator new(size_t size){//以类成员函数的形式...原创 2019-04-23 16:00:22 · 121 阅读 · 0 评论 -
c++多态的实现及原理
c++多态用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类函数,如果对象类型是基类,就调用基类的函数1.用virtual关键字声明的函数叫做虚函数,虚函数肯定是类的成员函数2.存在虚函数的类都有一个一维的虚函数表叫做虚表,类对象有一个指向虚表开始的虚指针,虚表指针是和对象对应的3....原创 2019-04-18 22:50:12 · 164 阅读 · 0 评论 -
c++构造函数
构造函数是干什么的该类对象呗创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员初始化工作,所以:构造函数的作用:初始化对象的数据。构造函数种类class Complex{private: double m_real; double m_imag;public: //无参数构造函数 //如果创建一个类你没有写任何构造函数,则系统会自动生成默认的无参构造函数...原创 2019-04-14 13:49:19 · 98 阅读 · 0 评论 -
局部变量作为返回值
一般来说,函数是可以返回局部变量的,局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错,因为函数只是把指针赋值后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能返回指向栈内存的指针(注意这里指的...原创 2019-04-09 22:54:52 · 2873 阅读 · 1 评论 -
c++的继承方式
上面我讲了c++继承的概念以及语法,c++继承的语法一般为:C++继承的一般语法为:class 派生类名:[继承方式] 基类名{派生类新增加的成员};现在我们知道,public,protected,private三个关键字除了可以修饰类的成员,还可以指定继承方式。public,protocol,private修饰类的成员、类成员的访问权限由高到低依次为public->prote...原创 2019-04-15 17:24:55 · 1192 阅读 · 0 评论 -
c++里面的命名空间
C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace。科技发展到如今,一个系统通常都不会仅由一个人来开发完成,不同的人开发同一个系统,不可避免地会出现变量或函数的命名冲突,当所有人的代码测试通过,没有问题时,将所有人的代码结合到一起,因为变量或函数重名而导致的问题将会造成一定的混乱,例如:int flag = 1; //小李声明...原创 2019-04-09 09:14:50 · 91 阅读 · 0 评论 -
c++基本输入输出(cout和cin)
在C语言中,通常会在采用格式化输入输出函数printf和scanf用于输入或输出数据或信息。在C++语言中,C语言的这一套输入输出库我们仍能使用,但是C++语言又自定义了一套新的、更容易使用的输入输出库。在C++程序中,输入与输出可以看做是一连串的数据流,输入即可视为从文件或键盘中输入程序中的一串数据流,而输出则可以视为从程序中输出一连串的数据流到显示屏或文件中。在编写C++程序时,如果需要使...原创 2019-04-09 09:29:38 · 854 阅读 · 0 评论 -
c++引用
引用(Reference)是C++语言相对于C语言的又一个扩充,类似于指针,只是在声明的时候用&取代了*。引用可以看做是被引用对象的一个别名,在声明引用时,必须同时对其进行初始化。引用的声明方法如下:类型标识符 &引用名 = 被引用对象[例1]C++引用示例:int a = 10;int &b = a;cout<<a<<" "<<...原创 2019-04-09 09:57:14 · 61 阅读 · 0 评论 -
c语言中的const和c++中的const的区别
区别一C语言的const是定义了一个const变量,是一个只读变量,他的本质还是一个变量。C++的const是定义一个常量。int main(){ const int a = 10; int arry[a];//c++中,因为a已经是常量,但是在c中任然是变量,所以会保错。}在看看下面的代码C语言int main(){ const int a = 10; int *p...原创 2019-04-09 10:21:25 · 338 阅读 · 1 评论 -
c++中的强制转换
在c++中新添了四个关键字static_cast,const_cast,reinterpret_cast和dynamic_cast.这四个关键字都是用于强制类型转换的。现在逐一介绍着四个关键字。static_cast在c++语言中static_cast用于数据类型的强制转换,强制将一种数据类型转换为另一种数据类型,例如将数据类型转换为浮点型。例如1.c语言所采用的类型转换方式:int a ...原创 2019-04-09 13:27:17 · 113 阅读 · 0 评论 -
C++ new和delete操作符
在C语言中,动态分配和释放内存的函数是malloc、calloc和free,而在C++语言中,new、new[]、delete和delete[]操作符通常会被用来动态地分配内存和释放内存。需要注意的是new、new[]、delete和delete[]是操作符,而非函数;new和delete也是C++的关键字。操作符new用于动态分配单个空间,而new[]则是用于动态分配一个数组,操作符dele...原创 2019-04-09 13:36:09 · 134 阅读 · 0 评论 -
C++异常处理(try和catch)
在程序设计过程中,我们总是希望自己设计的程序是天衣无缝的,但这几乎又是不可能的。即使程序编译通过,同时也实现了所需要的功能,也并不代表程序就已经完美无缺了,因为运行程序时还可能会遇到异常,例如当我们设计一个为用户计算除法的程序时,用户很有可能会将除数输入为零,又例如当我们需要打开一个文件的时候确发现该文件已经被删除了……类似的这种情况很有很多,针对这些特殊的情况,不加以防范是不行的。我们通常希望...原创 2019-04-09 14:00:03 · 582 阅读 · 0 评论 -
C++类的定义和声明
C++语言可以看成是C语言的扩展和改进,相对于C语言,C++语言主要是增添了面向对象的特性。类(Class)则是C++面向对象编程的实现方式。无论是何种编程语言,进行面向对象程序设计都将是从类的设计开始的。什么是类呢?其实很简单,我们可以理解为一种用户自定义的数据类型,类似于C语言里面的结构体(struct),在本章最后我们将对比类和结构体之间的异同。首先我们来了解一下类的声明,先来看一个例子...原创 2019-04-09 14:10:27 · 937 阅读 · 0 评论 -
c++类的成员变量和成员函数详解
类可以看做是一种数据类型,它类似于普通的数据类型,但是又有别于普通的数据类型,类这种类型是一个包含成员变量和成员函数的集合。类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存。但是,在定义类的时候不能对成员变量赋值,因为类只是一种数据类型或者说是一种模板,本身不占用内存空间,而变量的值则需要内存来存储类的成员函数也和普通函数一样,都有返回值和参数列表,它与一般函数的区别是:成员...原创 2019-04-09 14:38:18 · 4022 阅读 · 0 评论 -
C++类的信息隐藏机制
类中可以声明变量和函数,为了将类对象的内部实现与外部行为分离开来,C++语言为类提供了封装机制,与之相关的三个关键字分别是:private、protected和public,这三个关键字所代表的含义分别为私有、受保护和公用。三个关键字的作用就是限制类中声明的变量和函数在外部的访问权限。C++的这一机制可以使得类对象的使用者只需要关心类是如何使用的,而不需要去关心类内部的实现问题。访问权限需要分...原创 2019-04-09 15:09:29 · 892 阅读 · 0 评论 -
c++成员选择符
通过上一节的学习我们看到:通过对象可以访问public属性的成员变量或成员函数。访问可以通过成员选择符“.”或指针操作符“->”来完成。[例1] 访问类的成员变量和成员函数:#includeusing namespace std;class book{public:void setprice(double a);double getprice();private:doub...原创 2019-04-09 15:17:44 · 409 阅读 · 0 评论 -
C++类class和结构体struct区别
C++语言继承了C语言的struct,并且加以扩充。在C语言中struct是只能定义数据成员,而不能定义成员函数的。而在C++中,struct类似于class,在其中既可以定义数据成员,又可以定义成员函数。在C++中,struct与class基本是通用的,唯一不同的是如果使用class关键字,类中定义的成员变量或成员函数默认都是private属性的,而采用struct关键字,结构体中定义的成员变...原创 2019-04-09 15:23:47 · 241 阅读 · 0 评论 -
C++通过引用来传递和返回类对象
类是C++语言面向对象编程的载体,我们也可以将类视为一种特殊的数据类型。在C++语言中,由类声明的对象,和其它类型声明的变量一样,同样可以通过传值、引用和指针的方式作为函数的参数或函数返回值。通常来讲,除非是迫不得已,否则最好不要采用传值的方式传递和返回对象,这是因为采用传值的方式传递和返回对象的过程中需要经历对象间的拷贝操作,这样会在一定程度上降低程序运行的效率,从而使得待处理数据量增大,增加...原创 2019-04-09 22:26:30 · 835 阅读 · 0 评论 -
c++继承的概念以及语法
继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承类似,例如儿子继承父亲的财产。继承可以理解我一个类从另一个类获取成员变量和成员函数的过程,例如类B继承类A,那么B就用于A的成员变量成员函数。被继承的类称为父类或基类,继承的类称为子类或派生类。派生类除了拥有自己基类的成员,还可以定义自己的新成员,以增强类的功能,以下是两种典型的使用继承的场景:1.当你创建的新类与现有的类...原创 2019-04-15 16:51:45 · 1193 阅读 · 0 评论