自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 虚函数-遗失的子类析构函数

虚函数-遗失的子类析构函数不见的析构函数#include <iostream>using namespace std;class a {public: a() { cout << "调用a类的构造函数" << endl; } ~a() { cout << "调用a类的析构函数" << endl; }};class b :public a {public: b() { cout << "调用

2021-03-22 19:16:12 223

原创 虚函数

虚函数多态的本质:形式上,使用统一的父类指针做一般性处理,但是实际执行时,这个指针可能指向子类对象,形式上,原本调用父类的方法,但是实际上会调用子类的同名方法。【注意】程序执行时,父类指针指向父类对象,或子类对象时,在形式上是无法分辨的!只有通过多态机制,才能执行真正对应的方法。虚函数的定义:在函数的返回类型之前使用virtual只在成员函数的声明中添加virtual, 在成员函数的实现中不要加virtual虚函数的继承:如果某个成员函数被声明为虚函数,那么它的子类【派生类】,以

2021-03-17 17:24:50 443

原创 重载运算符

重载运算符为什么要使用运算符重载C/C++的运算符,支持的数据类型,仅限于基本数据类型。解决方案:使用运算符重载方式1:使用成员函数重载运算符#include <iostream>#include <string>using namespace std;class a {public: //带参构造函数 a(int num) { number = num; } //拷贝构造函数 a(const a& other) {

2021-03-11 22:19:25 205

原创 友元

友元为什么要使用友元C++是面向对象的,目的之一:封装封装:优点之一,就是安全。缺点:在某些特殊的场合,不是很方便。友元的两种使用形式友元函数、友元类。友元函数使用全局函数作为友元函数#include <iostream>#include <string>using namespace std;class test {public: int get_age()const { return age; } string get_

2021-03-09 18:47:47 106

原创 c++文件流操作

c++文件流操作文件流: 对文件进行读写操作头文件: 类库:ifstream 对文件输入(读文件)ofstream 对文件输出(写文件)fstream 对文件输入或输出文件打开方式:模式标志描述ios::in读方式打开文件ios:out写方式打开文件ios::trunc如果此文件已经存在, 就会打开文件之前把文件长度截断为0ios::app尾部最加方式(在尾部写入)ios::ate文件打开后, 定位到文件尾ios

2021-03-06 18:35:44 294

原创 类-多重继承中的重大缺陷(使用虚继承解决)

类-多重继承中的重大缺陷(使用虚继承解决)多重继承在菱形继承中的重大缺点#include <iostream> #include <string>#include <Windows.h>using namespace std;// 电话类class Tel {public: Tel() { this->number = "未知"; }protected: string number; //电话号码;};// 座机类

2021-03-04 18:23:23 311 1

原创 类的多重继承

类的多重继承什么是多重继承多重继承就像我们都是爸爸妈妈的孩子,我们继承了爸爸妈妈的一些特征多继承/多重继承:一个派生类可以有两个或多个基类(父类)。多重继承在中小型项目中较少使用,在Java、C#等语言中直接取消多继承, 以避免复杂性.多重继承的用法将多个基类用逗号隔开.实例:例如已声明了类A、类B和类C,那么可以这样来声明派生类D:class D: public A, private B, protected C{ //类D自己新增加的成员};D 是多继承形式

2021-03-02 18:36:51 670

原创 子类跟父类的关系

子类跟父类的关系什么是子类型​ 公有继承时,派生类的对象可以作为基类的对象处理,派生类是基类的子类型。#include <iostream>using namespace std;class A {public: A() {} ~A() {} void kill() { cout << "A kill." << endl; }};class B : public A {public: B(){} ~B(){} void kill

2021-03-01 19:17:39 2670

原创 子类与父类构造函数调用顺序

