代码改变世界

随笔分类 -  C++

转:STL容器里存放对象还是指针

2013-08-25 21:06 by youxin, 2394 阅读, 收藏, 编辑
摘要: 一.问题的引出:容器可以存放对象,可以存放指针,这里要谈的是两者的使用问题。就是什么时候存放对象更好,什么时候存放指针更好?二.问题的分析过程:1.首先说下stl容器的工作方式对于内建类型(int float char等),容器的工作方式是纯粹的位拷贝,这里没有什么需要多说的。对于自定义的对象,容器容纳了对象(比如通过insert或push_back等),但容器中存放的对象不是你给它们的那个对象,因为两个对象在内存中的位置不一样。此外,当你从容器中获取一个对象时,你所得到的对象不是容器里的那个对象。取而代之的是,当你向容器中添加一个对象(比如通过insert或push_back等),进入容器的 阅读全文

STL assign 和swap

2013-08-25 20:19 by youxin, 1020 阅读, 收藏, 编辑
摘要: 首先看下在整个container上面的复制.c1=c2可以等同于c1.erase(c1.begin(),c1.end()) //delete all elems in c1c1.insert(c1.begin(),c2.begin(),c2.end);在赋值后,c1和c2完全相等,即使他们曾经的size不相等,赋值后也相等了。=和assign操作会是左边的容器的迭代器失效。然而,swap不会使迭代器失效。after swap,iteratros continue to refer to thesame elements,although those elements are now in a 阅读全文

STL insert()使用

2013-08-25 19:50 by youxin, 805 阅读, 收藏, 编辑
摘要: 下面我以vector的insert()为例:c++ 98:single element (1)iterator insert (iterator position, const value_type& val);fill (2) void insert (iterator position, size_type n, const value_type& val);range (3)template void insert (iterator position, InputIterator first, InputIterator last);Insert elementsThe 阅读全文

STL front() ,back()和begin(),end()区别

2013-08-25 19:12 by youxin, 1158 阅读, 收藏, 编辑
摘要: 首先看看vector里面的: reference front();const_reference front() const;queue里面的; value_type& front();const value_type& front() const;一般,reference定义为value_type& ,const_reference定义为const value_type&,所以上面2者是等同的。也就是front()返回第一个元素的引用,back()返回最后一个元素的引用。而begin()和end()返回的是迭代器: iterator begin();const 阅读全文

c++ ptrdiff_t 类型

2013-08-25 18:55 by youxin, 10956 阅读, 收藏, 编辑
摘要: ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。ptrdiff_t定义在stddef.h(cstddef)这个文件内。ptrdiff_t通常被定义为long int类型。ptrdiff_t定义在C99标准中。ptrdiff_t标准库类型(library type)ptrdiff_t 与 size_t 类型一样,ptrdiff_t也是一种与机器相关的类型,在 cstddef 头文件中定义。size_t 是unsigned 类型,而 ptrdiff_t 则是 signed 整型[1]。size_t这两种类型的差别体 阅读全文

C++惯用法:通过成员模板实现隐式转换(Coercion 强迫 by Member Template)

2013-08-25 05:49 by youxin, 540 阅读, 收藏, 编辑
摘要: IntentTo increase the flexibility of a class template's interface by allowing the class template to participate in the same implicit type conversions (coercion) as its parameterizing types enjoy.Also Known As[edit]Motivation[edit]It is often useful to extend a relationship between two types to c 阅读全文

c++ 复制构造函数和赋值函数

2013-08-25 03:27 by youxin, 352 阅读, 收藏, 编辑
摘要: c++ 自动提供了下面这些成员函数1默认构造函数2.复制构造函数3.赋值操作符4.默认析构函数5.地址操作符赋值构造函数copy construtor 用于将一个对象复制到新创建的对象中,也就是说,它用于初始化过程中,而不是常规的赋值过程中。类的copy sconstrutor函数原型通常如下:ClassName(const ClassName & );对于复制构造函数,需要知道2点:何时调用和有何功能。新建一个对象并将其初始化为同类现有对象时,复制构造函数都将调用。这在很多情况下都有可能发生,最常见的情况是将新对象显示地初始化为现有的对象,例如motto是一个String对象,则下面 阅读全文

STL string 模拟

2013-08-25 02:21 by youxin, 335 阅读, 收藏, 编辑
摘要: 下面的代码来自c++ primer plus第5版第12章,书中代码写的非常好:// string1.h -- fixed and augmented string class definition#include using std::ostream;using std::istream;#ifndef STRING1_H_#define STRING1_H_class String{private: char * str; // pointer to string int len; // length of string ... 阅读全文

单链表为什么要设置头结点

2013-08-24 15:57 by youxin, 13422 阅读, 收藏, 编辑
摘要: 链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点,其实就是上一个的后继指针指向的位置。这里有个地方要注意,就是对头指针概念的理解,这个很重要。“链表中第一个结点的存储位置叫做头指针”,如果链表有头结点,那么头指针就是指向头结点数据域的指针。画一个图吧。头指针就是链表的名字。头指针仅仅是个指针而已。头结点是为了操作的统一与方便而设立的,放在第一个元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等)。有了头结点后,对在第一个元素结点前插入结点和删除第一个结点,其操作与对其它结点的操作统一了。首元结点也就是第一个元素 阅读全文

