C++编程
文章平均质量分 67
eskimoer
这个作者很懒,什么都没留下…
展开
-
C++ STL之set
C++ STL之Set容器的用法1 set中的元素类型...12 set中构造相关函数...23 set中的迭代器...34 set中的容量相关函数...35 set中元素修改函数...35.1 insert 函数...35.2 erase 函数...45.3 clear原创 2013-09-16 14:35:01 · 1777 阅读 · 0 评论 -
C++ 头文件相互包含
有时候两个类要相互用到彼此,这个时候就要用到头文件的相互包含。此外就是要注意到在类体中用到另外一个类 的时候,因为这个类还没有定义完全,所以要实现声明类。实例代码如下://A'h#pragma once#include "B.h"class B;class A{public: A(void); ~A(void); void print(B* b); int ma;}原创 2014-04-03 23:33:31 · 1596 阅读 · 0 评论 -
C++ primer读书笔记7-复制控制
1 复制构造函数,赋值操作符,析构函数这三者都是编译器会自动提供的函数,其中复制构造函数,赋值操作符是如果你没有自己编写,那么编译器就会提供。析构函数是不管自己有没有实现,编译器都会提供一个合成构造函数,在释放对象的时候会先调用自己编写的构造函数,然后调用编译器合成的构造函数。2 IO类型的类没有复制构造函数3 形参为非引用类型时候,函数的返回类原创 2014-04-06 00:06:02 · 1116 阅读 · 0 评论 -
C++ friend 用法总结
C++中的友元机制允许类的非公有成员被一个类或者函数访问,友元按类型分为三种:普通非类成员函数作为友元,类的成员函数作为友元,类作为友元。1 友元的内容友元包括友元的声明以及友元的定义。友元的声明默认为了extern,就是说友元类或者友元函数的作用域已经扩展到了包含该类定义的作用域,所以即便我们在类的内部定义友元函数也是没有关系的。2 普通的非成员函数友元这类友元函数通常是操作符,原创 2014-07-22 23:48:26 · 38798 阅读 · 6 评论 -
C++primer原书中的一个错误(派生类using声明对基类权限的影响)
在C++primer 第4版的 15章 15.2.5中有下面这样一段提示:“注解:派生类可以恢复继承成员的访问级别,但不能使访问级别比基类中原来指定的更严格或者更宽松。”在vs2010中经过验证,这段话是错误的。具体见以下代码://Base.h#pragma once#include using namespace std;class Base{public: Base(原创 2014-07-25 02:03:20 · 1404 阅读 · 0 评论 -
C++ primer读书笔记10-继承
封装,继承,多态是C++的三大基本概念,这里着重总结一下继承相关的东西1 类派生列表类派生列表指定派生类要继承的基类,派生列表中有一个或者多个基类如:class B : public A1,protected A2,private A3但是单继承时最常见的,多继承不多见2 派生类的定义派生类继承时,会包含父类的所有成员,即便私有成员不能被访问。父类中的虚函数原创 2014-07-26 00:52:37 · 1184 阅读 · 0 评论 -
C++编译错误C2365
以前我们说重定义通常是函数或者变量的重定义,今天遇到了一个新类型的重定义errorC2365#include using namespace std;class Base{public: Base(void); ~Base(void); size_t size()const{return n;}protected://private: size_t n; //int n(原创 2014-07-25 23:40:51 · 7214 阅读 · 1 评论 -
C++primer读书笔记8-重载操作符
函数的重载操作符中也有不少细节1 重载操作符特点重载操作符本质上就是重载函数,它的特点:除了函数调用操作符‘()’外,所有的重载操作符的形参数目必须与操作符的操作数目相等。重载操作符的操作数必须至少有一个类类型,否则就不是重载而是原型了。优先级和结合性不会发生改变,例如对于算数操作符的重载,*的优先级肯定还是大于+不具有短路求值特性(就是根据已有的值就可以判断出最终原创 2014-07-21 01:39:47 · 1224 阅读 · 0 评论 -
C++primer读书笔记9-转换与类类型
有时候指定了自己类类型来表示某种类型数据如SmallInt,那么为了方便计算就会指定一个转换操作符,将该类类型在某种情况下自动的转换为指定的类型转换操作符operator type();转换函数必须是类成员函数,不能指定返回类型,并且形参列表必须为空,并且通常不应该改变转换对象,所以操作符通常定义为const成员。#include using namespace std;cla原创 2014-07-21 01:45:14 · 1039 阅读 · 0 评论 -
C++primer读书笔记11-多态
多态也是C++中的一个重要的方面,多态和动态类型,虚函数本质上是指相同的事情。1 虚函数类中的成员函数原型前面加上virtual 表面这个函数是个虚函数。虚函数的目的是为了在继承它的派生类中重新定义这个函数,以便于通过基类的指针或引用在运行时对派生类的函数进行调用。2 派生类和虚函数派生类一般情况下要重定义所继承的虚函数,有几个注意事项。虚函数的声明必须和基类中原创 2014-07-26 03:54:30 · 1468 阅读 · 0 评论 -
C++ 句柄类的原理以及设计
句柄类存在的意义是为了弥补将派生类对象赋给基类对象时发生的切片效应。例如下面的程序:multimap basket;Base base;Derived derive;basket.insert(base); //ok,add copy of base;basket.insert(derive); //ok,but derive sliced down to its base part.原创 2014-07-27 03:46:55 · 2338 阅读 · 0 评论 -
C++模板实现的二叉排序(查找)树
C++模板实现的二叉排序(查找)树二叉排序树定义:二叉排序树是这样的树,结点左边的值都小于结点的值,结点右边的值都大于结点的值,所以按照二叉树的中序遍历的话,得到的的将是按顺序排列的值。二叉排序树的主要操作:1:插入插入的操作非常简单,从根结点开始,如果插入值大于根节点值,则向右遍历,如果小于根节点值,则想左遍历,知道遇到一个叶子结点为止。按插入值大于叶子则将插入值作为叶子结点原创 2014-02-28 16:12:50 · 2168 阅读 · 7 评论 -
C++ 函数反汇编跟踪以及栈结构分析
#include using namespace std; int func(int a,int b); void main(){ intx = 1; inty = 2; intz = func(x,y);} int func(int a,int b){ returna + b;}汇编解析原创 2013-10-14 22:48:16 · 3237 阅读 · 0 评论 -
C++模板实现的AVL树
1 AVL树的定义AVL树是一种自平衡二叉排序树,它的特点是任何一个节点的左子树高度和右子树的高度差在-1,0,1三者之间。AVL树的任何一个子树都是AVL树。2 AVL树的实现AVL树本质是一种二叉排序树,所以二叉排序树的任何性质AVL树都具有,但是AVL树稍微复杂的地方就是AVL树必须满足平衡条件,具体跟BST不同的地方主要体现在插入,删除操作。插入操作:当插入之后可能会出现不原创 2014-11-03 18:40:41 · 3301 阅读 · 0 评论 -
C++嵌套类的使用
C++的嵌套类意思就是类中定义的类,它和外围类的成员类似,也被相应的访问权限修饰符修饰。1 嵌套类可以直接方位外围类中的static成员变量。2 嵌套类可以通过引用,指针,或者对象来访问外围类的成员,不管该成员是public,private,protected。3 嵌套类被private修饰的时候就不能在用户代码中被定义对象,因为是private的4 外围类对嵌套类的非public原创 2015-01-29 19:27:00 · 2368 阅读 · 0 评论 -
Fatal Error 1083
在VS2010中编译项目,出现Fatal Error 1083的错误,具体就是找不到xxx文件,刚开始百思不得其解,后来才找到问题的解决方法。出错的原因:我在项目中有几个文件夹,例如A,B,C。我后来把B文件夹中的一个文件xxx剪切移动到了C中,然后在编译中就出现了Error 1083的错误,提示找不到 B/xxx。解决方法:我首先尝试重新再B中添加xxx文件,但是原创 2015-02-01 12:45:58 · 4645 阅读 · 0 评论 -
C++虚函数访问权限的改变
如果在基类中虚函数的访问权限是一种情况,那么派生类在继承基类的时候,派生类可以重新定义基类虚函数的访问权限,经过实例验证是正确的。从这里也说明了函数的覆盖或者说重定义跟前面的访问权限修饰没多大关系//Base.h#pragma once#include using namespace std;class Base{public: Base(void){原创 2014-12-14 16:17:04 · 3086 阅读 · 0 评论 -
C++11之lambda的初探
1 Lambda结构2 关于capture3 关于parameter4 关于mutable5 throw()6 返回值7 函数体原创 2017-03-17 17:55:26 · 759 阅读 · 0 评论 -
C++ 对象占用内存大小的思考
一直有这样几个疑问,C++中一个对象占有多大内存?会不是里面的函数越多,占有的内存就越大?1:空类占有的内存#pragma onceclass TestClass{};结果:sizeof(TestClass) = 1原因:C++要为每一个类在内存中一个独一无二的地址,所以即便是空类也会被分配1个字节来初 始化,所以空类的占有的字节是1.结原创 2014-03-07 20:45:33 · 3439 阅读 · 0 评论 -
C++primer读书笔记6-类的细节知识
1:类成员函数的调用Tclass A;A.func();实际上func函数里面有一个默认的形参,参数是A.this。所以表面上时A.func(),实际上是Tclass::func(A.this)。2:类中的inline函数 类定义体中直接定义的函数被被默认为inline函数 类定义体中声明为inline的函数 类定义体中没有声明,但是在函数定义时加了inline原创 2014-03-08 16:24:30 · 1035 阅读 · 0 评论 -
C++ 派生类到基类转换的可访问性
C++ primer第四版15.3小节有这样一段话:如果是 public 继承,则用户代码和后代类都可以使用派生类到基类的转换。如果类是使用 private 或 protected 继承派生的,则用户代码不能将派生类型对象转换为基类对象。如果是 private 继承,则从 private 继承类派生的类不能转换为基类。如果是 protected 继承,则后续派生类的成员可以转换为基类类原创 2014-03-04 20:59:23 · 1746 阅读 · 3 评论 -
C++ 数组指针
首先看下数组int arr[2][3]在调试时的情况#include using namespace std;void main(){ int arr[2][3] = {1,2,3,4,5,6}; int (*p)[3] = arr;}分析二维数组int arr[2][3],原创 2013-10-14 09:52:33 · 1341 阅读 · 0 评论 -
C++ STL之vector
C++STL之vector容器的使用方法1 成员类型...12 vector的构造函数...22.1 右值和引用...32.2 初始化列表构造函数...32.3 赋值函数...53 容量相关的函数...53.1 size 函数...63.2 max_size函数...63.3原创 2013-09-16 14:34:59 · 1756 阅读 · 0 评论 -
C++ STL之array
Array 容器的相关知识,array是一个顺序容器,和其他标准容器相比它的特点是容器的大小固定,顺序存储。1:array的构造函数array();array(const array &right);2:array的成员变量Type DefinitionDescriptionarray::const_iteratorThe type of a cons原创 2013-09-16 14:34:56 · 2089 阅读 · 1 评论 -
C++ STL之list
List 是一个双向的链表,相比较其他容器,list在插入,删除,移动元素时比较好。1 List 的构造函数:list( );explicit list( const Allocator& _Al);explicit list( size_type _Count);list( size_type _Count,原创 2013-09-16 14:34:52 · 1829 阅读 · 1 评论 -
C++ 可变参数的函数
C++ 中可变参数的函数有两种类型:type func(...)type func(type,...)可变参数顾名思义就是函数的参数数目或者类型是不确定的,对于这种该如何获取传递的参数的值,这就需要对C,C++的函数栈结构有一定的了解。下面就直接进入实战分析:#include#includeusing namespace std; void func(..原创 2013-10-15 10:13:45 · 1445 阅读 · 0 评论 -
C++ inline函数解析
inline函数和其他函数的不同之处,它必须先定义然后才能在每一个编译单元调用它。所以inline函数可以在函数中定义多次,这点和const变量,static变量很相似,他们都可以包含在头文件中,然后被其他编译单元所include,但是不会引起重定义的现象,原因是因为他们具有局部全局性而不是整天全局性。如果在头文件中声明inline,然后在cpp文件中定义inline函原创 2013-10-18 22:21:58 · 1648 阅读 · 0 评论 -
extern,C,C++混合编程
1:C,C++使用宏定义的好处:宏定义使用预处理器实现,没有参数压栈,代码生成等一系列的操作,所以他的效率很高。缺点:使用时所作的只是预处理器中符号表的简单替换,因此不能实现参数的有效性检测,也就不能享受C++编译器严格类型检查的好处。另外它的返回值也不能被强制转换为可以的合适类型,所以在使用上就存在着一定的隐患。另外当C++的操作或者表达式涉及到保护成员或者私有成员时,就不能使用宏定义原创 2013-09-16 14:34:36 · 916 阅读 · 0 评论 -
VC dll的制作和使用
1:console下dll制作(1) dll的空项目在空项目下建立两个文件 mathAdd.h,mathadd.cpp如下所示://mathAdd.h#ifndef _MATH_ADD_H#define _MATH_ADD_H#ifdef MATHFUNCSDLL_EXPORTS#define MATHFUNCSDLL_API __declspe原创 2013-12-29 17:03:21 · 1455 阅读 · 0 评论 -
用C++类模板实现栈结构出现的问题以及思考
从类模板引发的思考 C++中使用了模板来减少方法相同但是类型不一样带来的函数重载以及大量复制代码的问题。这里主要说说类模板 类模板的定义:templateclass Stacks{public: Stacks(void); Stacks(int nSize); Stacks(Type Arr[],int nSize); ~Stacks(void);public:原创 2014-02-26 17:57:36 · 1709 阅读 · 0 评论 -
C++模板实现的单向队列
C++模板实现的单向队列的元素添加,元素删除,元素清除功能//Queues.h#ifndef DDXX_QUEUES_H#define DDXX_QUEUES_H#include using namespace std;templateclass Queues{public: Queues(); ~Queues();public: struct Node {原创 2014-02-27 12:20:48 · 1666 阅读 · 0 评论 -
C++ primer读书笔记2(表达式)
表达式1 算术运算符的求余,相除运算符要数要注意的是带有符号的整数相除,求余数。如果两个数都为正,那么除法和求余的结果都为正或者0.如果两个数都为负数,那么除法的结果为整数或者0,余数的结果为负数或者0.如果两个数一正一负,那么求余和相除结果都取决于机器。如果求余的结果随分子而定,那么除出来的值向零一侧取整,如果求余结果跟随分母而定,那么除出来的结果向负无穷靠近。即:-21 ÷原创 2013-10-12 17:21:20 · 1063 阅读 · 0 评论 -
C++ primer读书笔记4(函数)
1 函数的返回值在早期的C++中,C++ 函数可以不指明翻译值,这个时候系统会默认返回类型是int如main(){do something;},但是在现在的C++标准中函数没有返回类型就是错误的。2 函数参数的传递函数的参数的传递在C++ 中分为三种类型,分别是传值调用,传引用调用,传指针调用。(1)传值调用传值调用就是把实参的值传递给形参,形参此时是实参的副本原创 2013-10-20 15:21:12 · 1414 阅读 · 0 评论 -
C++ primer读书笔记1(常见错误)
C++ 常见错误总结1:关于定义在for循环语句头的变量,在标准C++中是不可以用于循环体外的其他地方,但是由于某些编译器的缘故,它可以在某些不遵守C++标准的编译器内使用与循环体的外部。2:八进制以0开始,十六进制以0X或者0x开始,如024 ,0x14 表示成10进制都是20;3:字面值:字面值就是程序中的常量,比如,1,‘a’等,只能用它的值来称呼它。4:字面值的修饰,102原创 2013-10-11 21:48:13 · 1329 阅读 · 0 评论 -
C++模板实现的单向链表
C++模板实现的单向链表,实现了链表的初始化创建,元素插入,元素链表末尾添加,元素删除,链表清空//Lists.h#ifndef DDXXLISTS_H#define DDXXLISTS_H#include using namespace std;templateclass Lists{public: Lists(); Lists(int nSize); ~Lists(原创 2014-02-27 00:57:03 · 2552 阅读 · 0 评论 -
C++ Primer读书笔记5(容器)
关于容器的一些补遗1:容器中元素类型的约束(1)元素类型必须支持赋值运算;(2)元素类型的对象必须可以复制。引用不能作为容器的元素,因为引用不支持一般意义上的赋值运算,这里好仔细解释一下,int m = 1;int n = 2;int &ref1 = m;int &ref2 = n;ref1 = ref2;引用本质上应该是一个const类型指针,指针所指向的是所引原创 2013-11-15 11:09:44 · 1463 阅读 · 0 评论 -
C++ primer读书笔记3(语句)
1 语句作用域有些语句允许在控制结构内部定义变量,if(int a =5){},while(int a = 5),for(int i=0;iif和while中定义的变量值就是条件判断要检验的对象,所以必须初始化。在C++现在的标准中,for语句头中定义的变量只在for语句体中有作用,但是在之前的一些编译器中却可能不是这样,例如在vc6中for(int i = 0;;原创 2013-10-12 20:40:16 · 1103 阅读 · 0 评论 -
排列组合算法
排列组合算法排列算法:排列算法采用递归思想很简单。如1,2,3,4我们求其排列。首先遍历1,2,3,4.遍历1,剩下2,3,4递归处理遍历2,剩下1,3,4递归处理遍历3,剩下1,2,4递归处理遍历4,剩下1,2,3递归处理我们的目标是把相应的排列给答应出来,所以这个时候需要一个数组来保存已经处理的数字。但是关于数组的下标在递归的时候是个问题,我们改采取怎样的方式呢原创 2014-03-03 00:34:53 · 2717 阅读 · 0 评论 -
c++11多线程编程之condition_variable
c++11多线程编程之condition_variable主要从一个问题出发,编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。这里可以用c++11的条件变量来解决问题。涉及到的知识点包括:1.std::unique_lock首先介绍unique_loc原创 2017-03-05 17:15:43 · 1162 阅读 · 0 评论