C++
逐鹿之城
闷头做技术是学而不思则惘,整天瞎扯淡是思而不学则怠
展开
-
图的存储表示--邻接表实现
一.序 邻接表是邻接矩阵的改进。当图中的边数少于顶点个数时,邻接矩阵中会出现大量的零元素,如果这些零元素,将消耗大量的内存。为此,可以把邻接矩阵的n行改为n个链表,把同一个顶点出发的边链接到同一个称之为边链表的单链表中,单链表的每个结点代表一条边,叫做边结点,结点中保存有与该边相关联的另一顶点的顶点下标dest和指向同一链表中下一边结点的指针link.如果带权图时,结点中还要保存改边上的权值cos原创 2017-02-16 14:07:36 · 776 阅读 · 1 评论 -
C++隐藏规则再分析
一.序言 前面一篇区分了重载/覆盖/隐藏,那么这一篇先给一个magic的例子。原创 2017-03-14 21:54:07 · 390 阅读 · 0 评论 -
C++之多态的原理及其分析
文档下载(含图) 分析: 一.序言 C++ 中的虚函数的作用主要是实现了多态的机制。关于多态,说白了就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数(当然引用也可以达到该目的,引用也是指针的另一种变种)。这种技 术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚 函数技术原创 2017-03-14 18:17:55 · 3283 阅读 · 2 评论 -
C++重载的原理及其分析
函数的重载 1.为什么C++加入重载这一特性: (1)提高易用性 (2)类的构造函数需要重载 2.满足重载的条件: 参数列表不同,作用域相同。 (1)仅仅使用返回值来区分函数是否重载,是不准确的。例如...int fun(int a){}float fun(int a){}//g++编译器根本不允许这样做,直接编译不通过。产生歧义,又对fun函数进行了新的声明,两种错误...原创 2017-03-14 13:39:11 · 356 阅读 · 0 评论 -
C++中虚析构函数的作用及其原理分析
参考http://blog.csdn.net/xiamentingtao/article/details/55517203 C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数的作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内原创 2017-03-15 00:13:04 · 54411 阅读 · 21 评论 -
用C++实现split/startswith/endswith/trim
一.split函数1.python演示 2.C++函数原型vector<string> split(const string& srcstr, const string& delimeter = ";");//split the string by delimeter3.实现思路 用delimeter分割符将字符串srcstr分割开,结果保存到向量中,默认的分割符为”;”。思路是, (1原创 2017-04-28 11:28:08 · 7768 阅读 · 1 评论 -
C++string类常用函数总结
string类的构造函数:string(const char *s); //用c字符串s初始化string(int n,char c); //用n个字符c初始化此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。当构造的string太长而无法表达时会抛出length_error异常string类的字符操作转载 2017-04-18 11:18:57 · 345 阅读 · 0 评论 -
std::string::substr
string substr (size_t pos = 0, size_t len = npos) const;Generate substringReturns a newly constructed string object with its value initialized to a copy of a substring of this object.The substring is t转载 2017-04-19 11:10:26 · 5121 阅读 · 0 评论 -
C++的四个类型转换符dynamic_cast/const_cast/static_cast/reinterpret_cast
为了避免强制类型的转换的松散,更严格地限制允许的强制类型转换,C++补充了四个类型转换符dynamic_cast关于这四个类型转换符,笔者亲历,网上没有一个说的明白的,建议阅读《C++ primer plus》第6版 P650原创 2017-05-02 16:35:44 · 414 阅读 · 2 评论 -
C++中ifstream/ofstream/fstream浅谈
C++ 通过以下几个类支持文件的输入输出:ofstream: 写操作(输出)的文件类 (由ostream引申而来)ifstream: 读操作(输入)的文件类(由istream引申而来)fstream: 可同时读写操作的文件类 (由iostream引申而来) 使用ifstream类从文件输入 使用ofstream类输出到文件 使用fstream类进行文件输入和输出 使用时加头文原创 2017-05-04 16:28:59 · 334 阅读 · 0 评论 -
浅谈智能指针auto_ptr/shared_ptr/unique_ptr
一.智能指针1.引入我们通常使用类似new申请一块空间,交由一个指针指向,假如说最后忘记delete,将会造成内存泄露。而智能指针的出现,就是对这种问题的解决方式,智能指针类似指针,却可以用于管理动态分配的内存。本章所解说的是三种智能指针: (1)C++98提出,C++11摒弃的auto_ptr C++11新增的 (2)shared_ptr (3)unique_ptr 在原创 2017-05-23 19:24:08 · 7226 阅读 · 1 评论 -
错误的trim和正确的trim(C++)
trim函数用来去除一个字符串左右两边的空格和制表符err例1–>一个错误的trim函数展示string LaStrUtils::trim(const std::string& str){ string ret; //find the first position of not start with space or '\t' string::size_type pos1原创 2017-04-25 16:13:32 · 2719 阅读 · 0 评论 -
namespace的使用浅谈
如下,两个完全相同的函数fun,在main函数中调用时,要进行区分开由两种方式: 1.加上名字空间域 Myspace::fun()//test1.cpp#include<iostream>namespace Myspace{ void fun() {std::cout<<"This Myspace::fun"<<std::endl;}};namespace Uspace原创 2017-04-26 16:54:06 · 513 阅读 · 0 评论 -
有关虚函数的注意事项浅谈
1.构造函数 构造函数不能是虚函数,这是不符合语法规则的,编译时出错。创建派生类的对象时,将调用派生类的构造函数,而不是基类的构造函数,然后再调用基类的构造函数,这种顺序不同于继承机制,另外派生类不继承基类的构造函数和析构函数。 2.析构函数 析构函数应该声明成虚函数#include<iostream>class Base{ public: Base()原创 2017-04-26 19:49:22 · 521 阅读 · 0 评论 -
C/C++中程序内存区域划分大总结
程序由代码和数据组成,其中代码存储在代码区中,数据根据类型的不同存储在不同的区域中。本文分别介绍了C和C++中内存区域的划分。C++作为一款C语言的升级版本,具有非常强大的功能。它不但能够支持各种程序设计风格,而且还具有C语言的所有功能。我们在这里为大家介绍的是其中一个比较重要的内容,C和C++内存区域的划分。一、 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分转载 2016-03-28 19:24:05 · 9393 阅读 · 9 评论 -
C++笔记(1)explicit构造函数
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class String {String ( const char* p ); // 用C风格的字符串p作为初始化值//…}String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”); 但是有的时候可能会不需要这种隐式转换转载 2017-06-04 17:35:25 · 346 阅读 · 1 评论 -
C++中重载/覆盖/隐藏的区别分析
一.重载与覆盖 1.重载(overload)的特征 (1)作用域必须相同 (2)函数名相同 (3)参数列表不同 (4)virtual关键字可有可无 2.覆盖(override)的特征 覆盖就会牵扯到多态,父类指针指向子类的实例,使父类看起来有“多种状态” (1)作用域不同 (2)函数名相同 (3)参数列表必须相同 (4)父类(基类)必须含有virtual关键字 后面讲到隐藏原创 2017-03-14 21:47:46 · 568 阅读 · 0 评论 -
C++哪些运算符不能重载
转载http://blog.chinaunix.net/uid-20665441-id-305445.html算术运算符:+,-,*,/,%,++,--;位操作运算符:&,|,~,^(位异或),<<(左移),>>(右移)逻辑运算符:!,&&,||;比较运算符:<,>,>=,<=,==,!=;赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;其他运算符:[],(转载 2017-03-22 18:02:44 · 6021 阅读 · 1 评论 -
图的存储表示--邻接矩阵法实现
一.序 图的存储表示有多种,在此我们只研究三种最为常用的存储表示方式:邻接矩阵(adjacency matrices),邻接表(adjacency lists),邻接多重表(adjacency multilists)。今天实现邻接矩阵的存储表示。 二.模型 三.邻接矩阵表示法的缺点 1.时间开销很高 对于邻接矩阵表示的图来说,要确定“图中有多少条边?”,“图是连通的吗?”等问题,就需要原创 2017-02-16 00:24:56 · 1147 阅读 · 0 评论 -
C++初级主题--(6)赋值函数
一.默认赋值函数的一般形式赋值语句其实是对“=”进行重载。 Test& operator=(const Test &t) { cout<<"赋值函数:"<<this<<"="<<&t<<endl; if(this != &t) data = t.data; return *this; }二.详解赋值函数赋原创 2017-02-05 23:20:54 · 748 阅读 · 1 评论 -
C++初级主题--名字空间域和类域
一.序在C++中支持三种域:局部域、名字空间域和类域。二.名字空间域1.名字空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字:namespace ns1{ float a,b,c; fun1(){……} … }花括号括起来的部分称声明块。声明块中可以包括:类、变量(带原创 2017-02-05 18:10:12 · 2379 阅读 · 1 评论 -
C++初级主题--(5)拷贝构造函数
一.概念 同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对象时可用同一类的另一个对象来初始化该对象,这时所用的构造函数称为拷贝构造函数(Copy Constructor)。int main(){ Test t1(10); Test t(t1); //调用拷贝原创 2017-02-05 16:46:51 · 489 阅读 · 1 评论 -
C++初级主题--(4)引用
一.引用的概念 C++函数中参数的传递方式是传值。在函数域中为参数重新分配内存,而把实参的数值传递到新分配的内存中。它的优点是有效避免函数的副作用(即改变实参的值)。 如果要求改变实参的值,怎么办呢?如果实参是一个复杂的对象,重新分配内存会引起程序执行效率大大下降,怎么办呢?在C++中有一种新的导出型数据类型—引用(reference)可以解决上面的难题。引用又称别名(alias)原创 2017-02-04 16:22:48 · 616 阅读 · 3 评论 -
C++初级主题--(3)构造函数的作用
一.序 构造函数有三个作用:构造对象、初始化对象、类型转换 二.Attention 1.构造对象 当调动构造函数时,毫无疑问将会有一个新的对象被构造出来 2.初始化对象与类型转换 问题1:变量给对象赋值可取?#include<iostream>using namespace std;class Test{public: Test(int d = 0) : data(d)原创 2017-02-03 16:55:46 · 712 阅读 · 0 评论 -
C++初级主题--(2)构造函数和析构函数
一.序 C++类的6个默认的成员函数包括:构造函数、析构函数、拷贝构造函数、赋值运算符重载函数、取地址操作符重载函数、const修饰的取地址操作符重载函数。 这篇文章先列出构造函数和析构函数,其他后续更新在其它博文。 二.详解构造函数 1.定义 数据成员多为私有的,要对它们进行初始化,必须用一个公有函数来进行。同时这个函数应该在且仅在定义对象时自动执行一次。称为构造函数(construc原创 2017-02-01 19:13:51 · 450 阅读 · 0 评论 -
C++初级主题--(1)this指针
一.this指针的出现 1.C++中的指针 C和C++指针的最重要的区别在于C++是一种类型要求更强的语言。就void*而言,这一点表现的更突出。C不允许随便的把一个类型的指针赋给另一个类型,但允许通过void*来实现。例如:bird *b;rock *r;void *v;v = r;b = v;由于C的这种功能允许把任何一种类型看作别的类型处理,这就在类型转换系统中留下了一个大的漏洞。原创 2017-02-01 15:12:35 · 501 阅读 · 0 评论 -
给一道关于const的面试题
/*题目:请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变A.const int const *x = &y;B.int * const x = &y;C.const int *x = &y;D.const int * const x = &y;*///正确答案B技巧:(1)const若在*的左边,则是内存中的值不可变(2)const若在*的右边,则是所指向的内存地原创 2016-06-07 22:00:37 · 1407 阅读 · 0 评论 -
main函数参数的用法
main函数中两个参数的用法MSDN6.0中写道: argc is An integer specifying how many arguments are passed to the program from the command line. Because the program name is considered an argument, argc is at least 1.转载 2016-05-19 17:07:24 · 1357 阅读 · 0 评论 -
typedef用法汇总
也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一。若说变量定义是为变量命名,而typedef(或称为类型定义)就是为类型命名。既然都是命名,那就会有很多类似的地方。而变量定义我想大家都会使用,因此类型定义也必然会使用。类型定义的语法可以归结为一句话:只要在变量定义前面加上ty转载 2016-05-07 20:55:18 · 1157 阅读 · 0 评论 -
C++问题小结--3.构造函数与析构函数关于其自身特点的简单代码陈述
#includeusing namespace std;class Test{public: Test() { cout"Create Test Object:"this<<endl; } Test(int) { cout"Create Test1 Object:"this<<endl; } Test(原创 2016-04-18 22:09:14 · 440 阅读 · 0 评论 -
C++问题小结--2.通过几个例子谈谈const与*
const在C++里能够封锁参数,修饰函数,修饰返回值首先,清楚一个概念,比如说我们定义了一个char类型的指针char *p,那么,在这里,p是一个char *类型的指针。p指的是p指针的指向的地址,*p是这个指针的指向空间的内容。char *p = &i; //那么这里*p存的是这个i变量的值;下面让我们从几个例子入手理解const的位置放置的不同引起的含义的不同:int *p;const原创 2016-04-14 09:51:07 · 643 阅读 · 0 评论 -
C++问题小结--1.命名空间namespace应用举例
#include<iostream>using namespace std;namespace U_Space{ void fun() { cout<<"fun1()"<<endl; }}namespace MY_Space{ void fun() { cout<<"fun2()"<<endl; }}usin原创 2016-04-11 21:29:49 · 412 阅读 · 0 评论 -
关于C++中的临时对象/常与非常&左右值/的阐述
一.先看一段话 局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,所以在处理这种情况时,编译系统会在调用函数的表达式中创建一个无名临时对象,该临时对象的生存周期只在函数调用处的表达式中。所谓return 对象,实际上是调用拷贝构造函数把该对象的值拷入临时对象(对象初始化对象),最终返回的是临时对象。如果返回的是变量,处理过程类似,只是不调用构造函数。 二.阐述 1.无名对象原创 2017-02-22 17:50:47 · 1322 阅读 · 0 评论 -
虚函数和纯虚函数的区别
首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。1、简介假设我们有下面的类层次:class A{public: virtual void f转载 2017-06-23 09:44:14 · 279 阅读 · 0 评论