自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 问答 (5)
  • 收藏
  • 关注

转载 Java的String在内存中如何存储

Java的String在内存中如何存储本文转自https://www.cnblogs.com/zeroingToOne/p/9537655.htmlJDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)java中对String对象特殊对待,所以在heap区域分成了两块,一块是字符串常量池(String constant pool),用于存储java字符串常量对象,另一块用于存储普通对象及字符串对象。string的创建有两种方法:public

2020-07-17 15:57:51 353

原创 C#中文件夹类Directory的常用操作

主要功能是操作文件夹,命名空间System.IO,静态类,下面介绍一下常用函数CreateDirectory():创建 Directory.CreateDirectory(@"D:\2");Delete():删除 Directory.Delete(@"D:\1");如果该文件夹是非空的,需要加上一个参数 Directory.Delete(@"D:\1",true);Exists():判断是否存在 for (int i = 0; i < 100; ++i) { if (Dire

2020-07-05 11:24:07 1032

原创 使用FileStream实现文件的复制

namespace _07_File和FileStream { class Program { static void Main(string[] args) { string sourcePath = @"C:\Users\Gerton\Desktop\源文件.mp3"; string targetPath = @"C:\Users\Gerton\Desktop\目标文件.mp3"; myCopy(source

2020-07-04 14:58:47 510

原创 线性表2,讲了一些操作

总结一下线性表的抽象数据类型定义:ADT 线性表(List)Data 线性表的数据对象集合为{a1,a2,...,an},每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且只有一个 直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。OperationInitList(*L):初始化操作...

2019-04-17 23:29:36 131

原创 线性表1,简单讲了一个线性表和抽象数据类型

线性表线性表(list):由零个或多个数据元素组成的有限序列。这里需要强调几个关键的地方:- 首先它是一个序列,也就是说元素之间是有个先来后到的。- 若元素存在多个,则第一个元素无前驱,而最后一个元素无后继,其他元素有且只有一个前驱和后继。- 另外,线性表强调是有限的,事实上无论计算机发展到多强大,它所处理的元素都是有限的。- 线性表元素的个数n(n>=0)定义为线性...

2019-04-17 16:34:38 209

原创 容器和算法

渐渐地我们发觉编写的每一个程序都或多或少地需要存储一些数据,而C++这方面只提供了集中最基本的方法。你可以创建局部或全局变量来保存单个值,可以使用数组来保存多个值。今天的概念:能容纳两个或更多个值的数据结构通常我们称为容器(container)。这么说来,数组是C++唯一直接支持的容器,但数组并不适合用来解决所有的问题。如果打算编写一个简单的拼写检查程序,应该怎么做?首先想到的...

2019-04-17 01:28:45 200

原创 内联模板

内联函数内联即inline,首先想到的是内联函数,引入内联函数的目的是为了解决程序中函数调用的效率问题。内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但能否形成内联函数,需要看编译器对该函数定义的具体处理。举个例子:inline int add(int x, int y, ...

2019-04-16 23:01:30 640

原创 类模板

类模板和函数模板非常相似:同样是先由你编写一个类的模板,再由编译器在你第一次使用这个模板时生成实际代码。template <class T>class MyClass{ MyClass(); void swap(T &a, T &b);}构造器的实现将是下面这样:MyClass<T>::MyClass(){ /...

2019-04-16 17:33:22 102

原创 基本的模板语法,泛型编程

到目前为止,我们已经介绍了两种C++程序设计范型,即:- 按照面向过程式范型把程序划分成不同的函数- 按照面向对象式范型把代码和数据组织成各种各样的类并建立类之间的继承关系。泛型编程泛型编程技术支持程序员创建函数和类的蓝图(即模板,template),而不是具体的函数和类。这些模板可以没有任何类型:它们可是处理的数据并不限于某种特定的数据类型。当程序需要用到这些函数中的某一...

2019-04-16 16:53:59 194

原创 链接和作用域2

header.h#pragma once#ifndef HEADER_H#define HEADER_Hunsigned long returnFactorial(unsigned short num);unsigned short headerNum = 5;#endifthat.cpp#include "header.h"unsigned short tha...

2019-04-16 11:49:38 119

原创 链接和作用域

作用域前面已经创建了由多个文件构成的项目,是时候再来讨论更复杂的变量作用域了。简单的理解,变量的作用域就是你可以再什么范围内访问这个变量。我们都知道,一个在任何函数之前定义的变量可以在任何一个函数里使用(这是一个全局变量),而在某个函数里定义的变量只能在那一个函数里使用(这是一个局部变量)。那么,当一个项目由多个文件构成时,变量的作用域也会受到一定的影响!链接与作用域有关的...

2019-04-15 20:21:35 231

原创 命名空间和模块化编程3,命名空间

我们都知道,创建的每一个类、函数和变量都只能在一定的区域内使用。而我们所知道最大的区域是全局作用域,最小的区域是一个代码块,例如:{ int a = 20;}//a在此处已经不存在随着程序变得越来越复杂,全局作用域里的东西越来越多,尤其是在使用外部函数库时。这可就会导致必须把名字取得很长才会让它们不重名。这正是“命名空间”(namespace)的作用。命名空间其实...

2019-04-15 17:29:13 162

原创 命名空间和模块化编程2,重点有实例和C++预处理器

创建实现文件回到Rational这个例子,来进一步实现模块化编程。- rational.h头文件包含Rational类的声明,但不包含这个类的实现代码。- 这种分割可能刚开始接触的朋友觉得有点奇怪,但在视线中非常普遍。- 因为把接口(函数的原型)和实现(函数体的定义)分开是对代码进行模块化的基本原则之一。头文件的重要性不仅体现在可以告诉编译器某个类、结构或函数竟有着怎样的行为,...

2019-04-15 16:20:10 154

原创 命名空间和模块化编程1

模块化- 把程序划分为多个组成部分(即所谓的“模块”)- 这是通过把程序代码分散到多个文件里,等变异程序时再把那些文件重新组合在一起实现的。命名空间(namespace)- 这个概念相比起C语言是C++里新增加的东西,编写的程序越多、编写的程序越复杂,就越需要使用命名空间。头文件只有一个源代码文件来保存程序的全部代码是可行的,但那会给编辑修改工作带来诸多不便。我们可以借...

2019-04-15 12:10:23 170 1

原创 避免内存泄漏

前面我们讲过,分配了一个内存块但忘记了释放它这是一个严重的错误,这样的内存块要等到程序执行结束时才会被释放掉(不懂的话就看栈的相关介绍)。如果程序运行很长时间(例如在服务器上,注意不是所有的操作系统都像windows一样每天都要重启)并且在不停地申请新内存块,忘记释放那些已经不再有用的老内存块将迟早会把内存消耗殆尽,直接导致后面的new操作无法执行甚至是崩溃。这样的编程漏洞我们称之为内存泄...

2019-04-14 16:04:53 176

原创 高级对象强制类型转换

静态对象强制类型转换还是那个例子#include <iostream>#include <string>class Company{public: Company(std::string theName, std::string product); virtual void printInfo();protected: std::string ...

2019-04-14 14:26:26 180

原创 副本构造器

我们都知道,可以把一个对象赋值给一个类型与之相同的变量。编译器将生成必要的代码把“源”对象各属性的值分别赋值给“目标”对象的对应成员。这种赋值行为称之为逐位赋值(bitwise copy)这种行为在绝大多数场合都没有问题,但如果某些成员变量是指针的话,问题就来了:对象成员进行逐位复制的结果是你将拥有两个一模一样的实例,而这两个副本里的同名指针会指向相同的地址。于是乎,当删除其中一个对象...

2019-04-11 22:40:55 537 3

原创 从函数或方法返回内存还有函数指针和指针函数

动态内存的另一个常见用途是让函数申请并返回一个指向内存块的指针。掌握这个技巧很重要,尤其是在你打算使用由别人编写的库文件时。如果不知道这个技巧,就只能让函数返回一个简单的标量值,如整型、浮点型或字符型。换句话说,它既不能返回一个以上的值,也不能返回数组之类比较复杂的数据结构。可以这样说,只要你想让函数返回的东西不是一个简单的值,就需要学习本讲内容。这个技巧的基本思路并不复杂:在函数...

2019-04-10 23:58:52 201

原创 动态数组

虽然,前面我们讲过的用new给基本类型和对象在运行时分配内存,但它们的尺寸在编译时就已经确定下来--因为我们为之申请内存的数据类型在程序里有明确的定义,有明确的单位长度!可是,总有些时候,必须要等到程序运行时才能确定需要申请多少内存,甚至还需要根据程序的运行情况追加申请更多的内存。从某种意义上讲,这样的内存管理才是真正的动态!这一讲中,我们将带大家编写一个程序为一个整数型数组分配内存,实...

2019-04-10 17:46:52 493

原创 动态内存管理

到目前为止,演示过的所有的程序在完成它的任务时所使用的内存空间都是固定不变的。这个固定不变的内存空间其实是在编写程序时就可以知道和确定(一般以变量的形式)。这些程序都是不能在程序运行期间动态增加或减少内存空间。你见过要求用户输入的文本必须不多不少包含多少个字符的程序吗?这是不现实的。在很多时候,需要存储的数据量到底有多大在事先往往是一个未知数,要想处理好这类情况,就需要在C++程序里使...

2019-04-10 16:31:13 95

原创 assert函数和捕获异常

C语言和C++都有一个专为调试而准备的工具函数,就是assert()函数。这个函数实在C语言的assert.h库文件里定义的,所以包含到C++程序里我们用一下语句:#include <cassert>assert()函数需要有一个参数,它将测试这个输入参数的真or假状态。如果为真,Do nothing!如果为假,Do something!例子:#incl...

2019-04-10 12:21:47 795

原创 错误处理和调试:让函数返回错误代码

程序出错可以分为两大类:编译时出错(complie-time error)运行时出错(run - time error)让程序能够自行处理潜在错误的办法之一是创建一些测试函数:专门测试某种条件并根据测试结果返回一个代码来表示当前函数的执行状态。int myFunction(){ if (condition) { return 0; } else { retur...

2019-04-10 10:45:36 312

原创 虚继承

前一节的student示例程序看起来似乎已经解决了问题,但它存在着一些隐患。首先,在TeachingStudent类的introduce()方法里,我们不得不明确的告诉编译器应该使用哪一个属性这对于classes属性来说是应该的,因为教一门课和上一门课有着本质的区别,而作为常识,助教教的课和他学的课不可能一样!但是我们再深入考虑下,既然在TeachingStudent对象里可以继承两个...

2019-04-09 07:57:32 105

原创 多继承

多继承(multiple inheritance)可是是面向对象编程技术中心最惹人争议的功能了。这个概念乍看起来很简单,但它可能引起一些难以预料的后果。因此,java和c#等面向对象编程语言大都只支持多继承的最简单的版本。什么时候需要用到多继承?- 只要你遇到的问题无法只用一个“是一个”关系来描述的时候,就是多继承出场的时候- 举个例子:在学校里有老师和学生,他们都是人(...

2019-04-08 22:39:10 1498

原创 重载左移操作符,也就是插入器

因为上节那个重载操作符课后练习的代码里面要多次调用print方法才能实现分数打印,所以改进一下这里通过重载<<操作符来实现print打印分数的功能(<<官方叫插入器)下面是一个operator<<()函数的原型:- std::ostream& operator<<(std::ostream& os, Rational...

2019-04-08 20:48:59 136

原创 运算符重载课后练习

重载运算符“+”,“-”,“*”,“/”实现有理数的加减乘除运算,如1/8 + 7/8 = 1,1/8 - 7/8 = -6/8,1/8 * 7/8 = 7/64,1/8 / 7/8 = 1/7,首先是自己写的,也实现了这个功能,但是限制很多,不好。#include <iostream>class Rational{public: Rational(); Ration...

2019-04-08 20:04:21 377

原创 运算符重载

所谓重载,就是重新赋予新的含义。函数重载是对一个已有的函数赋予新的含义,使之实现新功能。其实运算符也可以重载,实际上,我们常常在不知不觉之中使用了运算符重载。运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。重载运算符的函数一般格式如下:函...

2019-04-02 18:14:15 1910

原创 抽象方法和多态性

抽象方法(abstract method),也可以称为纯虚函数,是面向对象编程技术的另一个核心概念,在设计一个多层次的类继承关系时市场会用到。把某个方法声明为一个抽象方法等于告诉编译器这个方法必不可少,但我现在(在这个基类里)还不能为它提供一个实现!上一个例子里有一个Pet::play(),在当时把每一个都输,但是在现实中不存在什么都玩的宠物,每种宠物都有自己的玩法,而我们的应对措施是输出...

2019-03-31 23:05:51 246

原创 虚方法以及new和delete讲解

先通过一个简单的例子引发的问题来探究虚方法的作用以及完整的解决方案。下面先讲解一下new和delete的作用。new和delete以前我们的做法是:创建一个变量,再把这个变量的地址赋值给一个指针。然后我们就可以利用指针来访问这个变量的值了。事实上,在C和C++中我们完全可以在没有创建变量的情况下为有关数据分配内存,也就是直接创建一个指针并让它指向新分配的内存块,用法如下:#i...

2019-03-31 20:52:58 226

原创 静态属性和静态方法2以及this指针的又一些说明

关于静态的一些说明:- 静态成员是所有对象共享的,所以不能在静态方法里面访问非静态元素- 非静态方法可以访问类的静态成员,也可以访问类的非静态成员。C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区回顾下:this指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象的地址。- 当一个对象被创建时,该对象的th...

2019-03-31 17:38:47 211

原创 静态属性和静态方法和static的用法

面对对象编程技术的一个重要特征是用一个对象把数据和对数据处理的方法封装在一起。大家还记得,在前面的例子里我们一直是在使用对象(也可以说是某个类的实例)来调用方法,每个方法只处理调用它的那个对象所包含的数据,所有的数据都属于同一个对象。这就引发了一个问题:如果我们所需要的功能或者数据不属于某个特定的对象,而是属于整个类的,该怎么办?我们不妨假设现在需要统计一下有多少只活的动物,那么我们需...

2019-03-29 11:26:24 936

原创 友元关系

在编程中我们通过public,protected和private这些访问级别可以让程序员控制谁有权使用某个类里的某个方法和属性。这个强大的方案可以把代码的实现细节隐藏起来,不让没有相应权限的其他代码访问到。可是在某些场合,一个完全无关的类由于某些特殊原因需要访问到某个protected成员,甚至某个private成员,那该怎么办呢?有些朋友可能会说,那就把所有的东西都声明为public吧。...

2019-03-28 00:55:36 1758 1

原创 覆盖方法和重载方法

通过之前的学习,我们已经知道了如果通过创建新的子类来重用现有的代码(继承)。虽然这个方案可以让我们轻松解决许多现实世界里的问题,但在某些场合,却又显得不够用。例如当我们需要在基类里提供一个通用的函数,但在它的某个子类需要修改这个方法的实现,在C++,覆盖(overriding)就可以做到。回到之前的例子,我们都知道,但凡是个动物都知道吃,那么吃就可以说是动物的一个共同特征,但是我们知道...

2019-03-27 22:26:59 232

原创 访问控制

在此前的例子里,我们无论是Animal,Pig和Turtle类里的所有成员都是用public:语句声明。所谓访问控制,就是C++提供了一种用来保护类里的方法和属性的手段这里所说的保护的意思是对谁可以调用某个方法和访问某个属性加上一个限制。如果某个对象试图调用一个它无权访问的函数,编译器将报错。我们看下C++的访问级别: 级别 ...

2019-03-26 16:03:17 228

原创 继承机制中的构造器和析构器

正如前面所说的,C++支持程序员自己写出将创建或销毁一个对象时自动调用的方法,也就是构造器和析构器。在没有继承机制的情况下,我们很容易理解这些方法在创建或销毁一个对象的时候被调用。但是一旦使用了继承机制,构造器和析构器就变得有点复杂了。比如基类有个构造器,如Animal(),它将在创造Pig类型的对象时最先被调用,如果Pig类也有一个构造器,它将排在第二个被调用。因此基类必须在子类之前初始...

2019-03-26 15:16:02 151

原创 this指针和类的继承

在对象的世界里,有一个特殊的指针,它叫做this。我们从来没有见过它,但是它却从来都存在。我们通过一个典型的例子来认识它:class Human{public: char fihc; Human(char fishc);};Human::Human(char fishc){ fishc = fishc;}我们看到,在“fishc = fishc”之前,所有的语法都没有...

2019-03-26 13:22:26 333

原创 构造器和析构器讲解

构造器构造器是类里的一种特殊的方法。它和通常方法的主要区别:- 构造器的名字必须和它所在的类的名字一样- 系统在创建每个类的实例时会第一时间自动调用 这个类的构造器- 构造器永远不会返回任何值创建构造器,需要先把它的声明添加到类里:class Car{ Car(void);};在结束声明之后开始定义构造器本身:Car::Car(void) //不用写...

2019-03-25 16:00:34 600

原创 对象,类

对象的本质不过是一种新的数据类型我们从一个类说起,首先类是一个模型。当我们为这个类创建实例的时候,也就是对象本身。这和前面所讲的定义和使用结构的过程很相似,不同的是对象的内部可以有变量和函数,而结构通常只由各种变量构成。因此我们首先需要知道的一件事情是如何编写一个简单对象的模型-类类类(class)就像是一幅蓝图,它决定一个对象将是什么样子(具有什么样的属性、功能)。所以OOP...

2019-03-22 22:49:39 126

原创 联合、枚举和类型别名

联合联合与结构与很多相似之处,联合也可以容纳多重不同类型的值,但是它每次只能存储这些值中的某一个。例如:我们要定义一个变量来存放某种密码,我们可以选择时你女朋友的生日、身份证后4后数字或者你养的宠物的名字等等。union mima{ unsigned long birthday; unsigned short ssn; char *pet;};定义了这个联合类型后,就...

2019-03-22 20:00:58 169

原创 传值、传址和传引用

在编写个人函数的时候,你将受到C++中一条基本原则的限制:在默认的情况下,参数只能以值传递的方式给函数。这句话的理解是:被传递到函数的只是变量的值,永远不会是变量本身。例如:#include <iostream>using namespace std;void changeAge(int age, int newage);int main(){ int ag...

2019-03-22 16:49:29 235

空空如也

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

TA关注的人

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