转:C++中引用传递与指针传递区别

2013-08-20 14:58 by youxin, 356 阅读, 收藏, 编辑
摘要: 从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为 阅读全文

c++ 对象作为参数传递

2013-08-20 14:54 by youxin, 8414 阅读, 收藏, 编辑
摘要: 对象作为参数传递时是传值。把实参的对象赋值给形参。因此效率有点低。c++传参方式可以分为2种:1.传值 (指针作为参数,本质上也只是把地址作为值传递了而已)。2.传引用。所以,一切传递方式不是传引用就是传值。不像javascript,如果是原始数据类型则传值,如果是对象数据类型则传引用。如果函数的返回值是一个对象,有些场合用“引用传递”替换“值传递”可以提高效率。而有些场合只能用“值传递”而不能用“引用传递”,否则会出错。例如:classString{⋯//赋值函数String&operate=(constString&other);//相加函数,如果没有friend修饰则只许 阅读全文

转:Linus:利用二级指针删除单向链表

2013-08-18 19:07 by youxin, 199 阅读, 收藏, 编辑
摘要: 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多,并加入了插图)Linus大婶在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level coding。下面是Linus的教学原文及翻译——“At the opposite end of the spectrum, I actually wish more people understood the really core low-level kind of coding. Not b 阅读全文

转:Linus:利用二级指针删除单向链表

2013-08-11 15:30 by youxin, 367 阅读, 收藏, 编辑
摘要: 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多,并加入了插图)Linus大婶在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level coding。下面是Linus的教学原文及翻译——“At the opposite end of the spectrum, I actually wish more people understood the really core low-level kind of coding. Not b 阅读全文

转:C++ 匿名namespace的作用以及它与static的区别

2013-08-09 20:12 by youxin, 525 阅读, 收藏, 编辑
摘要: 匿名namespace的作用以及它与static的区别一。匿名namespace的作用在C语言中,如果我们在多个tu(translationunit)中使用了同一个名字做为函数名或者全局变量名,则在链接阶段就会发生重定义错误,为了解决这个问题,我们可以在定义这些标识符(identifier)的时候加上static关键字修饰以限制它只在一个tu范围内可见。C++继承了C语言中static关键字的这个用途,我们依旧可以使用static来避免多个tu中使用同一个标识符带来的重定义问题。此外C++还提供了另一种特有的方式,那就是匿名namespace:一个没有指定名字的namespace被称为一个匿名 阅读全文

c++ namespace命名空间详解

2013-08-09 20:00 by youxin, 1360 阅读, 收藏, 编辑
摘要: What is a namespace?A namespace defines an area of code in which all identifiers are guaranteed to be unique. By default, all variables and functions are defined in theglobal namespace. For example, take a look at the following snippet:12345int nX = 5;int foo(int nX){return -nX;}Both nX and foo() ar 阅读全文

first-,second- and third-class value

2013-08-02 09:40 by youxin, 446 阅读, 收藏, 编辑
摘要: Incomputer science, aprogramming languageis said to havefirst-class functionsif it treatsfunctionsasfirst-class citizens. Specifically, this means the language supports passing functions as arguments to other functions, returning them as the values from other functions, and assigning them to variabl 阅读全文

c++ 友元函数

2013-07-29 16:03 by youxin, 845 阅读, 收藏, 编辑
摘要: 友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。定义格式(c++)friend ();分清成员函数,非成员函数和友元函数成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。所以,如果有个函数必须进行动态绑定(见条款38),就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。关于这一点就这么简单。如果函数不必是虚拟的,情况就稍微复杂一点。(条款38: 决不要重新定义继承而来的缺省参数值)更多,百度百科:htt.. 阅读全文

结构体struct和联合体union以及enum枚举体5的区别

2013-07-02 19:32 by youxin, 1040 阅读, 收藏, 编辑
摘要: 下面来自wikipedia:Incomputer science, aunionis avaluethat may have any of several representations or formats; or it is adata structurethat consists of avariablewhich may hold such a value. Someprogramming languagessupport specialdata types, calledunion types, to describe such values and variables. In ot 阅读全文

c++没有接口的释疑

2013-05-15 20:52 by youxin, 1374 阅读, 收藏, 编辑
摘要: 标准C++中有没有接口和纯抽象类的概念?Bjarne Stroustrup:我在对人们解释这个问题的过程中遇到了很多问题,而且我也一直不能理解为什么让人们理解这个问题是如此困难。自C++出现那天起,就存在着包含数据成员的类和不包含数据成员的类。在过去,人们强调利用一个最基础的设施以及该设施内部的东西来构造软件系统,而那个“最基本的设施”通常就是抽象基类。从80年代中叶到80年代末,那些仅由虚拟函数组合而成的类通常都被称为ABCs(Abstract Base Classes 抽象基类)。1987年,我在C++中加入了纯虚函数的概念,一个纯虚函数必须被其派生类重写。借助此概念,你可以在一个C++类 阅读全文

java/c++钻石问题(菱形继承问题) 虚继承

2013-03-15 13:24 by youxin, 2848 阅读, 收藏, 编辑
摘要: 看下面的一幅图:In the diagram above, we have 2 classes B and C that derive from thesameclass – which would be class A in the diagram above. We also have clas... 阅读全文