
C++学习
文章平均质量分 92
guyue35
这个作者很懒,什么都没留下…
展开
-
vs查看预编译后的代码
宏在我们的代码中能经常给我们带来很大的便利,但是有些宏会造成意向不到的错误,能够查看宏展开就能够查看宏错误的根源。VS2008对编译是不保存预处理的文件信息的,而宏展开的信息就是在预编译阶段。如下图:转载 2016-04-22 18:01:44 · 4979 阅读 · 0 评论 -
C++的new之一placement new讲解
placement new(转) - 莫水千流 - 博客园http://www.cnblogs.com/zhoug2020/archive/2012/04/06/2434245.htmlplacement new(转)今天看STL源码遇到一个问题: template inline void _Construct(_T1* __p, const _T2& __转载 2015-07-08 18:34:22 · 649 阅读 · 0 评论 -
怎样管理C++类中的指针成员 和 简单的c++智能指针使用的例子
管理指针成员_imaging_新浪博客http://blog.sina.com.cn/s/blog_9ce5a1b5010135oc.html大多数c++类采用以下三种方法之一管理指针成员:1、指针成员采取常规指针型行为。这样的类具有指针的所有缺陷但无需特殊的复制控制。2、类可以实现所谓的“智能指针”行为。指针所指向的对象是共享的,但类能够防止悬垂指针。转载 2015-07-08 16:47:47 · 2162 阅读 · 0 评论 -
C++中操作符重载自增\自减
C++中操作符重载自增\自减_imaging_新浪博客http://blog.sina.com.cn/s/blog_9ce5a1b501013618.html你想过C++中操作符重载自增\自减时是怎样区分它的前缀和后缀形式的吗?在句法上,重载函数是通过它们的参数类型的差异区分的,但是不管是前缀形式还是后缀形式的自增和自减都没有参数,我们到底该怎么区分它们呢?在开始时转载 2015-07-07 22:49:21 · 634 阅读 · 0 评论 -
友元函数 和 友元类 讲解和使用
关于C++中的友元函数的总结1.友元函数的简单介绍1.1为什么要使用友元函数在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。实际上具体大概有原创 2015-07-13 17:54:31 · 1277 阅读 · 0 评论 -
C++ Traits技术
Traits技术Traits技术 - woaidongmao - C++博客http://www.cppblog.com/woaidongmao/archive/2008/11/08/66367.html.概念Trait的中文意思就是特性,Traits就像特性萃取机,榨取不同类的特性,以便能统一处理。Traits依靠显式模板特殊化(explicit template spe转载 2015-07-06 19:49:13 · 745 阅读 · 0 评论 -
C++编程规范 头文件格式 和 函数注释格式
C++编码规范(1):代码注释当你阅读别人的代码时如果没有注释那会是件比较痛苦的事.一说到注释我们马上想到是通过//或/* */这样来添加一些描述信息.这只是狭义的注释.广义的注释我们可以理解为,任何有助于理解代码的信息都可以看成注释.我们可以把写代码和写文章类比下.自然语言会有词法,句法,语义这几个概念.代码中的语法和句法就相当于一个编程语言中的基本语法规范.这是原创 2015-07-06 15:30:38 · 30330 阅读 · 2 评论 -
关于C++中的虚拟继承的一些总结
关于C++中的虚拟继承的一些总结1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下:class Aclass B1:public virtual转载 2015-07-14 00:34:10 · 445 阅读 · 0 评论 -
设置当前exe执行文件为进程工作目录
设置当前exe执行文件为进程工作目录两种办法:1, APIvoid _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );这个函数将文件全名(带路径)分解成路径名,文件名,后缀名。2,原创 2015-07-13 16:58:13 · 3191 阅读 · 0 评论 -
C++ 模板详解(一)(二)
C++ 模板详解(一)http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.htmlC++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。 模板是一种对类型进行参数化的工具; 通常有两种形式转载 2015-07-05 21:25:12 · 716 阅读 · 0 评论 -
C++类模板的三种特化
C++类模板的三种特化 - SmartPtr - C++博客http://www.cppblog.com/SmartPtr/archive/2007/07/04/27496.htmlC++类模板的三种特化By SmartPtr(http://www.cppblog.com/SmartPtr/) 说起C++的模板及模板特化, 相信很多人都很熟悉 ,但转载 2015-07-05 21:22:43 · 411 阅读 · 0 评论 -
小解C++模板特化
小解C++模板特化模板的特化(template specialization)分为两类:函数模板的特化和类模板的特化。(1) 函数模板的特化:当函数模板需要对某些类型进行特别处理,称为函数模板的特化。例如: 1 bool IsEqual(T t1, T t2) 2 { 3 return t1 == t2; 4 } 5 6 int转载 2015-07-05 21:24:35 · 538 阅读 · 0 评论 -
关于在C++中调用system函数
关于在C++中调用system函数 - heirenheiren的专栏 - 博客频道 - youkuaiyun.comhttp://blog.youkuaiyun.com/heirenheiren/article/details/7367187先看看下面的这一段程序:#include #include int main(int argc, char* argv[])转载 2015-09-08 08:16:15 · 2866 阅读 · 0 评论 -
显式调用构造函数和析构函数
显式调用构造函数和析构函数今天跟同事聊天,他说到STL源码有用到显示调用析构函数。试一了一下。果然能行。#include iostream>usingnamespace std;class MyClass{public:MyClass(){cout "Constructors" endl;}~MyClass(){cout "D转载 2015-10-21 09:17:16 · 840 阅读 · 0 评论 -
stl map用法和make_pair函数和pair结构体
stl map用法和make_pair函数和pair结构体make_pair函数Pairs C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象 classpair可以将两个值视为一个单元。容器类别map和multimap就是使用pairs来管理其健值/实值(key/value)的成对元素。转载 2015-12-28 16:15:19 · 2529 阅读 · 0 评论 -
如何在程序中判断VS的版本?
_MSC_VER实际就是 Microsoft visual c++ version(是微软的预定义宏). 具体对应如下: MS VC++ 14.0 _MSC_VER = 1900 (VS2015) MS VC++ 12.0 _MSC_VER = 1800 (VS2013) MS VC++ 11.0 _MSC_VER = 1700 (VS2012) MS VC++ 10.0 _MSC_VER = 1600 (VS2010) MS VC++ 9.0 _MSC原创 2016-05-27 09:29:19 · 3647 阅读 · 0 评论 -
C++中的函数指针和函数对象总结
篇一、函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表);一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (int x);前面的那个(*func)中括号是必要的,这会告诉编译器我们声明的是函数指针而不是声明一个具有返回型为指转载 2016-04-19 11:21:49 · 476 阅读 · 0 评论 -
在类中使用typedef定义新类型, 并在类外使用
在类中使用typedef定义新类型,其有效范围为定义起始位置到类右大括号。任何数据和函数都不能在类外(大括号外)使用该新类型。在纯虚类中使用比较方便,可以限制新类型的作用范围,防止与其他typedef定义有名字冲突。该定义在该类的子类中可以得到继承,可以在子类中使用该新类型定义新变量和函数。如何需要在类外(大括号)外使用该类型,如实现类中的方法或引用该类型的变量,需要将原类中的typedef定义拿到文件中来, 即拿到类外转载 2016-04-10 13:47:27 · 2707 阅读 · 0 评论 -
预处理器标识#error的目的是什么
#define DEBUG#ifdef DEBUG#error "麻烦大了哈,亲"#endif #include <iostream>#include <windows.h> using namespace std; void main(){ system("pause");};编译结果: 编译失败1>------ 已启动生成: 项目: test, 配置: Debug Win32 ------1> main.cpp1>e:\program\test\test\mai原创 2016-04-12 10:43:48 · 1603 阅读 · 0 评论 -
在什么情况下把析构函数定义为私有的?
只能用new生成的对象 用new生成的对象,在面向对象中是很有用的.它保存在堆上,可以自由控制生命周期。但如何保证一个对象只能在堆上生成呢?答案其实也很简单,只需把析构函数定义为私有成员。例如OnlyCanBeNew类定义。 1| class OnlyCanBeNew 2| { 3| ~OnlyCanBeNew(){}转载 2016-03-14 20:29:39 · 6180 阅读 · 1 评论 -
main函数第3个参数envp装的是什么
1.引入 一般情况下,main函数带有两个参数,分别为int argc和char* argv[],各自表示参数个数、参数选项。比如在cmd窗口中运行ping www.youkuaiyun.com -t,那么传到ping程序的main函数的两个参数argc=3,argv[]={"ping","www.youkuaiyun.com","-t"}。查看MSDN,可选的原型为int main(intargc,char*argv[],char*envp[]);。前两个参数比较熟悉,第3个参数就很陌生了。那么,envp装的是什么,有什转载 2016-03-21 16:42:35 · 988 阅读 · 0 评论 -
拷贝构造函数的参数为什么必须使用引用类型
在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。 但是如果我问你“拷贝构造函数的参数为什么必须使用引用类型?”这个问题, 你会怎么回答? 或许你会回答为了减少一次内存拷贝? 很惭愧的是,我的第一感觉也是这么回答。不好还好,我有理性这个好品质。思索一下以后,发现这个答案是不对的。让我来撕开(有点暴力,但是我喜欢,嘿嘿--龇牙)那件隐藏在真理外的小裤衩,让它袒露在“登徒子”们的眼前吧。转载 2016-03-05 00:58:00 · 660 阅读 · 1 评论 -
使用命名空间、头文件和实现文件
//至今没有解决的一个问题, 如a.cpp中有一个命名空间ming, 现在b.cpp想要使用这个命名空间, 或者使用该空间中的某一个类/普通函数/变量, 至今不知道怎么解决//下面的方法是一种通用的正确方法//自定义命名空间ming, 可以写在头文件中namespace ming{ void fun(){}; int num = 123; class myclass { public: void fun2(){}; int num2; };};//程序中正确使用命名空原创 2016-03-03 12:19:14 · 4806 阅读 · 1 评论 -
C++虚析构函数、纯虚析构函数
析构函数的工作方式是:最底层的派生类(most derived class)的析构函数最先被调用,然后调用每一个基类的析构函数。因为在C++中,当一个派生类对象通过使用一个基类指针删除,而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。然而,基类部分很可能已被销毁,这就导致了一个古怪的“部分析构”对象,这是一个泄漏资源。排除这个问题非常简单:给基类一个虚析构函数。于是,删除一个派生类对象的时候就有了你所期望的正确行为。将销毁整个对象,包括全部的派生类部分原创 2016-03-01 18:18:44 · 2476 阅读 · 0 评论 -
C++中虚析构函数的作用
C++中虚析构函数的作用 我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明: 有下面的两个类:class ClxBase{public: ClxBase() {}; virtual ~ClxBase() {cout << "~ClxBase()"<<endl;};原创 2016-03-01 18:07:01 · 672 阅读 · 1 评论 -
C++中虚函数和非虚函数重载在继承时的区别
C++中虚函数和非虚函数重载在继承时的区别 - 每天进步一点点就好 - 博客频道 - youkuaiyun.com http://blog.youkuaiyun.com/pendle/article/details/6574445 这里唯一想说明的一点就是,使用虚函数继承时,当继承类被强转成基类后调用虚函数,调用的还是继承类的虚函数。而重载方式的继承类被强转成基类再调用重载函数,则调用的是基类的转载 2016-03-01 17:48:20 · 2277 阅读 · 1 评论 -
C++模板的特化
http://www.blogjava.net/bacoo/archive/2009/06/22/283480.htmlC++模板的特化对模板特化的理解:特化整体上分为全特化和偏特化,这一点大家都没有什么置疑,但是细分它们各包括哪几种状态就很难界定了,而且很多权威的书上都不一致,管它呢,反正我们能会用各种特化就可以了。下面就谈谈我个人对特化的划分和定义:所谓特化,就转载 2015-07-05 21:23:36 · 520 阅读 · 0 评论 -
【C++11】新特性——引入nullprt
【C++11】新特性——引入nullprt - 清风小阁 - 博客频道 - youkuaiyun.comhttp://blog.youkuaiyun.com/huang_xw/article/details/8764346引入nullptr的原因引入nullptr的原因,这个要从NULL说起。对于C和C++程序员来说,一定不会对NULL感到陌生。但是C和C++中的NULL却不等价。NULL表示转载 2015-07-12 18:44:39 · 637 阅读 · 0 评论 -
C++中一个类究竟占用多少内存
很多C++书籍中都介绍过,一个Class对象需要占用多大的内存空间。最权威的结论是: 一个Class需要占用的内存空间是------A+ B +CA, *非静态成员变量所占内存的总和。B, *加上编译器为了CPU计算,对类作出的数据对齐处理而额外增加的内存空间。C, *加上为了支持虚函数,产生的额外负担(增加的内存空间)。 介绍完了理论知识后,再看看再找一个例子看看(注:一转载 2015-07-12 14:58:31 · 1094 阅读 · 0 评论 -
一篇写的很不错的dll导出类文章(转)
dll导出类(转载)DLL动态链接库是程序复用的重要方式,DLL可以导出函数,使函数被多个程序复用,DLL中的函数实现可以被修改而无需重新编译和连接使用该DLL的应用程序。作为一名面向对象的程序员,希望DLL可以导出类,以便在类的层次上实现复用。所幸的是,DLL确实也可以导出类。然而事实却没这么简单,导出类的DLL在维护和修改时有很多地方必需很小心,增加成员变量、修改导出类的基转载 2013-11-28 01:06:04 · 1088 阅读 · 0 评论 -
话说enum
在C++中,如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。但我并不想说enum怎么定义与怎么说明的,而要说的是enum在C++编译器中是如何处理的。我们先看一个例子:enum D{B,C};const char B = 'B';int _tmain(int argc,转载 2013-07-27 01:04:58 · 1084 阅读 · 0 评论 -
c++中extern的注意细节
c++中extern的注意细节变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用extern关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern:extern int;int i;exte转载 2013-07-27 00:56:36 · 902 阅读 · 0 评论 -
C++的作用域
每一种语言,其变量、函数、或者对象、指针等都有其生存期,也就是作用域。这个是语言自身的最基本的一个知识,以C++为例子,说明作用域的范围:typedef string Type;Type initVal( );class Exercise{public:typedef double Type;Type setVal(Type);Type initVal(转载 2013-07-26 01:59:09 · 763 阅读 · 0 评论 -
变量的6种作用域:全局作用域,文件作用域,命名空间作用域,类作用域,局部作用域,语句作用域
静态变量 static 全局变量 global 静态变量 在java也叫类变量从名字可以看出它是属于某个类的而不是类的实例。它的关键字是static存储在静态存储区,当程序执行,类的代码被加载到内存,类的静态变量就分配了内存空间,他是属于类的也就是没个实例对象都是对于以个静态变量,静态变量的内存空间知道程序退出才释放所占用的内存空间。静态变量直接通过类名访问(java 也能通过对象名访问)。 有人转载 2013-07-26 01:57:59 · 2025 阅读 · 0 评论 -
C++常量(C++数值常量、字符串常量、符号常量)
C++常量(C++数值常量、字符串常量、符号常量)一、 数值常量数值常量就是通常所说的常数。在C++中,数值常量是区分类型的,从字面形式即可识别其类型。1. 整型常量(整数)的类型在上一节中已知道: 整型数据可分为int,short int,long int以及unsigned int,unsigned short,unsigned long等类别。整型常量也分为以上类转载 2013-07-24 21:41:54 · 2747 阅读 · 0 评论 -
为什么不要在头文件中写上函数定义?
为什么不要在头文件中写上函数定义?在C++/C中,一般的函数与全局变量的申明都会放在.H文件中,而且会在相应的.C文件中对函数和变量进行定义.全局变量在头文件中前面要加上EXTERN,定义时则不用如果你在.H文件中对函数或变量直接定义,这个头文件只被一个文件包含是不会出错的,但是一旦它被两个或更多的文件包含,则会报错.编译器会告诉你函数或变量重复定义!你可能会说,我不是已经转载 2013-07-24 21:23:52 · 9514 阅读 · 0 评论 -
解决vs2010“创建或打开C++浏览数据库文件 发生错误”的问题"
这个问题也困扰了我好久,每次都跳出这个对话框,提示“请确保已安装Microsoft SQL Server Compact 3.5,并且没有其他应用程序正在访问文件。如果问题仍然存在,请删除文件并重新打开解决方案。”但是,电脑里面确确实实是已经装了MicrosoftSQL Server Compact 3.5的呀。后来老老实实到网上下载了一个MicrosoftSQL Server Com转载 2013-07-23 14:08:30 · 2326 阅读 · 0 评论 -
解决:VS2010遇到异常,这可能是由某个扩展所致
问题描述:在VS2010中,一打开工程,都会弹出“Visual Studio 遇到了异常。这个可能是由某个扩展所致的”的错误,点击确定后可以继续使用。如下图所示:问题缘由1(搜索发现的原因)可能是因为vs2010相关的注册表值被修改了解决方法(来源网络整理):修改相应的注册表即可1、在运行中输入命令:regedit,打开注册表编辑器2、32位系统查找注册表的项:[HKE转载 2013-07-23 13:38:15 · 2579 阅读 · 4 评论 -
c编译过程
c编译过程 编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。 编译的完整过程:C源程序-->预编译处理(.c)-->编译、优化程序(.s、.asm)-->汇编程序(.obj、.o、.a、.ko)-->链接程序(.exe、.elf、转载 2013-07-24 03:15:34 · 912 阅读 · 0 评论 -
Windows API和头文件windows.h的关系
Windows API和头文件windows.h的关系在上例中,我们接触了许多以前没见过的函数,如MessageBox, TextOut,CreateWindow, PostQuitMessage等等,这些就是所谓的Windows API函数。Windows操作系统通过两种接口对外提供服务:普通用户操作接口服务和程序员接口服务。其中用户操作接口服务是通过最终用户的操作来完成的,而程序员接口转载 2013-07-24 03:11:32 · 10000 阅读 · 1 评论