子类与父类构造函数调用顺序构造函数当创建子类对象时, 构造函数的调用顺序:静态数据成员的构造函数 -> 父类的构造函数 -> 非静态的数据成员的构造函数 -> 自己的构造函数注意:无论创建几个对象, 该类的静态成员只构建一次, 所以静态成员的构造函数只调用1次!!!析构函数子类的析构函数的调用顺序,和子类的构造函数的调用顺序相反!!!记住,相反即可。#include <iostream>#include <Windows.h>usi

2021-02-22 17:13:19 4833 1

原创 派生和继承的各种方式

派生和继承的各种方式派生和继承的各种方式public(公有)继承[使用最频繁]父类中定义的成员(数据成员和函数成员)被继承后,访问权限不变!public --> publicprotected --> protectedprivate --> privateprivate(私有)继承父类中定义的成员(数据成员和函数成员)被继承后,访问权限都变成privatepublic --> privateprotected --> priva

2021-02-21 16:51:29 245

原创 类的访问权限-public、private、protected

访问权限protected(保护)访问权限为什么要使用protected访问权限?子类的成员函数中,不能直接访问父类的private成员,已经这些成员已经被继承下来了,但是却不能访问。只有通过父类的public函数来间接访问,不是很方便。比如,刚才Demo中Father类中的name和age成员。 class Father { public: Father() { name = "无名"; age = 0; }

2021-02-20 17:31:21 2629 1

原创 继承与派生

继承与派生有大量重复的代码和实现。继承和派生在UML中的表示注意是“空心三角箭头”,从子类【派生的类】指向父类【被继承的类】父类,也称为“基类”除了“构造函数”和“析构函数”,父类的所有成员函数,以及数据成员,都会被子类继承!示例 :为了防止文章比较简明,我就写了继承有关的代码 //定义一个儿子类,从Father类继承下来的 class Son : public Father {全部代码#include <iostream>#include <str

2021-02-19 18:30:01 125

原创 组合与聚合

组合与聚合组合​ 说明:组合和聚合,不是C++的语法要求,是应用中的常用手段。​ 组合​ 需求:​ 构建一个计算机类,一台计算机,由CPU芯片,硬盘,内存等组成。​ CPU芯片也使用类来表示。Cpu类#include <string>class CPU{public: CPU(const char *brand = "intel", const char *version="i5"); ~CPU();private: std::string brand; //

2021-02-18 17:41:04 158

原创 const修饰类

类中的constconst数据成员const数据成员的初始化方式:\1. 使用类内值(C++11支持)\2. 使用构造函数的初始化列表(如果同时使用这两种方式,以初始化列表中的值为最终初始化结果)注意: 不能在构造函数或其他成员函数内,对const成员赋值!class Human {public: ......private: ...... const string bloodType = "未知"; //c++11标准以后才支持};// 使用初始化列表,对cons

2021-02-17 17:24:23 403

原创 this指针、静态数据

this指针this指针是一个特殊的指针,其指向的就是对象的本身Human::Human(int age, int salary) { cout << "调用自定义的构造函数" << endl; this->age = age; //this是一个特殊的指针,指向这个对象本身 this->salary = salary; name = "无名"; addr = new char[64]; strcpy_s(addr, 64, "China"

2021-02-16 18:50:33 174

原创 析构函数

析构函数作用:对象销毁前,做清理工作。具体的清理工作,一般和构造函数对应比如:如果在构造函数中,使用new分配了内存,就需在析构函数中用delete释放。如果构造函数中没有申请资源(主要是内存资源),那么很少使用析构函数。函数名:~类型没有返回值,没有参数,最多只能有一个析构函数访问权限:一般都使用public使用方法:不能主动调用。对象销毁时,自动调用。如果不定义,编译器会自动生成一个析构函数(什么也不做)#include <iostream>

2021-02-15 18:11:30 119

原创 构造函数

构造函数*构造函数的作用*在创建一个新的对象时,自动调用的函数,用来进行“初始化”工作:对这个对象内部的数据成员进行初始化。*构造函数的特点*1)自动调用(在创建新对象时,自动调用)2)构造函数的函数名,和类名相同3)构造函数没有返回类型4)可以有多个构造函数(即函数重载形式)*构造函数的种类*默认构造函数自定义的构造函数拷贝构造函数赋值构造函数自定义默认构造函数没有参数的构造函数,称为默认构造函数。合成的默认构造函数但没有手动定义默认构造函数时,编译器自动为这

