代码改变世界

随笔分类 -  C++

c++ 静态多态与动态多态

2013-09-05 23:28 by youxin, 1597 阅读, 收藏, 编辑
摘要: 多态polymorphism是指具有多种形态的情况,它能根据单一的标记关联不同的行为。多态是面向对象程序设计的基础。在面向对象程序设计中的多态是一种运行时的多态。C++中有两种多态,称为动多态(运行时多态)和静多态(编译时多态),而静多态主要通过模板来实现,宏也是实现静多态的一种途径。其实在做软件设计时静多态的威力也是非常强大的,只不过我们经常对它疏忽了而已。 动多态的设计思想:对于相关的对象类型,确定它们之间的一个共同功能集,然后在基类中,把这些共同的功能声明为多个公共的虚函数接口。各个子类重写这些虚函数,以完成具体的功能。客户端的代码(操作函数)通过指向基类的引用或指针来操作这些对象,对. 阅读全文

C++的类型萃取技术

2013-09-05 23:13 by youxin, 825 阅读, 收藏, 编辑
摘要: 应该说,迭代器就是一种智能指针,因此,它也就拥有了一般指针的所有特点——能够对其进行*和->操作。但是在遍历容器的时候,不可避免的要对遍历的容器内部有所了解,所以,设计一个迭代器也就自然而然的变成了数据结构开发者的一个义务,而这些iterators的表现都是一样的,这种内外的差异,对用户来说,是完全透明的,第一部分 为什么要有萃取技术既然是一种智能指针,iterator也要对一个原生指针进行封装,而问题就源于此,当我们需要这个原生指针所指对象的类型的时候(例如声明变量),怎么办呢?Case1对于函数的局部变量这种情况我们可以采用模版的参数推导,例如:template void func( 阅读全文

STL 全特化/偏特化

2013-09-05 22:28 by youxin, 824 阅读, 收藏, 编辑
摘要: templateclass Compare{public: static bool isEqual(const T& lh,const T& rh) { return lh==rh; }}; 这是一个用于比较的类模板,里面可以有多种用于比较的函数, 以IsEqual为例。一、特化为绝对类型 也就是说直接为某个特定类型做特化,这是我们最常见的一种特化方式, 如特化为float, double等templateclass Compare{public: static bool isEqual(const float &lh,const float& rh) ... 阅读全文

侯捷C++ Type traits(类型萃取

2013-09-05 21:53 by youxin, 2541 阅读, 收藏, 编辑
摘要: 泛型編程編出來的代碼,適用於任何「吻合某種條件限制」的資料型別。這已成為撰寫可復用代碼時的一個重要選擇。然而,總有一些時候,泛型不夠好 — 有時候是因為不同的型別差距過大,難以產生一致的泛化實作版本。這個時候 traits(品质,特性意思) 技術就變得相當重要。這種技術可以將那些需要被納入考量的型別性質以一種 type by type 的原則,封裝於一個 traits class 內,於是可以將「由於型別之間的差異,必須撰寫出來以備用」的代碼體積降至最低,並使泛用代碼的體積提昇到最高。考慮一個例子:當我們處理字元字串(character strings)時,常見的一個操作行為就是決定「以 nu 阅读全文

stl 迭代子的失效

2013-09-05 16:43 by youxin, 551 阅读, 收藏, 编辑
摘要: 迭代子是STL中很重要的特性,但是其很脆弱(我个人认为),因为使用它的条件很苛刻,一不小心就失效了。其在两中情况下可能会失效。1.当容器有插入操作时在初始化了迭代子后,如果容器有插入操作时,迭代子可能失效。#include #include using namespace std;void main(){vector vecobj(10,5);vector::iterator iter=vecobj.begin();vecobj.insert(iter,6);for(;iter!=vecobj.end();iter++){cout#include using namespace std;int 阅读全文

c++ bitset使用

2013-09-03 19:27 by youxin, 2026 阅读, 收藏, 编辑
摘要: A bitset is a special container class that is designed to store bits (elements with only two possible values: 0 or 1,trueorfalse, ...).bitset是一个特殊的容器专... 阅读全文

cout输出各种进制

2013-09-03 19:15 by youxin, 572 阅读, 收藏, 编辑
摘要: cout使用:int main(){int a=10;cout(a)<<endl;getchar();return 0;}C++ 操作符注:下面的scientific 和 fixed不能同时使用double a=123.456789012345;对a赋初值(1) cout<<a;输出: 123.456(2) cout<<setprecision(9)<<a;输出: 123.456789(3) cout<<setprecision(6);恢复默认格式(精度为6)(4) cout<< setiosflags(ios∷fixed 阅读全文

cout输出流的执行顺序

2013-09-03 19:11 by youxin, 495 阅读, 收藏, 编辑
摘要: 一道题目:#include using namespace std;int g = 0;templateint foo(){ int value = ++g; return value;}int main(){ cout () () () () ()的值为1,再计算foo()的值为2,。。。所以输出是4321。 阅读全文

内存对齐理解

2013-09-03 17:41 by youxin, 535 阅读, 收藏, 编辑
摘要: 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。vs默认是#pragma pack(8)注意gcc默认是#pragma pack(4),并且gcc只支持1,2,4对齐。。1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从 阅读全文

如果函数的参数是一个指针,不要指望用该指针去申请动态内存

2013-09-02 00:29 by youxin, 823 阅读, 收藏, 编辑
摘要: 如果函数的参数是一个指针,不要指望用该指针去申请动态内存。Test函数的语句GetMemory(str, 200)并没有使str 获得期望的内存,str 依旧是NULL,为什么?void GetMemory(char *p, int num){p = (char *)malloc(sizeof(char) * num);}void Test(void){char *str = NULL;GetMemory(str, 100); // str 仍然为 NULLstrcpy(str, "hello"); // 运行错误}毛病出在函数 GetMemory 中。编译器总是要为函数的 阅读全文

野指针?空指针?

2013-09-01 23:51 by youxin, 1640 阅读, 收藏, 编辑
摘要: 野指针指的是指向不可用内存的指针。任何指针变量在被创建时,不会自动成为NULL指针(空指针),其缺省值是随机的,所以,指针变量在创建的同时应当被初始化,或者将指针设置为NULL,或者让它指向合法的内存,而不应该放之不理,否则就会成为野指针。而同时由于指针被释放(free或delete)后,未能将其设置为为NULL,也会导致该指针变为野指针。虽然free和delete把指针所指的内存给释放掉了,但它们并没有把指针本身干掉,一般可以采用语句if (p != NULL)进行防错处理,但是if语句却起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。第三种造成野指针的原因是指针操作超越 阅读全文

STL deque详解

2013-08-27 22:34 by youxin, 2018 阅读, 收藏, 编辑
摘要: 英文原文:http://www.codeproject.com/Articles/5425/An-In-Depth-Study-of-the-STL-Deque-Container绪言这篇文章深入的角度认 识 STL deque 容器。这篇文章将讨论一些有关deque的情况,比如在何种情况下你可以用... 阅读全文

转:详细解说 STL 排序(Sort)

2013-08-27 21:31 by youxin, 273 阅读, 收藏, 编辑
摘要: 详细解说 STL 排序(Sort)详细解说 STL 排序(Sort)作者Winter详细解说 STL 排序(Sort)0 前言: STL,为什么你必须掌握1 STL提供的Sort 算法1.1 所有sort算法介绍1.2 sort 中的比较函数1.3 sort 的稳定性1.4 全排序1.5 局部排序1.6 nth_element 指定元素排序1.7 partition 和stable_partition2 Sort 和容器3 选择合适的排序函数4 小结5 参考文档一切复杂的排序操作,都可以通过STL方便实现!0 前言: STL,为什么你必须掌握对于程序员来说,数据结构是必修的一门课。从查找到排序 阅读全文

汉字所占字节数

2013-08-26 21:41 by youxin, 942 阅读, 收藏, 编辑
摘要: 在GBK编码中,一个汉字占2个字节,在UTF8编码中,一个汉字站2个字节,在vs2010中,文件编码一般是GBK,所以;char *s="中"; cout<<strlen(s)<<endl;输出:2 阅读全文

转:C++:从子类访问父类的私有函数

2013-08-26 16:17 by youxin, 5048 阅读, 收藏, 编辑
摘要: 众所周知,c和c++的数组都是不安全的,因为无论c还是c++都不提供数组边界检查功能,这使得数组溢出成为可能。从某个意义上说,c和c++是一种缺少监督的语言,然而这也正是其魅力所在。c++给予程序员更大的自由,相比于使用JAVA编程的束手束脚,c++程序员拥有了更大的权力,同时也拥有更多的机遇来玩弄一些技巧,比如说,从子类调用父类的私有函数。从子类调用父类的private函数?我没听错么?当然没有!尽管从各种c++书籍中我们得到的信息是子类从父类继承的仅有protected成员和public成员,而父类的private成员无法被子类继承,也无法被子类访问,但是当父类的private函数是一个虚 阅读全文

转: c++继承中的内存布局

2013-08-26 15:35 by youxin, 246 阅读, 收藏, 编辑
摘要: 英文原文:http://www.openrce.org/articles/files/jangrayhood.pdf翻译:http://blog.csdn.net/jiangyi711/article/details/4890889 阅读全文

转:30分钟掌握STL

2013-08-25 23:12 by youxin, 599 阅读, 收藏, 编辑
摘要: 三十分钟掌握STL这是本小人书。原名是《using stl》,不知道是谁写的。不过我倒觉得很有趣,所以化了两个晚上把它翻译出来。我没有对翻译出来的内容校验过。如果你没法在三十分钟内觉得有所收获,那么赶紧扔了它。文中我省略了很多东西。心疼那,浪费我两个晚上。译者:karycontact:karymay@163.netSTL概述STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组。要点STL算法作为模板函数提供。为了和其他组件相区别,在本书中ST 阅读全文

转:STL使用入门( Using STL)

2013-08-25 23:10 by youxin, 365 阅读, 收藏, 编辑
摘要: 1 介绍我最开始结束C++编程是从DOS下的Borland C++开始的。那时他们在最新版本3.1中就包含了一套模板库用来做collection.那真是个好东东。当我开始使用Visual C++ 2.2的时候,我甚至试图去把Borland公司的collection模板库嵌入到Visual C++中去,但是没有成功。唯一可行的解决方案是切换到微软(Microsoft)的collection上,它是MFC的一部分分。但总是有些问题,其原因如下:一旦实现部分已经代码写完,很难从一种容器(container)类型切换到另外一种容器。不同容器的迭代器(Iterators)不一样。如果你在写一个DLL(动 阅读全文

i++和++i以及左值,右值

2013-08-25 22:54 by youxin, 3662 阅读, 收藏, 编辑
摘要: 左值(LValue)和右值(RValue)的一个快捷记法是赋值运算,左值是赋值运算左边的值,右值就是右边(=,=废话)。例如:int a = 5;a就是左值,5就是右值。当然,如果真是这么个含义,那么这概念就相当蛋疼了。其实不是这样的~~左值其实是对一块内存区域的引用(这个还不是C++中的int &a之类的引用),比如上边的a,就对应了一块内存区域(起始地址为&a,大小为sizeof(int))。更专业的定义在这里:Anobjectis a region of storage that can be examined and stored into. Anlvalueis an 阅读全文

c++继承构造子类调用父类构造函数的问题及关于容器指针的问题及当容器里储存指针时,记得要手动释放

2013-08-25 22:01 by youxin, 1162 阅读, 收藏, 编辑
摘要: 看下面的一个问题:class Person{private: string name;public: Person(const string& s=""){ name=s;} string getName(){ return this->name;} virtual void print(){ coutage=age; } void print(){ cout v; Person *p1=new Student("name1",10); v.push_back(p1); v[0]->print();只输出10,为什么?为什么父类的na 阅读全文
上一页 1 2 3 4 5 6 7 8 9 ··· 11 下一页