
C C++ STL
文章平均质量分 72
geeeeeeee
这个作者很懒,什么都没留下…
展开
-
函数的参数传递
函数的参数传递所有的函数都使用在程序运行栈run-time stack 中分配的存储区,该存储区一直保持与该函数相关联,直到函数结束为止那时存储区将自动释放以便重新使用,该函数的整个存储区被称为活动记录activation record系统在函数的活动记录中为函数的每个参数都提供了存储区。参数的存储长度由它的类型来决定。参数传递是指用函数调用的实参值来初始化函数参数存储区的过程。C++中参数传原创 2009-01-16 16:34:00 · 664 阅读 · 0 评论 -
Effective C++摘要《第3章:构造函数、析构函数、赋值操作符》20090207
===条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符===对于有些类,当实现拷贝构造函数和赋值操作符非常麻烦的时候,特别是可以确信程序中不会做拷贝和赋值操作的时候,去实现它们就会相对来说有点得不偿失。这种情况下,很简单,照本条款的建议去做:可以只声明这些函数(声明为private成员)而不去定义(实现)它们这就防止了会有人去调用它们,也防止了编译器去生成它们===条款12:原创 2009-02-07 21:49:00 · 672 阅读 · 0 评论 -
Effective C++摘要《第5章:类和函数:实现》20090209
===条款29: 避免返回内部数据的句柄===假设b是一个const string对象:class string {public: string(const char *value); // 具体实现参见条款11 ~string(); // 构造函数的注解参见条款m5 operator char *() const;原创 2009-02-09 19:14:00 · 781 阅读 · 0 评论 -
Effective C++摘要《第6章:继承和面向对象设计》20090210
===条款35: 使公有继承体现 "是一个" 的含义===当写下类D("Derived" )从类B("Base")公有继承时,你实际上是在告诉编译器(以及读这段代码的人):类型D的每一个对象也是类型B的一个对象,但反之不成立;class Student: public Person { ... };在C++世界中,任何一个其参数为Person类型的函数(或指针或引用)可以实际取一个Student对原创 2009-02-10 01:46:00 · 788 阅读 · 0 评论 -
Effective C++摘要《第7章:杂项 真正认识C++》20090210
===条款45: 弄清C++在幕后为你所写、所调用的函数===一个空类什么时候不是空类? ---- 当C++编译器通过它的时候。如果你没有声明下列函数,体贴的编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。换句话说,如果你这么写:class Empty{}原创 2009-02-10 16:32:00 · 788 阅读 · 0 评论 -
c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
dynamic_cast: 通常在基类和派生类之间转换时使用,run-time castconst_cast: 主要针对const和volatile的转换. static_cast: 一般的转换,no run-time check.通常,如果你不知道该用哪个,就用这个。 reinterpret_cast: 用于进行没有任何关联之间的转换,比如一个字符指针转换为一原创 2008-12-02 12:30:00 · 23726 阅读 · 4 评论 -
靠,#include都要忘了
头文件通过 include 预处理器指示符(preprocessor include directive) 而成为我们程序的一部分。预处理器发现 #include 指令后,就会寻找后跟的文件名并把这个文件的内容包含到当前文件中。被包含文件中的文本将替换源代码文件中的#include 指令, 就像你把被包含文件中的全部内容键入到源文件中的这个位置一样。原创 2008-12-05 12:12:00 · 659 阅读 · 0 评论 -
传值和传引用
传值和传引用 在现在常用的文本编程语言(C++, Java, C#)中,调用子函数时的传参方式主要是传引用方式,就是说,告诉被调用的函数的是参数所在的位置,而不是参数的数据。C++ 为了保持和 C 语言的兼容,一般的简单数据还是使用值传递,但对于大块的数据,比如数组,字符串,结构,类等等,也基本上都是引用形式传递的。 值传递的方式的缺点是显而易见的:每次调用子函数的时候,需要把原创 2008-12-07 12:50:00 · 1270 阅读 · 0 评论 -
拷贝构造函数和赋值操作符operator=分别在什么时候被调用?
// cctest.cpp: Simple program to illustrate a problem calling // operator= from copy constructor. This can result in member // objects getting initialized twice. To compile: cl cctest.cpp //原创 2008-12-11 14:46:00 · 1233 阅读 · 0 评论 -
如何理解LPCTSTR、TCHAR
http://ivanvic.blogbus.com/logs/1787439.html 如何理解LPCTSTR, L表示long指针, 这是为了兼容Windows 3.1等16位操作系统遗留下来的, 在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。P表示这是一个指针C表示是一个常量T在Win32环境中, 有一转载 2008-12-12 13:30:00 · 1982 阅读 · 0 评论 -
CString 成员函数使用方法
关于std::string的用法见http://www.stlchina.org/twiki/bin/view.pl/Main/STLDetailStringhttp://blog.chinaunix.net/u2/82668/showart_1328219.htmlhttp://kongjian.baidu.com/sheng00/blog/item/14915aec59e586d1转载 2008-12-12 13:48:00 · 995 阅读 · 0 评论 -
MFC数据类型(Data Type)
BOOL:Boolean值(布尔值,不是TRUE就是FALSE) BSTR:32-bit字符指针BYTE:8-bit整数,未带正负号COLORREF:32-bit数值,代表一个颜色值DWORD:32-bit整数,未带正负号LONG:32-bit整数,带正负号LPARAM:32-bit数值,作为窗口函数或callback函数的一个参数LPCSTR:32-bit指针,指向一转载 2008-12-12 14:02:00 · 637 阅读 · 0 评论 -
CString、std::string格式化字符串
=============================CString================================== 当有多个字串时,比如 int n1 = 5; int n2 = 10; char sz1[] = "abcdefg"; char sz2[] = "hijklmn";原创 2008-12-12 14:30:00 · 8677 阅读 · 1 评论 -
string -- CString -- char * 转换 以及GetBuffer、ReleaseBuffer
1 string to CString CString.format("%s",string.c_str()); 2 CString to stringstring str(CString.GetBuffer());CString.ReleaseBuffer()3 string to char *char *p=string.c_str();4 char *原创 2008-12-12 14:46:00 · 2389 阅读 · 0 评论 -
文件内容替换---郁闷的结果
今天要写一个批量替换文件某一行内容的小程序,开始的想法是直接在文件里操作(不生成新文件),于是写下如下代码(对单个文件操作)/* string m_strRepSrc;//被替换行中的标识字符串 vc98/include/string m_strRepDes;//替换成的字符串 F:/Program Files/software/Microsoft Visual Studio原创 2008-12-12 23:49:00 · 1627 阅读 · 0 评论 -
ofstream ifstream 文件操作
c++中输出和输入导屏幕和键盘的类别声明包含再标题文件中,而磁盘类文件的 I/O则声明再包含标题文件内。输入和输出格式:输出到磁盘 ofsteam 识别字(“文件名”) 从磁盘读文件 ifsteam 识别字("文件名“)例如: ofstream outfile("data.txt"); //写入到磁盘的data.txt中格式化输入输出:1 整数数据的输入输出整数数据存储再磁盘内,每个文字各占转载 2008-12-15 15:42:00 · 1538 阅读 · 0 评论 -
如何使用一个输出流迭代器 ostream_iterator
对于迭代器,有另一种方法使用流和标准函数。理解的要点是将输入/输出流作为容器看待。因此,任何接受迭代器参数的算法都可以和流一起工作。 Listing 4. outstrm.cpp#include #include // Need random(), srandom()#include // Need time()#include // Need sort(), cop转载 2008-12-17 14:36:00 · 793 阅读 · 0 评论 -
cout wcout ifstream 处理中文时的问题
1.cout在设计时具有智能判断功能,不论是char*类型,还是string类型,都能得到正确的结果。 2.wcout指定要输出宽字符,每个字符占两个字节,我们所用的字符串如:"hello",要想让其按宽字符处理,必须加L,即L"hello",中文也是这样要求。 3.GCC编译器不支持wcout关键字。 a、wcout输出中文时,无结果输出b、ifstream读取中文路径时,并不能正原创 2008-12-25 22:00:00 · 1431 阅读 · 1 评论 -
Effective C++摘要《1、2章:从c转向c++、内存管理》20090206
===条款1:尽量用const和inline而不用#define===这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分有了const和inline,你对预处理的需要减少了,但也不能完全没有它。抛弃#include的日子还很远,#ifdef/#ifndef在控制编译的过程中还扮演重要角色。===条款2:尽量用而不用===iostream库的类和函数原创 2009-02-06 21:07:00 · 993 阅读 · 0 评论 -
static、extern、volatile的用法
static的用法: 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。 用法1:函数内部声明的static变量,可作为对象间的一种通信机制 如果一局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象将只在转载 2009-02-06 17:22:00 · 3839 阅读 · 0 评论 -
Effective C++摘要《第4章:类和函数:设计与声明》20090209
===条款18: 争取使类的接口完整并且最小======条款19: 分清成员函数,非成员函数和友元函数===结论:假设f是想正确声明的函数,c是和它相关的类·虚函数必须是成员函数。如果f必须是虚函数,就让它成为c的成员函数。·operator>>和operator>或operator·只有非成员函数对最左边的参数进行类型转换。如果f需要对最左边的参数进行类型转换,让f成为非成员函数。如果f还需要访原创 2009-02-09 13:38:00 · 636 阅读 · 0 评论 -
顺序容器list vector
一、结构vector 表示一段连续的内存区域每个元素被顺序存储在这段内存中对vector 的随机访问(比如先访问元素5 然后访问15 然后再访问7 等等)效率很高因为每次访问离vector起始处的位移都是固定的但是在任意位置而不是在vector 末尾插人元素则效率很低因为它需要把待插入元素右边的每个元素都拷贝一遍类似地删除任意一个而不是vector的最后一个元素效率同样很低因为待删除元素右边的原创 2009-01-16 10:45:00 · 755 阅读 · 0 评论 -
c++ extern "C" 目的 原理 使用方法
C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。要点:1、与原创 2009-01-19 12:08:00 · 1033 阅读 · 0 评论 -
C++ primer 摘要《函数重载》20090120
===9.1.1 为什么要重载一个函数名===我们可能希望定义一组函数它们执行同样的一般性动作,但是应用在***不同的参数类型***上(注意是参数)===9.1.2 怎样重载一个函数名===1、如果两个函数的参数表中参数的个数或类型不同,则认为这两个函数是重载的2、当一个参数类型是const 或volatile 时,在识别函数声明是否相同时,并不考虑const 和volatile 修饰符// 声明原创 2009-01-20 16:50:00 · 700 阅读 · 0 评论 -
C++ primer 摘要《函数模板》20090120
===10.1 函数模板定义===模板参数可以是一个模板类型参数,它代表了一种类型也可以是一个模板非类型参数,它代表了一个常量表达式template //当函数模板min()被实例化时size 的值会被一个编译时刻已知的常量值代替Type min( Type (&arr) [size] ); // size 指定数组参数的大小并初始化一个 const int 值template Type原创 2009-01-20 17:15:00 · 1027 阅读 · 0 评论 -
堆 栈 程序 内存分配 详解
堆和栈的区别一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、转载 2009-01-19 14:38:00 · 1016 阅读 · 0 评论 -
C++ primer 摘要《extern、变量函数声明与定义、头文件、动态分配与释放》20090119
===***8.2全局对象与函数***======8.2.1声明和定义===在全局域中定义的对象,如果没有指定显式的初始值,则该存储区被初始化为0extern 声明不会引起内存被分配,它可以在同一文件中或同一程序的不同文件中出现多次.extern const double pi; //声明既指定了关键字extern 又指定了一个显式初始值的全局对象声明,将被视为该对象的定义编译器将会为原创 2009-01-19 17:01:00 · 3673 阅读 · 0 评论 -
引用初始化、左值右值、函数数组参数
l-value 与 r-value 区别左值是引用某个对象的表达式,就是可以放在赋值左边的东西,如:*(p+1)=7, 没有名字的变量(*(p+1)表达式一定是一个类型的对象)被赋值了,但左值并不一定能被赋值,因为左值可以引用某个常量。 所有的引用都是左值。 右值是表达式的值(不是引用),可以放在赋值右面。 所有的左值都可以是右值,反之不成立 int i, j, *p; i = 7;原创 2009-01-21 11:09:00 · 2155 阅读 · 0 评论 -
C++ primer 摘要《类成员》20090126
===13.3.5 const 和volatile 成员函数===const成员函数1.只有被声明为const 的成员函数才能被一个const 类对象调用const类对象不能调用非const成员函数(除构造函数析构函数外)2.对于在类体之外定义的const 成员函数,我们必须在它的定义和声明中同时指定关键字constclass Screen {public: bool isEqual( ch原创 2009-01-26 21:02:00 · 645 阅读 · 0 评论 -
C++ primer 摘要《类构造函数、析构函数、初始化》20090130
===14.2 类的构造函数===1.为构造函数指定实参有三种等价形式// 一般等价的形式Account acct1( "Anna Press" );Account acct2 = Account( "Anna Press" );Account acct3 = "Anna Press";acct3 的形式只能被用于指定单个实参的情形,对于两个以上的实参只能使用acct1 和acct2 的形式2原创 2009-01-30 14:56:00 · 1429 阅读 · 0 评论 -
C++ primer 摘要《异常处理》20090122
===11.1 抛出异常===异常是个对象,throw 表达式后要跟一个对象 throw popOnEmpty(); //popOnEmpty是个类,这里使用了构造函数构造对象虽然异常往往是class 类型的对象,但是throw 表达式也可以抛出任何类型的对象 enum EHstate { noErr, zeroOp, negativeOp, severeError }; in原创 2009-01-22 16:41:00 · 775 阅读 · 0 评论 -
C++标准库智能指针(std::auto_ptr)
智能指针两大特性:1.构造栈对象的生命期控制堆上构造的对象的生命期2.通过release来保证auto_ptr对对象的独权.另必须使用显示构造 文章结构:一、剖析C++标准库智能指针(std::auto_ptr) 1.Do you Smart Pointer? 2.std::auto_ptr的设计原理 3.std::auto_ptr高级使用指南 4.你是否觉得st转载 2009-02-01 16:34:00 · 1421 阅读 · 0 评论 -
C++ primer 摘要《操作符重载、用户定义转换、重载解析》20090201
===15.1.1 类成员与非成员===1、怎样决定是把一个操作符声明为类成员还是名字空间成员a、如果一个重载操作符是类成员那么只有当跟它一起被使用的左操作数是该类的对象时,它才会被调用,如果该操作符的左操作数必须是其他的类型,那么重载操作符必须是名字空间成员b.C++要求赋值= 下标[] 调用() 和成员访问箭头-> 操作符必须被定义为类成员操作符,任何把这些操作符定义为名字空间成员的定义都会被原创 2009-02-01 21:57:00 · 1130 阅读 · 0 评论 -
C++ primer 摘要《局部类、嵌套类、类域》20090127
===13.6.2 使用指向类成员的指针===int (Screen::*pmfi)() = &Screen::height;Screen& (Screen::*pmfS)( const Screen& ) = &Screen::copy;Screen myScreen, *bufScreen;// 直接调用成员函数if ( myScreen.height() == bufScreen->heig原创 2009-01-27 16:45:00 · 1064 阅读 · 0 评论 -
operator new 和 operator delete
operator new 和 operator delete 让我们回过头去看看这样一个基本问题:为什么有必要写自己的operator new和operator delete?答案通常是:为了效率。缺省的operator new和operator delete具有非常好的通用性,它的这种灵活性也使得在某些特定的场合下,可以进一步改善它的性能。尤其在那些需要动态分配大量的但很小的对象的应用程转载 2009-02-01 18:27:00 · 997 阅读 · 0 评论 -
C++ primer 摘要《类继承、基类派生类、虚拟函数》20090202
===17.1 定义一个类层次结构===在派生表中指定的类必须首先被定义好,方可被指定为基类// 错误: Query 必须已经被定义class Query;class NameQuery : public Query { ... };===17.3 基类成员访问===1、类域、可视性class Diffident {public: void turn_aside(); // ...};原创 2009-02-02 18:28:00 · 1290 阅读 · 0 评论 -
C++ primer 摘要《多继承、虚拟继承》20090203
===18.2 多继承===基类构造函数被调用的顺序以类派生表中声明的顺序为准private继承的话,原来父类的public ,protected成员继承到子类中,并成为private类型成员; protected继承的话,原来父类的public ,protected成员继承到子类中,并成为protected类型成员; public继承的话,原来父类的public ,protected成员继承到子原创 2009-02-03 18:10:00 · 907 阅读 · 0 评论 -
C++ primer 摘要《RTTI、异常与继承、继承与重载》20090203
===19.1.1 dynamic_cast 操作符===dynamic_cast 操作符可以用来把一个类类型对象的指针转换成同一类层次结构中的其他类的指针同时,也可以用它把一个类类型对象的左值转换成同一类层次结构中其他类的引用如果针对指针类型的dynamic_cast失败则dynamic_cast 的结果是0 void company::payroll( employee *pe ){原创 2009-02-03 23:04:00 · 832 阅读 · 0 评论 -
循环包含的解决办法
只要没有在类A中定义类B的成员对象,就可以不用在类A头文件中包含类B的头文件,你可以以在类A中用一个指向类B对象的指针取代定义一个类B对象的方式实现,这样,你只要在类A的头文件中声明一下类A即可,该指针的初始化放到A的实现文件中去(如构造函数中用: pB = (B*) new B()),当然在类A的实现文件中还是要加上包含类A头件的指令。但这样已经解决了类A与类B的循环依赖原创 2008-12-26 16:57:00 · 996 阅读 · 0 评论