
C++
vinnyjia
这个作者很懒,什么都没留下…
展开
-
函数对象适配器
#include#include#include#include#include#include#includeusing namespace std;//函数对象适配器bind1st,bind2ndstruct MyPrint :public binary_function//binary_function{void operator()(int v1原创 2017-05-18 23:30:30 · 291 阅读 · 0 评论 -
类模板碰到友元函数
当类模板碰到友元函数时,普通友元函数必须提前声明。template class MyClass;//声明类模板存在//声明友元函数存在template void fun(MyClass myclass);template ostream& operator &myclass);templateclass MyClass{public:T ta;//普通友元函原创 2017-05-06 14:12:39 · 336 阅读 · 0 评论 -
友元类,成员函数做友元函数
在C++中,可以把某个类中的成员函数或者整个类声明为友元。class person;class friendly1{public:void printperson(person& per);};class friendly2{public:void setperson(person& per);};class person{publi原创 2017-04-23 21:59:36 · 1270 阅读 · 0 评论 -
友元函数
C++中类的主要特点之一就是数据隐藏,即类的私有成员无法在类的外部访问。但是,如果一个函数它是一个类的友元函数,那么这个函数可以在类外访问类的全部成员,包括私有成员。友元的语法与特点:1.友元函数用friend关键字声明,且friend关键字只出现在声明处;2.友元函数不是类的成员,不带this指针;3.友元函数可访问任意属性的成员class person{public原创 2017-04-23 20:00:08 · 256 阅读 · 0 评论 -
const修饰成员函数const修饰对象
用const修饰成员函数时,const修饰this指针指向的内存区域,成员函数体内不可以修改本类中的任何普通成员变量。当成员变量用mutable修饰时除外。class person{public:int age;mutable int weight;static int a;void setvalue()const{//age = 20;错误,const修饰的普原创 2017-04-23 19:32:38 · 1967 阅读 · 0 评论 -
list容器
1.list容器的概念list容器是一个双向链表。相比于vector容器,list每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何元素的插入或移除,list永远是常熟时间。2.list容器的迭代器list迭代器可进行递增、递减、取值、成员存取操作。插入和删除不会使原有的list迭代器失效。3.l原创 2017-05-14 01:05:47 · 269 阅读 · 0 评论 -
queue容器
1.queue容器的基本概念queue是一种先进先出的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。queue没有迭代器。2.queue常用API2.1queue构造函数queue que;默认构造queue que(const queue &q);拷贝构造2.2queue存取、插入和删除操作push(ele);往队尾添加元素p原创 2017-05-14 00:46:57 · 251 阅读 · 0 评论 -
this指针
C++的数据和操作是分开存储的,每一个非内联成员函数,只会诞生一份函数实例,也就是说多个同类型的对象共用一块代码。C++提供特殊的对象指针this,this指针指向被调用的成员函数所属的对象。this指针是一种隐藏在对象成员函数内的一种指针。当一个对象被创建后,它的每一个成员函数都含有一个系统自动生成的隐含指针this,用以保存这个对象的地址,也就是说虽然我们没有写上this指针,编译器在编译原创 2017-04-23 14:35:19 · 261 阅读 · 0 评论 -
stack容器
1.stack容器概念stack容器是一种前进后出的数据结构,它只有一个出口。stack容器允许新增元素,移出元素,取得栈顶元素,但是,除了最顶端外,没有任何其它方法可以存取stack的其它元素,stack不允许遍历。2.stack容器不提供迭代器stack所有元素的进出都必须符合 先进后出 的条件,只有stack顶端的元素,才有机会被取用。stack不提供遍历功能,也不提供迭原创 2017-05-13 15:45:26 · 271 阅读 · 0 评论 -
成员变量和成员函数的存储
C++中,成员变量和成员函数时分开存储的。C++中的非静态成员直接内涵在类对象中;成员函数虽然在类内声明,但不出现在对象中;每一个非内联成员函数只会诞生一份函数实例。class A{int a;};class B{int b;void printb(){cout }};class C{int c;static void print原创 2017-04-22 21:44:27 · 546 阅读 · 0 评论 -
单例模式
一个类中只有一个实例,即为单例模式。通过单例模式可以保证系统中一个类只有一个实例,且该实例易于外界访问,从而方便地对实例个数进行控制。单例模式的实现:1.默认构造,默认拷贝的访问属性设置为私有2.在单例内部,定义一个静态对象,作为外部共享的唯一实例3.在单例内部,定义一个静态函数,作为获取实例的唯一方法4.单例可以不用释放class Priter{public:原创 2017-04-22 20:48:11 · 175 阅读 · 0 评论 -
类模板的类外实现与hpp文件
当类模板中有友元函数,且友元函数在类外实现,那么,程序编译时会出现:无法解析的外部符号的错误。templateclass Dad{public:T Dproperty;Dad(T property);//友元函数friend ostream& operator& dad);void commonfun();//普通函数};templateDad:原创 2017-05-05 00:51:05 · 1373 阅读 · 0 评论 -
类模板
当有两个或多个类,其功能相同,但数据类型不同时,可以用类模板,减少编辑代码的工作量,增加程序的可读性和易维护性。类模板用于实现类数据类型的参数化,类模板在表示如数组,表,图等数据结构时,显得特表重要,这些数据结构的表示和算法不受所包含的数据类型的影响。类模板的用法:1.类模板可以做函数参数templateclass Car{public:T1 brand;T2原创 2017-05-04 20:07:35 · 326 阅读 · 0 评论 -
静态函数
静态成员函数的使用方式和静态成员变量一样,同样在对象没有创建前,即可以通过类名调用。静态成员函数主要是问了管理静态变量,完成对静态数据成员的封装。静态成员函数不能访问普通成员变量。总结一下,就是:1.静态成员函数只能访问静态变量,不能访问普通成员变量2.静态成员函数的使用和静态变量一样。3.静态成员函数也有访问权限4.普通成员函数可以访问静态成员变量,也可以访问非静态成员变量原创 2017-04-22 20:19:07 · 290 阅读 · 0 评论 -
静态成员
在一个类中,若将一个成员变量声明为static,这种成员称为静态成员变量。与一般的数据成员不同,无论建立了多少个对象,都只有一个静态数据的拷贝。静态成员变量,属于某个类,所有对象共享。静态变量,在编译阶段就分配空间,对象还没有创建时,就已分配空间。静态成员变量必须在类中声明,在类外定义。静态数据成员不属于某个对象,在对对象分配空间中不包含静态成员。静态数据成员可以通过类名或者对象名来引用。原创 2017-04-22 19:50:19 · 241 阅读 · 0 评论 -
用于数组的new和delete
创建数组:char* str=new char[100];创建数组并初始化:int* arr=new int[10]{1,2,3,4,5,6,7,8,9,10};释放数组:delete[] str;delete[] arr;创建对象数组:class Person{public:int mage;char* name;Person(){n原创 2017-04-22 17:46:39 · 1300 阅读 · 0 评论 -
new运算符,delete运算符
class Person{public:int mage;char* name;Person(){name = (char*)malloc(30);memset(name, 0, 30);strcpy(name, "defalut");mage = 30;}void init(){name = (char*)malloc(30);mems原创 2017-04-22 16:40:43 · 630 阅读 · 0 评论 -
隐式转换与explicit关键字
class Person{public:int mage;Person(){cout }Person(const int age){mage = age;cout }};int main(){Person person = 1;//隐式转换,Person person=Person(10)system("pause");r原创 2017-04-22 15:40:48 · 218 阅读 · 0 评论 -
<<,>>,++,--运算符重载
class person{public:int age;string name;public:person(){age = 30;name = "vinny";}friend ostream& operatorfriend istream& operator>>(istream& is, person& per);//>>运算符重载person&原创 2017-04-24 21:31:20 · 215 阅读 · 0 评论 -
*运算符,->运算符重载与智能指针
class person{public:int age;string name;public:person(){age = 30;name = "vinny";}void printperson(){cout }};class pointer//智能指针{public:person* ppointer;poin原创 2017-04-24 22:03:10 · 271 阅读 · 0 评论 -
不要重载&&和||运算符
按照常理来讲,&&和||运算符,都是先计算左边的表达式,再计算右边的表达式。如果左边的表达式能够决定整个运算的结果,那么右边的表达式便不会执行。如果重载了&&和||运算符,将会带来一些不容易发现的错误。class buer{public:int flag;public:buer(int n){flag = n;}buer& operator+=(cons原创 2017-04-24 22:06:03 · 403 阅读 · 0 评论 -
谓词
谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词。谓词可作为一个判断式。struct GreaterThan8{bool operator()(int v){return v > 5;}};//一元谓词void test0(){ve原创 2017-05-18 20:57:01 · 396 阅读 · 0 评论 -
继承与组合混搭的构造和析构
class A{public:A(){cout}~A(){cout}};class B:public A{public:B(){cout}~B(){cout}};class C{public:C(){cout}~C(){cout}};class D:pub原创 2017-04-27 22:06:53 · 213 阅读 · 0 评论 -
继承中的构造和析构
继承中的构造和析构的调用原则:1.子类对象在创建时会首先调用父类的构造函数;2.父类构造函数执行完毕后,才会调用子类的构造函数;3.当父类构造函数又参数时,需要在子类初始化列表中显式调用父类构造函数;4.析构函数调用顺序和构造函数相反。class A{public:int a;public:A(int n){cout}~A(){原创 2017-04-27 21:28:23 · 258 阅读 · 0 评论 -
继承
C++最重要的特征是代码重用,通过继承机制可以利用已有的数据类型来定义新的数据类型,新的类不仅拥有旧类的成员,还拥有新定义的成员。B类继承于A类,也可以说,类A派生了类B。这样的话,类A成为父类(基类),类B成为子类(派生类)。派生类的成员,包含有:1,从基类继承来的;2,自己新定义的成员。子类的访问控制:原创 2017-04-27 21:19:03 · 166 阅读 · 0 评论 -
运算符重载,何时用友元,何时用成员函数
1.能用成员函数,尽量使用成员函数。因为,友元函数,可以访问类内的所有数据,破坏了类的封装。2.当所重载的运算符的函数的参数中,含有该类不能访问的数据时,用友元函数。因为,友元函数时全局函数,它不在某一类中,可以访问类之外的数据。原创 2017-04-27 21:14:25 · 1158 阅读 · 0 评论 -
STL的容器、算法与迭代器
1.容器容器分为序列式容器,关联式容器。序列式容器就是容器元素在容器中的位置是由元素进入容器的时间和地点类决定。vector,deque,list,stack,queue都是序列式容器。关联式容器是指容器有既定的规则,元素在容器中的位置由容器的规则决定。set、multiset、map、multimap都是关联式容器。2.算法算法分为质变算法、非质变算法。质变算法:运算过程原创 2017-05-10 11:31:21 · 289 阅读 · 0 评论 -
STL的优点
STL的优点:1.实现数据结构和算法的分离,使得STL非常通用。2.STL具有高可重用性,高性能,高移植性,夸平台的优点。--高可重用性:STL中几乎所有的代码都采用了模板类和模板函数的方式实现,代码重用性高。--高性能:如map,采用红黑数的变体实现,效率高。--高移植性:STL模块很容易移植。原创 2017-05-10 11:23:25 · 2214 阅读 · 0 评论 -
STL的六大组件
STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器、空间适配器。容器:各种数据结构(vector,list,deque,set,map等),用来存放数据,从实现角度来看,STL容器是一种class template。算法:常用的各种算法,如sort,find,copy,for_each等。从实现的角度看,STL算法是一种function tem原创 2017-05-10 11:11:48 · 376 阅读 · 0 评论 -
函数对象
重载函数调用操作符的类,其对象称为函数对象,它是行为类似函数的对象,也称作仿函数。函数对象的特性:1.函数对象是一个类,不是一个函数。2.函数对象重载了()操作符,使得它可以像函数一样调用。struct MyStruct{void operator()(int a){cout }};void test0(){MyStruct mystruct;原创 2017-05-18 20:01:29 · 281 阅读 · 0 评论 -
map/multimap容器
map容器的特性:1.所有元素都会根据元素的键值自动排序。map的所有元素都是pair,同时拥有实值和键值,map不允许两个元素有相同的键值。2.不能通过map的迭代器改变键值。因为键值关系搞map元素的排列规则,任意改变map键值,将会严重破坏map组织,修改元素的实值是可以的。3.在对容器元素进行新增或删除操作时,操作之前的所有迭代器,在操作完成后,依然有效,被删除的那个元素的迭代原创 2017-05-18 19:16:18 · 336 阅读 · 0 评论 -
C++文件读写
打开文件是指在文件读写之前做必要的准备工作,包括:1.位文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。2.指定文件的工作方式。在C++中,代开文件可以用两种方法实现1.调用文件流的成员函数2.在定义文件流对象时指定参数文件输入输出方式设置方式作用ios::in以输入方式打开文件原创 2017-05-09 22:28:20 · 391 阅读 · 0 评论 -
标准IO流cin与cout
C++程序把输入和输出看做字节流,流,就是流动的输出。c++的标准IO流,有cin,cout,clog,cerr.1.cinvoid test(){char ch1,ch2;cin.get(ch1);//读取一个字符ch2 = cin.get();//读取一个字符cin.get(ch1).get(ch2);//链式编程char buf[1024];cin.ign原创 2017-05-09 16:10:29 · 767 阅读 · 0 评论 -
set/multiset容器
set容器的特性:1.所有元素都会根据元素的键值自动排序,set元素的键值又是实值,set不允许两个元素有相同的键值(实值);2.不可以通过迭代器改变set元素的值。因为set元素值就是其键值,关系到set元素的排序规则。如果通过迭代器改变set元素值,会破坏set组织。set的iterator是const的;3.multiset的用法和set一样,唯一不同在于,multiset允许键原创 2017-05-18 12:23:32 · 269 阅读 · 0 评论 -
常量转换
常量转换,const_cast,用来修改类型的const属性。常量指针被转换成飞常量指针,并且仍然指向运来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象。class Person{public:int age;};void test(){int *p = new int;Person* pPerson = new Person;//为指针添加co原创 2017-05-07 01:16:40 · 724 阅读 · 0 评论 -
静态转换和动态转换
1.静态转换静态转换用于,普通数据类型间的转换,具有继承关系的父子类指针或引用的转换。class Dad{};class Son :public Dad{};class MyClass{};//基础类型转换void test1(){int a = 5;double b = static_cast(a);//基础数据类型转换}//继承关系指针转换voi原创 2017-05-06 21:57:07 · 8045 阅读 · 0 评论 -
类模板的应用--用类模板实现动态数组
templateclass DynamicArray{public:T* ptrt;int tcapacity;int tsize;public:DynamicArray(){this->tcapacity = 5;this->tsize = 0;this->ptrt = new T[tcapacity];}~DynamicArray()原创 2017-05-06 19:40:47 · 1108 阅读 · 0 评论 -
类模板遇到友元函数模板
class MyClass{template friend void fun(MyClass &myclass);template friend ostream& operator& myclass);public:T ta;MyClass(T a){ta = a;}};template void fun(MyClass &myclass){co原创 2017-05-06 15:53:46 · 243 阅读 · 0 评论 -
deque容器
1.deque是一种双向开口的连续线性空间,可以在头尾两端分别做元素的插入和删除操作。2.deque容器实现原理deque容器是由一段一段的定量的连续空间构成。一旦有必要在deque前段或者尾端增加新的空间,便配置一段连续定量的空间。串接在deque的头端或者尾端。deque的最大工作就是维护这些分段连续的内存空间的整体性的假象,并提供随机存取的接口,避开了重新配置空间,赋值,释放原创 2017-05-12 16:36:11 · 250 阅读 · 0 评论 -
vector容器
1.vector容器示意图2.vector的迭代器vector支持随机存取,所以vector提供的是随机访问迭代器。3.vector的数据结构vector采用连续线性空间实现,它用两个迭代器_Myfirst和_Mylast分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器_Myend指向整块连续内存空间的尾端。一个vector的容量永远大于或等于其大小,一旦容量等于原创 2017-05-12 15:03:10 · 427 阅读 · 0 评论