2021-02-13 18:47:02 224

原创 面向对象 - 类

面向对象 - 类为什么要使用面向对象面向过程:什么是面向过程?根据程序的执行过程,来设计软件的所有细节。面向过程的缺点:开发大型项目时,越来越难以把控,甚至失去控制。后期维护、更新成本很大。解决方案:使用面向对象。面向对象是一种开发思想,一种全新的开发方式。面向对象思想的重要性:开发大型项目必备,是高级程序员的必备技能!类的定义面向对象编程,最重要的第一个概念:类“人类”是一个抽象的概念,不是具体的某个人。“类”,是看不见,摸不着的,是一个纯粹的概念.“类”

2021-02-10 17:31:36 124

原创 宏、结构体、枚举

宏、结构体、枚举宏为什么要使用宏 提高代码的可读性和可维护性 避免函数调用,提高程序效率什么是宏它是一种预处理器指令,在预编译阶段将宏名替换为后面的替换体 。宏的定义由三部分组成#define WIDTH 960 预处理指令 宏名 替换体(多行可用 \ 延续)宏定义的使用\1. 不带参数的宏\2. 在宏中使用参数(请注意一下的区别: #define SQUARE(x) (x)*(x) #define SQUARE(x)

2021-02-09 17:39:42 255

原创 变量的四种存储类型

变量的四种存储类型-atuo、register、static、extern所有的数据都有两种类型数据类型: 如 int,float 等存储类型: 总共有四种存储类型的变量,分别为自动变量(auto)、静态变量(static)、外部变量(extern)以及寄存器变量(register)。auto - 函数中所有的非静态局部变量。register - 一般经常被使用的的变量(如某一变量需要计算几千次)可以设置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存中的非

2021-02-08 17:56:48 9908

原创 动态内存分配

动态内存分配new 和 delete 基本语法1)在软件项目开发过程中,我们经常需要动态地分配和撤销内存空间,特别是数据结构中结点的插入与删除。在 C 语言中是利用库函数 malloc 和 free 来 分配和撤销内存空间的。C++提供了较简便而功能较强的运算符 new 和 delete 来 取代 malloc 和 free 函数。​ (注意: new 和 delete 是运算符,不是函数,因此执行效率高。)2)虽然为了与 C 语言兼容,C++仍保留 malloc 和 free 函

2021-02-07 17:35:05 258

原创 引用的其他形式

引用的其他形式指针引用使用指针引用时,相当于是使用二级指针,使用二级指针可以从函数内部带出函数里的变量,那么使用指针引用也可以#include <iostream>using namespace std;//使用二级指针形式void boy_home(int** meipo) { static int boy = 23; *meipo = &boy;}//使用指针引用的形式void boy_home1(int*& meipo) { static in

2021-02-06 18:56:54 75

原创 引用

引用1 引用概念a) 在C++中新增加了引用的概念b) 引用可以看作一个已定义变量的别名c) 引用的语法:Type& name = var;d) 引用做函数参数那?(引用作为函数参数声明时不进行初始化)#include <iostream>using namespace std;int main(void) { int a = 10; int& b = a; //声明引用的时候必须初始化,因为是别名 cout << "a的地址:

2021-02-05 17:00:08 96

原创 void类型指针和函数指针

void类型指针和函数指针void类型指针void=> 空类型void* => 空类型指针,只存储地址的值,丢失类型,无法访问,要访问其值,我们必须对这个指针做出正确的类型转换,然后再间接引用指针。所有其它类型的指针都可以隐式自动转换成 void 类型指针,反之需要强制转换#include <iostream>using namespace std;int main(void) { int arr[] = { 1, 2, 3, 4, 5 }; cha

2021-02-04 17:10:54 496

