
C/C++ 语言
文章平均质量分 86
big_bit
这个作者很懒,什么都没留下…
展开
-
实现C++模板类头文件和实现文件分离的方法
如何实现C++模板类头文件和实现文件分离,这个问题和编译器有关。引用>里的观点:1)标准C++为编译模板代码定义了两种模型:“包含”模型和“分别编译”模型。2)所有编译器都支持“包含”模型,某些编译器支持“分别编译”模型。问题的提出:(帖子在:http://topic.youkuaiyun.com/u/20101215/15/f4f270f2-f0f9-4c5f-8765-1bfde2aeeb转载 2017-09-07 10:23:40 · 6488 阅读 · 0 评论 -
C/C++ Volatile关键词深度剖析
1 背景 12 Volatile:易变的 12.1 小结 23 Volatile:不可优化的 33.1 小结 44 Volatile:顺序性 44.1 happens-before 64.2 小结 75转载 2016-08-31 16:57:25 · 402 阅读 · 0 评论 -
C++ Primer 第七章函数 7.2 参数传递
非引用形参 1.指针形参参数是以复制形式传递的,函数内部对参数修改不会对调用函数的实参产生影响。函数的形参可以是指针(第 4.2节),此时将复制实参指针。与其他非引用类型的形参一样,该类形参的任何改变也仅作用于局部副本。如果函数将新指针赋给形参,主调函数使用的实参指针的值没有改变。但可通过指针实现赋值,修改指针所指向对象的值: void reset(int *ip)转载 2016-06-13 11:15:37 · 738 阅读 · 0 评论 -
C++ 虚函数表解析
前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使转载 2016-08-03 09:00:57 · 176 阅读 · 0 评论 -
C++重载、重写、重定义区别
一 重载(overload)概念:函数有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数之间,互相称之为重载函数。基本条件:函数名必须相同;函数参数必须不相同,可以是参数类型或者参数个数不同;函数返回值可以相同,也可以不相同;注意:只能通过不同的参数样式进行重载,例如:不同的参数类型,不同的参数个数,不同转载 2016-08-03 08:20:01 · 476 阅读 · 0 评论 -
C++自增运算符的探索
今天在阅读C++ primer时遇到如下一段代码:istream_iteratorint> in_iter(cin);//read ints from cinistream_iteratorint> eof;//istream "end" iterator//read until end of file,storing what read in vecwhile(in_iter转载 2016-08-02 15:56:13 · 354 阅读 · 0 评论 -
C++ Primer 类 12.6 static
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即::。 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静转载 2016-05-31 16:20:45 · 350 阅读 · 0 评论 -
__stdcall,__cdecl,__pascal,__fastcall的区别
__cdecl__cdecl 是 C Declaration 的缩写,表示 C 语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。__stdcall__stdcall 是 Standard Call 的缩写,是 C++ 的标准调用方式转载 2016-08-02 09:05:50 · 393 阅读 · 0 评论 -
C++ Primer复制控制 13.1复制构造函数
※复制构造函数、赋值操作符和析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。 ※有一种特别常见的情况需要类定义自己的复制控制成员的:类具有指针成员。13.1 复制构造函数 ※当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函转载 2016-06-01 11:22:32 · 519 阅读 · 0 评论 -
C/C++内存管理详解
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C转载 2016-08-03 17:05:49 · 300 阅读 · 0 评论 -
malloc/free与new/delete的区别
相同点:都可用于申请动态内存和释放内存不同点:(1)操作对象有所不同。malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内转载 2016-08-03 15:38:00 · 206 阅读 · 0 评论 -
函数指针和回调函数
C++很多类库都喜欢用回调函数,MFC中的定时器,消息机制,hook机制等待,包括现在在研究的cocos2d-x中也有很多的回调函数。1.回调函数什么是回调函数呢?回调函数其实就是一个通过函数指针调用的函数!假如你把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,那么这就是回调机制。A函数就是回调函数,而通常情况下,A函数是系统在符合你设转载 2016-07-19 19:29:01 · 319 阅读 · 0 评论 -
C++异常(2) - 栈展开(stack unwinding)
在运行时期间从函数调用栈中删除函数实体,称为栈展开。栈展开通常用于异常处理。在C++中,如果一个异常发生了,会线性的搜索函数调用栈,来寻找异常处理者,并且带有异常处理的函数之前的所有实体,都会从函数调用栈中删除。所以,如果异常没有在抛出它的函数中被处理,则会激活栈展开。参考下面程序:[cpp] view plain copy print?#i转载 2016-09-01 15:26:51 · 714 阅读 · 0 评论 -
C++异常(3) - 捕获基类与子类的异常
如果基类和子类都被做为异常捕获,则子类的catch代码块必须出现在基类之前。如果把基类放在前面,则子类的catch代码块永远都不会被调用。例如,下面程序打印“Caught Base Exception”。[cpp] view plain copy print?#include using namespace std; clas转载 2016-09-01 15:51:05 · 962 阅读 · 0 评论 -
C++异常(1) - 异常介绍
引言异常,让一个函数可以在发现自己无法处理的错误时抛出一个异常,希望它的调用者可以直接或者间接处理这个问题。而传统错误处理技术,检查到一个局部无法处理的问题时:1.终止程序(例如atol,atoi,输入NULL,会产生段错误,导致程序异常退出,如果没有core文件,找问题的人一定会发疯)2.返回一个表示错误的值(很多系统函数都是这样,例如malloc,内存不足,分配失败转载 2016-09-01 15:33:29 · 293 阅读 · 0 评论 -
C++中的namespace
命名空间的定义格式为:(取自C++标准文档)named-namespace-definition: namespace identifier { namespace-body }unnamed-namespace-definition: namespace { namespace-body }namespace转载 2017-08-01 10:25:45 · 243 阅读 · 0 评论 -
CString与char *互转总结
1 前言今天在网上看论坛,发现大家对CString与Char *互转各说一词,其实我发现提问者所说的情况与回答问题的人完全不是同一情况,这里做一总结.首先大家得清楚一件事,一般在网上提出问题的人大部分使用的都是VC,那么你就应该知道,在VC下编程,工程属性中有一属性Charecter Set属性,其值可以设置为Use Multi-Byte Charecter Set转载 2017-07-21 11:05:50 · 263 阅读 · 0 评论 -
静态变量和静态函数
C语言程序可以看成由一系列外部对象构成,这些外部对象可能是变量或函数。而内部变量是指定义在函数内部的函数参数及变量。外部变量定义在函数之外,因此可以在许多函数中使用。由于C语言不允许在一个函数中定义其它函数,因此函数本身只能是“外部的”。 由于C语言代码是以文件为单位来组织的,在一个源程序所有源文件中,一个外部变量或函数只能在某个文件中定义一次,而其它文件可以通过extern声明来转载 2016-09-22 15:41:53 · 427 阅读 · 1 评论 -
C++ STL中Map的按Key排序和按Value排序
map是用来存放键值对的数据结构,可以很方便快速的根据key查到相应的value。假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择。 我们这样定义,map,其中学生姓名用string类型,作为Key;该学生的成绩用int类型,作为value。这样一来,我们可以根据学生姓名快速的查找到他的成绩。 但是,我们除了希望能够查询某转载 2016-09-06 11:32:36 · 466 阅读 · 0 评论 -
智能指针学习
包含指针的类需要特别注意复制控制,原因是复制指针时只是复制了指针中的地址,而不会复制指针指向的对象! 将一个指针复制到另一个指针时,两个指针指向同一对象。当两个指针指向同一对象时,可能使用任一指针改变基础对象。类似地,很可能一个指针删除了一对象时,另一指针的用户还认为基础对象仍然存在。指针成员默认具有与指针对象同样的行为。大多数C++类采用以下三种方法之一管理指针成员:原创 2016-09-13 10:44:03 · 501 阅读 · 0 评论 -
动态规划之背包问题(一)
作者:Hawstein出处:http://hawstein.com/posts/dp-knapsack.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。一切都要从一则故事说起。话说有一哥们去森林里玩发现了一堆宝石,他数了数,一共有n个。 但他身上能装宝石转载 2016-08-11 15:10:52 · 460 阅读 · 0 评论 -
有关C++模板(template)的编译错误“error LNK2019: 无法解析的外部符号”的分析
转自:http://blog.youkuaiyun.com/fengyhack/article/details/39296411按照通常的习惯,我们这样设计一个类或者结构(体):在头文件(*.h *.hh *.hpp *.hxx)中声明成员(或属性)和方法(假设为MyClass.hpp),在源文件(*.c *.cc *.cpp *.cxx)中包含该头文件(#in转载 2016-08-23 11:09:29 · 8251 阅读 · 3 评论 -
C++ this 指针 浅析
【摘要】本文分三部分。第一部分this指针的的产生原因,即为了让不同对象调用同一函数时,通过this指针来对不同对象的地址加以区别实现函数共用。第二部分讲述this指针的使用,函数的返回值为对象本身或者函数的输入参数与成员变量相冲突时都需要this指针帮助实现。第三部分,讲述this指针几个常见的易混淆的问题。【正文】一. 为什么会有this定义一个转载 2016-08-10 19:28:45 · 663 阅读 · 0 评论 -
C++异常(1) - auto_ptr智能指针的用法
C++中指针申请和释放内存通常采用的方式是new和delete。然而标准C++中还有一个强大的模版类就是auto_ptr,它可以在你不用的时候自动帮你释放内存。下面简单说一下用法。[cpp] view plain copy用法一: std::auto_ptrm_example(new MyClass()); 用法二: std::auto_ptrm_exampl转载 2016-09-01 16:30:39 · 329 阅读 · 0 评论 -
0长度数组(柔性数组)
在日常的编程中,有时候需要在结构体中存放一个长度动态的字符串,一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该字符串所在的动态内存空间,例如:[cpp] view plain copy print?typedef struct test { int a; double b;转载 2016-07-28 20:27:39 · 575 阅读 · 0 评论 -
errno、stderr、perror函数和strerror函数
errno表示错误代码。 记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。系统每一次出错都会对应一个出错代码,例如12表示“Cannot allocate memory"。stderr是linux(unix)标准出错输出。linux中的一个进程启动时,都会打开三个文件:标准输入、标准输出和标准出错处理。通常这三个文件都与终端联系。这三个文件分别对应文件描述符转载 2016-07-27 19:42:55 · 8716 阅读 · 1 评论 -
const 在基本语言中的总结
一、Const作用如下表所示:No.作用说明参考代码1可以定义const常量 const int Max = 100; 2便于进行类型检查const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替转载 2016-06-12 20:16:00 · 479 阅读 · 0 评论 -
C++ Primer 15.1 面向对象的三个基本特征
本章我们主要学习C++中面向对象的三个基本特征是:封装、继承、多态。封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在转载 2016-06-03 19:04:17 · 351 阅读 · 0 评论 -
C++ Primer 第十四章 重载操作符与转换
14.1 重载操作符的定义 操作符(+ ,- , * , / , = , )可以被内置类型使用,比如两个整数相加或相减,两个字符串相加,两个数组比较大小等等。自定义类默认是不能使用大多数操作符的。自定义类是复合类型,相加或想减或比较大小并没有相应的规则匹配:两个类相加等于什么? 两个类如何确定谁大谁小? C++允许我们通过重载运算符的技术让自定义对象支持这些操作。我们可以定义重载规转载 2016-06-03 11:00:19 · 321 阅读 · 0 评论 -
C++ Primer复制控制 13.3 析构函数
如果类需要析构函数,则它也需要赋值操作符和复制构造函数,这是一个有用的经验法则。这个规则常称为三法则,指的是如果需要析构函数,则需要所有这三个复制控制成员。 复制构造函数或赋值操作符不同,编译器总是会为我们合成一个析构函数。合成析构函数按对象创建时的逆序撤销每个非static成员,因此,它按成员在类中声明次序的逆序撤销成员。对于类类型的每个成员,合成析构函数调用该成员的析构转载 2016-06-01 20:55:28 · 398 阅读 · 0 评论 -
C++ Primer复制控制 13.2 赋值操作符
在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作。如果对象在申明的同时马上进行的初始化操作,则称之为拷贝运算。例如:class1 A("af"); class1 B=A; 此时其实际调用的是B(A)这样的浅拷贝操作。 如果对象在申明之后,在进行的赋值运算,我们称之为赋值运算。例如: class1 A("af"); class1 B;转载 2016-06-01 19:54:13 · 266 阅读 · 0 评论 -
C++ Primer 类 12.4 explicit 构造函数
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class String {String ( const char* p ); // 用C风格的字符串p作为初始化值//…}String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”转载 2016-05-31 21:55:17 · 324 阅读 · 0 评论 -
C++ Primer 类 12.1-12.2 this ,定义
12.1 类的定义和声明 类由类成员组成。类成员包括属性,字段,成员函数,构造函数,析构函数等组成。 类设计应该遵从抽象封装性。 类抽象性指对于类的使用者来说只需知道类接口即可使用类功能。类的具体实现由设计者负责。即使某个功能发生了变更但由于使用者是以接口方式调用类所以用户代码无需做任何修改。 类封装性指类用户只需知道类的功能无需了原创 2016-05-30 14:59:04 · 322 阅读 · 0 评论 -
C++ Primer 类 12.4 默认构造函数
默认构造函数默认的构造函数是指为所有参数都提供了默认值的构造函数,通常是指无参的构造函数。比如下面的类Test,它的默认构造函数就是Test()。class Test{public: Test(){} // default constructor} ;如果你没有为你的类提供任何构造函数,那么编译器将自动为你生成一个默认的无参构造函数。一旦你为你的类定义了构造函数,转载 2016-05-30 21:39:20 · 289 阅读 · 0 评论 -
关于typedef的用法总结
转自:http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html#top,有时间自己再看看评论,琢磨一下。不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些C/C++的学习者的博转载 2016-05-06 16:03:54 · 399 阅读 · 0 评论 -
C语言中的移位操作
C语言中的移位操作,内容不多。不过有些地方你不注意,就疏忽了。先做两个小题先。(1)unsigned char x=3;x>1是多少?(2)char x=3;x>1是多少?(3)char x=-3;x>1是多少?3写成二进制数是00000011;-3写成二进制数是(补码)11111101。程序执行的时候,操作的是数值的编码表示,也就是数值在内存中的二进制表示。比转载 2016-05-05 21:30:42 · 9949 阅读 · 0 评论 -
C语言文件读写操作中缓冲区问题和setbuf函数详解
清除和设置文件缓冲区(1).清除文件缓冲区函数: int fflush(FILE *stream); int flushall(); fflush()函数将清除由stream指向的文件缓冲区里的内容,常用于写完一些数据后,立即用该函数清除缓冲区,以免误操作时,破坏原来的数据。 flushall()将清除所有打开文件所对应的文件缓冲区。(2).设置文件缓冲区函数 void setbu转载 2016-05-03 15:53:46 · 10077 阅读 · 2 评论 -
友元类与友元函数的继承与传递问题
C++ Primer中有如下描述:友元关系不能被继承,基类的友元对派生类没有特殊的访问权限。 然而通过实践发现,VS编译器并没有安装上述描述来处理,下面的规则与上述描述相悖,却符合VS编译器的处理规则。 注:有待通过g++编译器来验证。验证也是全部通过。1 友元类的继承问题1.1一个友元类的派生类,可以通过其基类接口去访问设置其基类为友元类的转载 2016-06-04 16:00:19 · 624 阅读 · 0 评论 -
C++ Primer 面向对象编程 15.2 基类和派生类 virtual
写了一个小程序来复习 基类和派生类 知识1.item_base.h#pragma once#include #include using namespace std;class item_base{public: explicit item_base( const string &isb = "base" , const double &pri = 1.0); /*原创 2016-06-04 16:03:08 · 684 阅读 · 0 评论 -
C++ Primer 面向对象编程 15.3 基类派生类相互转换 15.4. 构造函数和复制控制
1.将对象传给希望接受引用的函数时,引用直接绑定到该对象,虽然看起来在传递对象,实际上实参是该对象的引用,对象本身未被复制,并且,转换不会在任何方面改变派生类型对象,该对象仍是派生类型对象。将派生类对象传给希望接受基类类型对象(而不是引用)的函数时,情况完全不同。在这种情况下,形参的类型是固定的——在编译时和运行时形参都是基类类型对象。如果用派生类型对象调用这样的函数,则该派生类对象的基类部分原创 2016-06-04 16:35:32 · 467 阅读 · 0 评论