c++
xiaodu655
这个作者很懒,什么都没留下…
展开
-
解析C语言结构体,位段。
1.结构的定义 聚合数据类型能够同时存储超过一个的单独数据。c语言提供了两种类型的聚合数据类型,数组与结构。数组是相同类型元素的集合,它的每个元素是通过下标引用或指针间接访问来选择的。结构也是一些值的集合,这些值成为它的成员,但一个结构的各个成员可能具有不同的类型。每个结构成员都有自己的名字,它们是通过名字访问的。结构并不是一个它自身成员的数组。和数组名不同,当一个结构变量在表达式中使原创 2017-07-09 15:21:39 · 429 阅读 · 0 评论 -
static关键字
1.作为静态全局变量: a.静态变量(包括静态全局变量和静态局部变量)在全局数据区分配内存。 b.静态变量只被初始化一次。 c.未经初始化的静态全局变量会被自动初始化为0或空格 d.静态全局变量在声明它的整个文件中是可见的,而在文件之外不可见,即其他文件可以定义相同名称的变量。 2.作为静态局部变量 a.该变量在全局数据区分配内存。 b.静态局部变量在执行到该对象的声明处时被首次初始...原创 2018-07-22 11:13:29 · 129 阅读 · 0 评论 -
动态内存管理。
C++中通过new和delete运算符进行动态内存管理。 int *p1=new int; int *p2=new int(3);//3将其初始化为3 int *p3=new int[3]//3表示对象个数。 delete p1; delete p2; delete [] p3;malloc/free与new/delete的区别: ·malloc/free是C/C++标准库的函...原创 2018-07-22 11:16:22 · 141 阅读 · 0 评论 -
什么是内存泄漏,如何进行检测内存泄漏
内存泄漏:由于疏忽或者错误造成程序未能释放已经不再使用的情况,内存泄漏并不是指内存在物理上的错误消失,而是程序分配某段内存后,由于设计错误,丢失了对这段内存的控制,因而造成了内存浪费。如何进行内存泄漏的检测 检测内存泄漏的方法: 1.使用调试器和C运行库(CRT)调试堆函数。 具体函数:_CrtSetDbgFlag()可以在作用于结束位置,自动调用_CrtDumpMe...原创 2018-07-22 11:24:38 · 3738 阅读 · 0 评论 -
智能指针auto_ptr的实现
auto_ptr实现原理是资源管理权的转移,即是说构造函数创建对象时获得资源管理权,析构对象时撤销管理权,这样的管理权的转移,带来的最重要的缺点就是安全性问题,下面具体阐述一下新旧版本的auto_ptr方便理解。 模拟实现旧版本的auto_ptr: 旧版本的auto_ptr是多定义了一个成员对象_symbol来标识该成员对象的资源管理权,在调用构造函数创建对象时获得资源管理权,即_symbol...原创 2018-08-03 18:43:27 · 186 阅读 · 0 评论 -
宏与内联函数的区别
宏与内联函数的区别: 1. 宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。 内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、 switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。宏定义是在预...原创 2018-08-03 19:15:12 · 208 阅读 · 0 评论 -
普通版本的顺序表
什么是Vector? vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。vector的扩充机制:按照容器现在容量的一倍进行增长。vecto...原创 2018-08-04 12:03:18 · 197 阅读 · 0 评论 -
双向循环链表(c++)
#include<iostream>using namespace std;struct ListNode{ ListNode() :_data(0) ,_prev(0) , _next(0) {} ListNode( const int data) :_data(data) , _prev(0) , _ne...原创 2018-08-06 10:42:13 · 471 阅读 · 0 评论 -
动态内存与智能指针
在c++中使用new、delete或new[]、delete[]来申请、释放内存,但是有时候会忘记释放,为了更容易、安全地使用动态内存,新的标准库提出了智能指针:智能指针也是模板,auto_ptr、shared_ptr、scoped_ptr、weak_ptr、unique_ptr(c++11提出的) .默认初始化的智能指针中保存一个空指针。解引用一个智能指针返回它指向的对象。如果在一个条件判断中...原创 2018-08-01 17:04:09 · 122 阅读 · 0 评论 -
浅谈指针与引用
指针:故名思义为指向一块空间的地址。它里面存储的数值被解释成为内存里的一个地址。所以,指针也叫地址。 1.指针的类型:只要将指针声明语句中的指针名字去掉,剩下的即为指针的类型。 下面来进行依次查看。(1)、int *p; //指针类型为int*(2)、char*p;.//指针类型为char*(3)、int**p;//指针类型为int**(4)、int (*p)[5]; 指针类型...原创 2018-08-19 15:45:41 · 114 阅读 · 0 评论 -
C++函数模板的分离编译
1.分离编译模式: 一个程序由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有的目标文件链接起来形成但一个可执行文件的过程称为分离编译模式。 但是这种分离编译在C++中是不支持的。 2.使用模板在链接时会出错。如下: 下面的程序由三个文件组成:func.h用来对函数模板进行声明,func.cpp用来定义函数模板,main.cpp包含func.h头文件并...原创 2018-08-21 16:39:18 · 622 阅读 · 0 评论 -
智能指针(shared_ptr的实现)
1.实现原理:shared_ptr是利用一个计数器,无论我们使用拷贝构造函数、赋值运算符重载、作为函数返回值、或作为参数传给一个参数时计数器+1,当shared_ptr被赋予一个新值或者需要销毁时,计数器–,直到计数器为0时,调用析构函数,释放对象,并销毁其内存。shaerd_ptr不直接支持管理动态数组,如果希望使用shared_ptr管理一个动态数组,必须定制自己的删除器。class Sh...原创 2019-01-04 15:48:03 · 9821 阅读 · 2 评论 -
智能指针(scoped_ptr的实现)
1.实现原理:它的实现原理是为了防止对象拷贝和赋值,它与auto_ptr的共同之处是scoped_ptr和auto_ptr都是利用一个栈上的对象去管理一个堆上的对象,从而使得堆上的对象随着栈上对象的销毁自动删除。但是,其不可以将指针所有权转让,只能在作用域内使用。这也就意味着他不能作为函数的返回值,不能共享所有权同时它也不能管理数组对象,它是通过delete来删除对象的。2.为什么要将拷贝构...原创 2019-01-04 15:50:34 · 450 阅读 · 0 评论 -
(重要)静态成员:
(重要)静态成员: 类的静态成员:声明为static的类成员(成员数据或成员函数)称为类的静态成员。 类静态成员(成员函数)可用类名::静态成员(成员函数)或者对象.静态成员(成员函数)来访问。表示其为类方法。 类静态成员变量必须在类外定义,定义时不加static. 类的静态成员函数没有默认的this指针,因此它里面不能使用任何非静态成员。 ...原创 2018-07-18 16:35:47 · 323 阅读 · 0 评论 -
用模板类迭代器实现顺序表
之前我用模板类实现了顺序表,但是发现如遇到字符串的还是得重新重载字符串,但是在使用迭代器之后,则可以将顺序表中的东西一一遍历一次。原创 2017-11-04 12:14:22 · 299 阅读 · 0 评论 -
模板类实现顺序表
前面已经实现过顺序表的一些基本功能,现在利用模板再来实现一次顺序表。通过模板实现顺序表更方便,实例化时可以自动转化成用户需要的类型。具体的实现如下所示: 图解如下://用模板类实现顺序表//用模板类实现顺序表#define _CRT_SECURE_NO_WARNINGS 1#include<iostream> #include<assert.h>#include<string.h>原创 2017-10-21 20:25:58 · 540 阅读 · 0 评论 -
日期类的实现
//完善日期类,需要辅助操作可自行添加。#include<iostream>using namespace std;class Date{public: Date(int year = 2017, int month = 9, int day = 10) : _year(year) , _month(month) , _day(day原创 2017-09-25 22:39:56 · 178 阅读 · 0 评论 -
修改后的日期类
之前的一篇没有考虑如果超过一个月天数的情况,现做以调整://完善日期类,需要辅助操作可自行添加。#include<iostream>using namespace std;class Date{public: Date(int year = 2017, int month = 9, int day = 10) : _year(year) , _mon原创 2017-09-27 13:05:16 · 172 阅读 · 0 评论 -
浅析浅拷贝与深拷贝
一、浅拷贝: 浅拷贝就是成员数据之间的赋值,把值赋给要拷贝的。即在对象复制时,只是对对象中的数据成员进行简单的赋值,所以会导致多个对象共用一块内存空间,当一个对象将这块内存释放掉之后,另外对象并不知道空间已经还给了系统,所以会在对这段内存空间进行访问时出现访问违规。 如下例子:class String{public: String(const char*str = "") //构造函原创 2017-10-01 21:03:30 · 198 阅读 · 0 评论 -
继承的相关知识
1、 继承的概念:继承是面向对象程序设计使代码可以重复用的最重要的手段,其也是c++的一大特性。程序员在保持原有类特性的基础性上进行扩展,增加功能,产生新的类,称为派生类。被继承的类称为父类或基类。原创 2017-10-11 01:30:20 · 233 阅读 · 0 评论 -
函数的调用过程、栈帧的创建以及销毁
函数的调用过程、栈帧的创建、销毁原创 2017-11-06 23:16:12 · 251 阅读 · 0 评论 -
用模板编写冒泡排序
之前我们所写的冒泡排序是只能对数按升序或降序排列,现在我们用模板类来对冒泡函数进行扩展,使其同时实现升序和降序排列。原创 2017-10-29 20:56:00 · 520 阅读 · 0 评论 -
多态的相关知识
1.多态:多种形式或形态的情形。 2.多态的分类:<1>.静态多态:发生在编译阶段->函数重载、泛型编程。 <2>.动态多态:程序运行时。动态多态实现的两个条件:a.调原创 2017-10-14 22:06:54 · 221 阅读 · 0 评论 -
模板和泛型编程的相关知识(函数模板)
上篇博客中讲述了多态的相关知识,其中静态多态有两种:函数重载和泛型编程。函数重载在博客中已经解释过,接下来看看泛型编程的相关知识。 泛型编程:编写与类型无关的逻辑代码,是代码复用的一种手段,而模板就是泛型编程的基础。 模板:模板分为函数模板和类模板。原创 2017-10-16 20:45:18 · 231 阅读 · 0 评论 -
c++实现顺序表
c++中用类实现顺序表原创 2017-10-10 23:51:35 · 338 阅读 · 0 评论 -
写时拷贝
上篇博客浅谈了浅拷贝与深拷贝,说明了浅拷贝存在的问题,下面就针对浅拷贝存在的问题给出了以下的解决方案—-引用计数。原创 2017-10-02 18:47:46 · 220 阅读 · 0 评论 -
类的六个默认成员函数
类的六个默认成员函数: 1.构造函数 2.拷贝构造函数 3.析构函数 4.赋值操作符重载 5.取地址操作符重载 6.const修饰的取地址操作符重载构造函数:是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,在对象的生命周期内只且只调用一次,以保证每个数据成员都有一个合适的初始值。 公有成员函数,仅在定义对象时自动执行一次。 特点: 1.函数名与类名相原创 2017-09-22 08:49:12 · 308 阅读 · 0 评论 -
利用模板类迭代器实现链表
//#pragma once#include <iostream>using namespace std;template<class T>struct ListNode{ ListNode(const T& data = T()) : _pPre(0) , _pNext(0) , _data(data) {} ListNode<T>* _pP原创 2017-11-14 00:26:31 · 296 阅读 · 0 评论 -
智能指针(auto_ptr的实现)
旧版的auto_ptr既然要控制资源的转移,我们可以多定义一个成员对象_owner来标识该成员对象的资源管理权,在调用构造函数创建对象时赋予其资源管理权,即_owner置为true,在调用拷贝构造函数、赋值运算符的时候将其管理权释放,即_owner置为false,就起到了资源管理权的转移#include<iostream>using namespace std;template...原创 2019-01-04 15:54:10 · 251 阅读 · 1 评论