原创 指针与数组的区别

指针与数组的区别数组:数组是用于储存多个相同类型数据的集合。指针:指针是一个变量,但是它和普通变量不一样,它存放的是其它变量在内存中的地址。1. 赋值数组:只能一个一个元素的赋值或拷贝指针:指针变量可以相互赋值2. 表示范围数组有效范围就是其空间的范围,数组名使用下表引用元素,不能指向别的数组指针可以指向任何地址,但是不能随意访问,必须依附在变量有效范围之内3. sizeof数组:数组所占存储空间的内存:sizeof(数组名)数组的大小:sizeof(数组名)/sizeof(数据

2021-02-03 18:37:58 3095

原创 指针与数组

指针与数组1. 指针表示法和数组表示法数组完全可以使用指针来访问, array[3] 和 *(array+3) 等同#include <iostream>using namespace std;int main(void) { int array1[10] = { 1,2,3,4,5,6,7,8,9,10 }; cout << "指针表示法" << endl; for (int i = 0; i < 10; i++) { cout <

2021-02-02 18:01:19 123

原创 二级指针

二级指针二级指针也是一个普通的指针变量,只是它里面保存的值是另外一个一级指针的地址定义:int guizi1 = 888;int *guizi2 = &guizi1; //1 级指针,保存 guizi1 的地址int **liujian = &guizi2; //2 级指针,保存 guizi2 的地址,guizi2 本身是一个一级指针变量#include <stdio.h>#include <stdlib.h>int main(void){ int

2021-02-01 17:43:08 6299

原创 指针的运算

指针的运算自增[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UsjjSzB3-1612091359644)(E:\博客\指针\指针运算\自增.png)]从上面的例子中可以看出,ptr1,ptr2分别指向着两种不同的类型,但是自增的时候都是加了数组的下一个元素的位置就可以得出下面的结论了ptr++ 的概念是在 ptr 当前地址的基础上 ,自增 ptr 对应类型的大小,也就是说 ptr = ptr+ 1*(sizeof(类型))自减自减跟自增

2021-01-31 19:13:57 871

原创 const修饰指针

const修饰指针const修饰指针一共有三种情况第一种情况 - *const int ptr = &a;int a = 0;const int *ptr = &a; //这种情况修饰的是*号, *号又是解引用符, 既然修饰的是它,那么 *ptr是不能被修改的*ptr = 5; //这是一种错误的行为而修改ptr是可以的ptr = NULL //√第二种情况 - int * const ptr = &a;i

2021-01-30 17:31:01 139

原创 指针

指针什么是指针官方回答:指针是一个占据存储空间的实体在这一段空间起始位置的相对距离值。在C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。我的理解:指针就是一个指向地址的,通过指针去方位地址,然后就能知道那地址上存了什么东西(获取数据)如何定义指针变量//定义了一个指针 //指针本身也是一个变量 //名称是 p, 它是一个指针,可以指向一个整数 //也就是说: p

2021-01-28 18:39:48 69

原创 多维数组和一些常见的错误

多维数组和一些常见的错误三维数组三维数组就是维度为三的数组,可以认为它表示对该数组存储的内容使用了三个独立参量去描述,但更多的是认为该数组的下标是由三个不同的参量组成的。声明一个三维数组:int girl[3 ] [8] [5];可以把一维数组想象成一排士兵,把二维数组想象成一个士兵方阵,把三维数组想象成多个士兵方阵。这样,当你要找其中的一个女兵时,你只要知道她在哪个方阵(从 0、1、2 中选择),在哪一行(从 0-7)中选择,在哪一列(从 0-4 中选择)使用数组作为函数的参

2021-01-27 17:39:51 449

原创 数组

数组什么是数组:官方解答:数组(Array)是有序的元素序列。 [1] 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个 变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是 在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。 [1] 这些有序排列的同类 数据元素的集合称为数组我自己的理解:数组我觉得就是一个类型的集合,比如int类型,有10个int类型组成的集

