C++__学习之路
文章平均质量分 55
程人之美
这个作者很懒,什么都没留下…
展开
-
windows读取文件夹下所有的文件——C++
intptr_t hFile = 0; struct _finddata_t fileInfo; std::string pathName, exdName; if ((hFile = _findfirst(pathName.assign(path).append("\\*").c_str(), &fil原创 2017-05-11 09:36:15 · 1099 阅读 · 0 评论 -
atoi函数源代码
atoi函数源代码isspace(int x){ if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r') return 1; else return 0;}isdigit(int x){ if(x<='9'&&x>='0') return 1; else return 0;}int转载 2017-03-06 00:36:38 · 956 阅读 · 0 评论 -
malloc()函数和free()函数源代码
虽然malloc()函数和free()函数是C语言中最常用的函数之一,但是可能大多数人只是用它,却没有去查看它的原型。记得有一次听一个学长说他去面试,面试官让他写出malloc()函数的原型,他当时不知所措就悲剧了。今天看了一篇文章,给出了malloc()函数的源代码,特转载于此与大家共享。原文地址:http://blog.sina.com.cn/s/blog_642bb6110100k144.h转载 2017-03-05 23:56:50 · 1404 阅读 · 0 评论 -
C++ 智能指针详解
C++ 智能指针详解 一、简介由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、bo转载 2017-03-18 21:58:51 · 451 阅读 · 0 评论 -
C++-多态性
多态性是面向对象程序设计语言的又一重要特性,是指不同对象接收到同一消息时会产生不同的行为。继承处理的是类与类之间的层次关系,多态则是处理类的层次结构之间以及同一个类内部同名函数的关系。简单说,多态就是在同一个类或继承体系结构的基类与派生类中,用同名函数来实现不同的功能。1、静态绑定和动态绑定多态(Polymorphism)就是指不同对象收到相同消息时会执行不同的操作。也就是用一个相同名称定义许多不同原创 2017-02-25 22:46:29 · 441 阅读 · 0 评论 -
关于typedef的用法总结
在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多。typedef与#define有些相似,其实是不同的,特别是在一些复杂的用法上,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,加上自己的一个分析。基本定义:typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数转载 2017-03-18 11:44:03 · 276 阅读 · 0 评论 -
C++-继承:基类与派生类对象的关系&&继承与组合
1、基类与派生类对象的关系在继承方式下,派生类获得了基类成员的一份拷贝,这份拷贝构成了派生类对象内部的一个基类子对象。也就是说,在派生类对象中存在一个基类子对象。因为这个原因,基类对象与派生类对象之间存在赋值相容性。赋值相容是指在公有派生方式下,凡是需要基类对象的地方都可以使用派生类对象基类对象能够解决的问题,用派生类对象也能够解决,有以下几种情况:1、把派生类对象赋值给基类对象 2、把派生类对象原创 2017-02-25 19:50:57 · 1414 阅读 · 0 评论 -
C++-继承:多重继承 && 虚拟继承
1、多重继承1.1、多重继承的概念单一继承&多重继承1.2、多重继承方式下成员名的二义性在多继承下,派生类继承了多个基类的成员,当两个不同基类拥有同名成员时,容易产生命名冲突的问题。使用类域限定符明确指出调用函数所属的基类,如m.A::f()。1.3、多重继承的构造函数和析构函数派生类必须为每个基类的构造函数提供初始化参数,构造函数的调用次序是先基类,再对象成员,最后才是派生类的构造函数。基类构造函原创 2017-02-25 14:57:27 · 567 阅读 · 0 评论 -
C++-继承:构造函数和析构函数
如果基类有多个构造函数,并且所有构造函数都有参数,派生类构造函数就必须显式的调用其中的某一个,已完成基类对象的初始化1、派生类构造函数、析构函数的定义和调用次序派生类可能有多个基类,也可能包括多个对象成员。在创建派生类对象时,派生类的构造函数除了要负责本类成员的初始化外,还要调用基类和对象成员的构造函数,并向他们传递参数,已完成基类子对象和对象成员的建立和初始化。派生类只能采用构造函数初始化列表的方原创 2017-02-23 19:25:12 · 710 阅读 · 0 评论 -
C++-继承:基类与派生类的关系
成员函数的重定义和名字隐藏基类的数据成员和成员函数在派生类中都有一份拷贝,派生类能够直接访问从基类继承而来的public和protected成员,且只能够通过这两类成员访问从基类继承而来的private成员。派生类不仅可以添加基类没有的新成员,而且可以对基类的成员函数进行重定义或重载。重定义是指派生类可以定义与基类具有相同函数原型的成员函数(相同的返回类型、函数名、参数表),而重载则要求成员函数具有原创 2017-02-23 18:29:09 · 7113 阅读 · 0 评论 -
C++-继承的概念与方式
继承UML(Unified Modeling Language),统一建模语言。 派生类可以: 1、继承基类的数据成员和成员函数。 2、增加新的数据成员和成员函数。 3、重载基类的成员函数。 4、重定义基类已有的成员函数。 5、改变基类成员在派生类中的访问属性。不可以继承: 1、基类的构造函数和析构函数。 2、基类的友元函数。 3、静态数据成员和静态成员函数。protected和继原创 2017-02-23 15:01:49 · 421 阅读 · 0 评论 -
前序中序后序遍历——递归与非递归实现
二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说转载 2017-03-09 16:18:26 · 345 阅读 · 0 评论 -
C++中的static关键字
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:#include<iostream>using names转载 2017-03-06 15:02:06 · 338 阅读 · 0 评论 -
类中const函数及非const函数的调用规则
类中const函数及非const函数的调用规则class Student { public: int getAge() { return m_age; }int getAge() const{ return m_age;}void setAge(int age){ m_age = age;}void setAge(int a转载 2017-03-09 19:40:11 · 719 阅读 · 1 评论 -
C++学习之Pair
Pair类型概述pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair<int, string> a;表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。 pair<string, string> a(“James”, “Joy”);也可以像上面一样在转载 2017-03-17 00:22:04 · 246 阅读 · 0 评论 -
STL sort函数--对map按值排序
问题:要对以map中的数据进行按value排序难点:map中的数据是按照key排序的,用for循环进行迭代器输出的顺序,就是按照key排序的顺序。但是按value排序就不可能了。方案:STL中的sort函数原型:#include <algorithm>using namespace std;template <class RandomAccessIterator> void sort转载 2017-03-17 00:23:02 · 1081 阅读 · 0 评论 -
虚函数的构造析构顺序
#include <iostream>using namespace std;class A { public: A() { cout << "A()" << endl; } virtual void vt() { cout << "vt A" << endl; }原创 2017-03-30 01:01:34 · 499 阅读 · 0 评论 -
野指针
讨论一什么是野指针? 一个母亲有两个小孩(两个指针),一个在厨房,一个在卧室,(属于不同的代码块,其生存期不同)母亲让在厨房的小孩带一块蛋糕(指针指向的对象)给在卧室的小孩,这样在卧室的孩子才肯写作业。但这个在厨房的小孩比较淘气,他在走出厨房时自己将蛋糕吃了,没能带出来。而在卧室的没有吃到蛋糕,所以不肯完成他的作业。结果母亲却不知道卧室的孩子没有吃到蛋糕,还以为作业完了。结果第二天她就被转载 2017-03-14 21:06:27 · 260 阅读 · 0 评论 -
C++11-智能指针和空指针
智能指针如果指针ps有一个析构函数,该析构函数将在ps过期时释放它指向的内存。因此,问题在于它只是一个常规指针,不是有析构函数的类对象。如果它是对象,则可以在对象过期时,让它的析构函数删除指向的内存。 头文件memorystd::shared_ptr ps(newstring);std::shared_ptr ps(newstring("a"));所有的智能指针类都有一个e原创 2017-03-29 21:36:16 · 7074 阅读 · 0 评论 -
C++11-initializer_list
模板initializer_list是C++11新增的,可以使用初始化列表语法将STL容器初始化为一系列值。 vector v {1, 2, 3}; 等价于 vector v({1, 2, 3});这是因为容器类现在包含将initializer_list作为参数的构造函数vector v(10);声明一个10个元素的vector,未初始化。 vector v({10});声明一个元素,初始化原创 2017-03-29 22:17:42 · 693 阅读 · 0 评论 -
C++11-基于范围的for循环
基于范围的for循环是为用于STL而设计的。 double prices[5] = {1.1, 2.2, 3.3, 4.4, 5.5}; for (double x : prices) cout << x << endl; 使用引用就可修改 for (double &x : prices) x = 2 * x;另外,vector books; for (auto x :原创 2017-03-29 21:56:12 · 507 阅读 · 0 评论 -
栈,堆,全局,文字常量,代码区总结
一. 区域划分堆: 是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe的。每个C ++转载 2017-03-12 21:21:07 · 517 阅读 · 0 评论 -
STL中set的insert操作的返回值
#include <iostream>#include <set>using namespace std;int main() { set<int> s; s.insert(1); //返回值为pair<set<int>::iterator, bool> //迭代器表示该元素的位置 cout << *s.insert(1).first << endl;原创 2017-03-21 19:44:49 · 13401 阅读 · 0 评论 -
使用数组作为参数传递
如果一个函数以一维数组为参数,我们可以这样声明这个函数void func(int* a) ;void func(int a[]) ;void func(int a[3]) ;实际上,这三种形式是等价的,在使用数组做参数时,编译器会自动将数组名转换为指向数组第一个元素的指针,为什么呢?这要从参数的传递方式说起,参数有三种传递方式,按值传递,按指针传递,按引用传递,分别如下void T转载 2017-03-11 23:17:28 · 1057 阅读 · 0 评论 -
C++-友元(friend)
类的封装性具有信息隐藏的能力,它使外部函数只能通过类的public成员函数才能访问类的private成员,但如果要多次访问,不仅操作麻烦,而且时间空间的开销大。友元机制允许一个类授权其他函数直接访问类的private和protected成员。友元包括友元函数,友元类,友元成员函数,最常用的就是友元函数。 class X { … friend T f(…) … };原创 2017-02-22 21:19:08 · 413 阅读 · 0 评论 -
C++-类对象成员&&对象数组
#include <iostream>using namespace std;class stuid { int id; public: stuid(int i = 0) { //id = i; cout << "in stuid : " << i << endl; } stuid()原创 2017-02-22 20:38:45 · 4325 阅读 · 0 评论 -
C++中的private protected public区别
当private,public,protected单纯的作为一个类中的成员权限设置时:private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问. protected: 可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问 public: 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问注:友元函数包括两种:设为友元转载 2016-10-27 22:15:46 · 289 阅读 · 0 评论 -
C++-正确使用memset
前段项目中发现一个问题,程序总是在某个dynamic_cast进行动态转换时出异常,查了半天才发现问题原来是出在memset的使用上,虽然问题本身显而易见,但当处于几十万行代码量级中时,就变得不太那么容易定位了。本文归纳了下使用memset几个需要注意的地方,虽然内容很简单,但也希望对大家有所帮助。1. memset是以字节为单位,初始化内存块。当初始化一个字节单位的数组时,可以用memset把转载 2016-10-27 16:30:02 · 3309 阅读 · 0 评论 -
C++ #include—尖括号和双引号的区别
这两种写法都是正确的写法,但是它们却是有区别的。我们知道C++已经有一些编写好的头文件(比如标准函数库等等),它们存放在VC++的Include文件夹里。当我们使用#include 命令时,编译器就到这个文件夹里去找对应的文件。显然,用这种写法去包含一个我们自己编写的头文件(不在那个Include文件夹里)就会出错了。所以包含C++提供的头文件时,应该使用尖括号。相反地,#include "文转载 2016-11-05 23:06:59 · 945 阅读 · 0 评论 -
C++11新特性——auto的使用
C++11中引入的auto主要有两种用途:自动类型推断和返回值占位。auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除。前后两个标准的auto,完全是两个概念。1. 自动类型推断 auto自动类型推断,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推断,可以大大简化我们的编程工作。下面是一些使用auto的例子。#include <ve转载 2016-10-21 23:41:59 · 331 阅读 · 0 评论 -
Lesson 7:简单的文件输入和输出
使用cin进行输入时,程序将输入视为一系列的字节,其中每个字节都被解释为字符编码。不管目标数据类型是什么,输入一开始都是字符数据,即文本数据。然后,cin对象负责将文本转换为其他类型。控制台输入的文件版本是文本文件,即每个字节都存储了一个字符编码的文件。并非所有的文件都是文本文件。 一、写入到文本文件中 下面来进行一个对比: 将cout原创 2016-07-16 15:40:39 · 418 阅读 · 0 评论 -
Lesson 4:指针和自由存储空间
指针是最重要的知识点之一,它容易让人出错,学好指针并且用好指针是每个人学编程的人应该掌握的。个人看来,当系统的学了计算机组成原理、操作系统等基础教材之后,才能对指针,地址这些抽象概念有一个更好的理解。这里先补充一个问题,所有的编程语言都是有指针的,但是由于使用指针容易造成内存泄露等问题,所以像java这些高级语言都是把指针隐藏了,没让程序员直接接触到指针,然而像C和C++就直接把指针开放给程序员来原创 2016-07-07 16:17:42 · 564 阅读 · 0 评论 -
Lesson 3:复合类型
在计算机的内存中,储存空间是一个地址连续的块,创建一个数组也就是分配一块连续的存储空间,因此数组有一个很明显的有点,就是访问的速度快,不像其他的数据结构需要花费一个遍历的时间。打个比方,假如你需要到一栋高楼里去找一个人,但是他没告诉你住在几楼,那么你需要从一楼开始往上敲门,直到找到为止;但是如果你知道他住在几楼,那么你就可以直接找到他,跟数组中的下标一样,可以直接定位到目原创 2016-07-04 11:12:35 · 482 阅读 · 0 评论 -
Lesson 2:基本数据类型
在学习数据类型之前,需要了解一个基础知识,计算机的内存由位(bit)组成,每一位都表示一个二进制数0或1。在存储单位中,1GB = 2^10MB = 2^20KB = 2^30Byte = 2^33bit。原创 2016-07-03 14:25:53 · 450 阅读 · 0 评论 -
Lesson 1:进入C++
C++是我学习的第一门编程语言,了解的语言多了之后,不免相互之间会产生混淆。近日趁着假期,特对学习经历做一个完整的回顾和知识梳理,同时这也是对自己的查缺补漏,增强自己的编码能力。我用的教材是《C++ Primer Plus》中文第6版,这本书讲解详细,而且易于理解,我的所有总结都是基于这本书上对应章节的学习指导。原创 2016-06-30 14:02:10 · 508 阅读 · 0 评论 -
Lesson 6:分支语句和逻辑运算符
一、if判断语句if (test-condition1) statement1else if (test-condition2) statement2else statement3 在这里,判断条件也会被强制转换为bool值,也就是0会被转换为false,非0会被转换为true。if-else可以成对使用,也可以只使用if语句。原创 2016-07-13 13:55:15 · 512 阅读 · 0 评论 -
C++ - const常量与指针和引用之间的关系
const常量1、const常量必须在定义的时候初始化,且不能修改。 2、const常量的默认类型为int类型。 3、#define是一个预处理器编译指令。该编译指令告诉预处理器,在程序中来查找并替换,修改后的程序将在这些变量的值替换后被编译。#define采用宏代换方式进行常量的处理,不具有类型检查机制,存在不安全性。const与指针const对象的地址只能赋给指向const对象的指针; 指原创 2016-11-15 23:36:33 · 1548 阅读 · 0 评论 -
C++ -四种类型转换方式
C语言类型转换在C语言里用到的类型转换方式,一般都是用强制类型转换,语法:(类型说明符)(表达式),例如: (float)a 把a转换为实型,(int)(x+y) 把x+y的结果转换为整型。C语言这种赋值时的类型转换形式可能会使人感到不精密和不严格,因为不管表达式的值怎样,系统都自动将其转为赋值运算符左部变量的类型。C++类型转换const_cast,字面上理解就是去const属性。static转载 2016-11-15 23:56:05 · 734 阅读 · 0 评论 -
C++-指针与void*指针
指针简单理解,指针代表了两个变量:一个是指针变量本身,另一个是它所指向的变量。对于int *p;这句话可以认为定义了两个变量p和*p,p是一个地址变量,只能存放整型变量在内存中的地址;*p是一个整形变量,只能存放一个整数。指针与0和void*没有任何变量会被分配到地址0,所以0就可以作为一个指针常量,与NULL的含义相同,表明指针当时没有指向任何变量,所以令p = 0这个赋值语句是正确的。指针具有两原创 2016-11-15 00:04:08 · 784 阅读 · 0 评论 -
C++-this指针
1、this指针的概念类的每个对象都有自己的数据成员,有多少个对象,就有多少份数据成员的拷贝。然而类的成员函数只有一份拷贝,不论多少个对象,都共用这份成员函数。运行时,成员函数怎么知道哪个对象在调用它?this指针是用于标识一个对象自引用的隐式指针,代表对象自身的地址。在编译类成员函数的时候,C++编译器会自动将this指针添加到成员函数的参数表中。在调用类的成员函数时,调用对象会把自己的地址通过t原创 2017-02-21 22:21:47 · 269 阅读 · 0 评论