2021-01-26 19:47:33 117

原创 递归函数-汉诺塔

递归函数-汉诺塔定义:在函数的内部,直接或者间接的调用自己。要点:再定义递归函数时,一定要确定一个“结束条件”!!!使用场合:处理一些特别复杂的问题,难以直接解决。但是,可以有办法把这个问题变得更简单(转换成一个更简单的问题)借助盗梦空间来帮我们来理解递归函数递归函数的缺点:性能很低!!!实际开发中, 极少使用!使用递归来解决汉诺塔问题汉诺塔规则:中间的棍子可以当助手,但一次只能移动一根棍子,不能把大棍子放在小上面。使用程序来解决这个问题:#inc

2021-01-25 17:38:08 271

原创 函数重载和内联函数

函数重载和内联函数函数重载C++可以使用同名函数[重载函数]实现功能类似的多个不同函数.函数名重载:函数名相同,但是, 函数的参数(形参)绝不相同:参数个数不同或参数个数相同, 但是参数的类型不同只有返回类型不同,不能构成函数重载只有形参变量名不同, 不能构成函数重载.注意: C语言不支持函数重载示例:#include <iostream>using namespace std;int add(int a, int b) { retu

2021-01-24 17:41:36 285

原创 函数

函数为什么要使用函数1)“避免重复制造轮子”,提高开发效率strcmp(str1, str2);//(库函数,实现两个数比较)2)便于维护初学者的创建错误:函数很长, 常常超过100行不知道怎样定义函数函数的定义函数的设计方法:1)先确定函数的功能2)确定函数的参数是否需要参数,参数的个数,参数的类型3)确定函数的返回值是否需要返回值,返回值的类型4)确定函数名函数名, 一定要顾名思义.5)函数名的命名方法, 和变量名相同函数的实现示

2021-01-23 17:46:13 68

原创 使用循环打印金字塔、乘法口诀表、水仙花数、斐波那契数列

使用循环打印金字塔、乘法口诀表、水仙花数、斐波那契数列打印金字塔 *的个数 空格的个数 ​ 第1行: 1 7(n-1) ​ 第2行: 3 6(n-2) ​ 第3行: 5 3 ​ 第4行: 7 2 ​ 第 i 行: 2*i-1 n-i ​ 第 n 行: 2*n-1 示例:#include <iostream>using name

2021-01-22 17:06:26 360 1

原创 while,for ,do while循环语句

while循环语句流程图使用方法while (条件) {语句1语句2if(XXX){​ break;​ }​ if(XXX){​ continue;​ }…}break的作用跳出所在的循环。coutinue结束本次循环,进入下一次循环示例:1 + 2 + 3 + … + 100#include <iostream>#include <Windows.h>#include <string>using

2021-01-21 18:40:14 1366

原创 switch语句

switch语句流程图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWtfIeIb-1611143041369)(E:\博客\switch语句\switch.gif)]语法switch (x) {case 表达式1:语句1break;case 表达式2:语句2break;case 表达式3:语句3break;default表达式1:语句1break;}switch: 用于int/char/long/long long 类型

2021-01-20 19:45:27 339

原创 if语句

if流程图if的三种形态形态一int a = 100;if (a > 1) { //判断a大于1吗?(if是如果的意思) cout << "a大于1" << endl;}形态二int a = 100;if(a > 101){ //判断a大于101吗? cout << "a大于101" << endl;}else{ //a不大于101就执行这条else里面的语句(else就是否

2021-01-19 19:17:45 221

原创 类型转换

类型转换概念为什么需要“类型转换”参与运算的两个操作数的数据类型,必须相同!类型转换的类别:隐式类型转换 (自动完成转换)​ 1)算数转换​ 2)赋值转换​ 3)输出转换强制类型转化隐式类型转换算数转化 (+,-,*,/,%) char , int, long, long long, float, double ​15 + 3.14 => 15.0 + 3.14赋值转换#include <stdio.h&gt

2021-01-18 18:36:05 90

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除