
C/C++学习笔记
文章平均质量分 69
rcbblgy
这个作者很懒,什么都没留下…
展开
-
sizeof
返回值类型:size_t三种用法: sizeof (type name); 计算一个类型的长度 sizeof (expr); 计算一个变量的长度 sizeof expr; 计算表达式返回值类型的长度原创 2008-10-24 15:39:00 · 370 阅读 · 0 评论 -
构造函数
构造函数是特殊的成员函数,与其他成员函数不同,构造函数和类同名,而且没有返回类型。而与其他成员函数相同的是,构造函数也有形参表(可能为空)和函数体。一个类可以有多个构造函数,每个构造函数必须有与其他构造函数不同数目或类型的形参。构造函数的形参指定了创建类类型对象时使用的初始化式。通常,这些初始化式会用于初始化新创建对象的数据成员。构造函数通常应确保其每个数据成员都完成了初始化。Sales_item原创 2008-11-06 16:47:00 · 746 阅读 · 0 评论 -
重载
如果两个函数声明的返回类型和形参表完全匹配,则将第二个函数声明视为第一个的重复声明。如果两个函数的形参表完全相同,但返回类型不同,则第二个声明是错误的: Record lookup(const Account&); bool lookup(const Account&); // error: only return type is different函数不能仅仅基于不同的返回类型而原创 2008-11-07 11:24:00 · 612 阅读 · 0 评论 -
深拷贝与浅拷贝
http://blog.chinaunix.net/u/25952/showart_274326.html 浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当 值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象拥有不同的转载 2008-11-07 14:43:00 · 1049 阅读 · 1 评论 -
重载函数参数的转换和匹配
为了确定最佳匹配,编译器将实参类型到相应形参类型转换划分等级。转换等级以降序排列如下:1、精确匹配。实参与形参类型相同。2、通过类型提升实现的匹配(第 5.12.2 节)。3、通过标准转换实现的匹配(第 5.12.3 节)。4、通过类类型转换实现的匹配(第 14.9 节将介绍这类转换)。类型提升或转换适用于实参类型可通过某种标准转换提升或转换为适当的形参类型情况。必须注意的一个重点是较小的整型提升原创 2008-11-07 15:14:00 · 3778 阅读 · 1 评论 -
指向函数的指针
函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关: // pf points to function returning bool that takes two const string references bool (*pf)(const string &, const string &);原创 2008-11-07 15:46:00 · 1524 阅读 · 0 评论 -
缓冲区
每个 IO 对象管理一个缓冲区,用于存储程序读写的数据。如有下面语句: os 系统将字符串字面值存储在与流 os 关联的缓冲区中。下面几种情况将导致缓冲区的内容被刷新,即写入到真实的输出设备或者文件:1、程序正常结束。作为 main 返回工作的一部分,将清空所有输出缓冲区。2、在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新。3、用操纵符(第 1.2.2原创 2008-11-13 17:45:00 · 922 阅读 · 2 评论 -
,操作符
逗号操作符的求解过程:首先计算它的每一个操作数,然后返回最右边操作数作为整个操作的结果。int i;while(cin>>i,iif(1,0) //条件恒为假if(0,1) //条件恒为真if(x,x,1) //x为任意,恒为真//a = 1, b = 1if(++a,a+b-2) //条件为真,++a使a = 2,于是a+b-2=1,先计算左侧值,最后再取最右的值原创 2008-11-13 16:20:00 · 515 阅读 · 0 评论 -
文件I/O
fstream 头文件定义了三种支持文件 IO 的类型:1、ifstream,由 istream 派生而来,提供读文件的功能。2、ofstream,由 ostream 派生而来,提供写文件的功能。3、fstream,由 iostream 派生而来,提供读写同一个文件的功能。这些类型都由相应的 iostream 类型派生而来,这个事实意味着我们已经知道使用 fstream 类型需要了解的大部分内容了原创 2008-11-13 18:11:00 · 957 阅读 · 0 评论 -
字符串流
iostream 标准库支持内存中的输入/输出,只要将流与存储在程序内存中的 string 对象捆绑起来即可。此时,可使用 iostream 输入和输出操作符读写这个 string 对象。标准库定义了三种类型的字符串流:istringstream,由 istream 派生而来,提供读 string 的功能。ostringstream,由 ostream 派生而来,提供写 string 的功能。st原创 2008-11-17 14:31:00 · 1751 阅读 · 0 评论 -
对象的复制
#include using namespace std;class test{public: int *pI; test() { pI = new int; } ~test() { delete pI; }};void tryit(){ test t1; *(t1.pI) = 5; test t2 =原创 2010-04-16 14:08:00 · 478 阅读 · 0 评论 -
MFC DestroyWindow
考虑单窗口情况: 假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create。则销毁窗口的调用次序: 1. 手工调用pWnd->DestroyWindow(); 2. DestroyWindow会发送WM_DESTROY; 3. WM_DESTROY对应的消息处理函数是OnDestroy(); 4. DestroyWindow会发送WM_NCDESTROY;转载 2011-06-27 16:20:00 · 4260 阅读 · 0 评论 -
对话框贴背景图的几种方法
<br />方法一:<br />处理ON_WM_ERASEBKGND消息,在OnEraseBkgnd里加如下代码<br /> CDC MemDC; //CBitmap对象 CBitmap Bitmap,*pOldBitmap; //BITMAP句柄 BITMAP bm; //加载位图 Bitmap.LoadBitmap(IDB_BITMAP1); //将位图资源与句柄绑定 Bitmap.GetObject(sizeof(BITMAP),&bm); //创建与内存转载 2011-05-10 10:22:00 · 1136 阅读 · 0 评论 -
类的成员函数
class Sales_item { public: // operations on Sales_item objects double avg_price() const; bool same_isbn(const Sales_item &rhs) const { return isbn == rhs.原创 2008-11-06 16:38:00 · 4210 阅读 · 0 评论 -
静态局部变量
一个变量如果位于函数的作用域内,但生命期跨越了这个函数的多次调用,这种变量往往很有用。则应该将这样的对象定义为 static(静态的)。static 局部对象确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化。这种对象一旦被创建,在程序结束前都不会撤销。当定义静态局部对象的函数结束时,静态局部对象不会撤销。在该函数被多次调用的过程中,静态局部对象会持续存在并保持它的值。考虑下面的小例子原创 2008-11-06 16:04:00 · 970 阅读 · 0 评论 -
默认实参
默认实参是一种虽然并不普遍、但在多数情况下仍然适用的实参值。调用函数时,可以省略有默认值的实参。编译器会为我们省略的实参提供默认值。默认实参是通过给形参表中的形参提供明确的初始值来指定的。程序员可为一个或多个形参定义默认值。但是,如果有一个形参具有默认实参,那么,它后面所有的形参都必须有默认实参。例如,下面的函数创建并初始化了一个 string 对象,用于模拟窗口屏幕。此函数为窗口屏幕的高、宽和背原创 2008-11-06 15:49:00 · 2794 阅读 · 1 评论 -
new、delete表达式
定义变量时,必须指定其数据类型和名字。而动态创建对象时,只需指定其数据类型,而不必为该对象命名。取而代之的是,new 表达式返回指向新创建对象的指针,我们通过该指针来访问此对象: int i; // named, uninitialized int variable int *pi = new int; // pi points to dynamical原创 2008-10-27 14:01:00 · 1070 阅读 · 0 评论 -
变量定义与声明的区别
我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。 另一种是不需要建立存储空间的 例如:extern int a 其中 变量a是在别的文件中定义的.前者是"定转载 2008-10-28 09:54:00 · 769 阅读 · 1 评论 -
do-while
// repeatedly ask user for pair of numbers to sum string rsp; // used in the condition; cant be defined inside the do do { cout int val1, val2; cin >> val1 >> val2;原创 2008-10-28 10:32:00 · 794 阅读 · 1 评论 -
continue
continue 语句导致最近的循环语句的当次迭代提前结束。对于 while 和 do while 语句,继续求解循环条件。而对于 for 循环,程序流程接着求解 for 语句头中的 expression 表达式。例如,下面的循环每次从标准输入中读入一个单词,只有以下划线开头的单词才做处理。如果是其他的值,终止当前循环,接着读取下一个单词: string inBuf; while原创 2008-10-28 11:43:00 · 566 阅读 · 0 评论 -
类型转换
int i = 3;double d = 3.14;i = i + d;整型与浮点型相加,编译器为保证精度,首先会将整型转化成浮点型,然后求和,所以i+d的结果为浮点型6.14,但将一个浮点型值赋给一个整型变量,精度会发生损失,所以最终结果为6.14算术转换规则定义了一个类型转换层次,该层次规定了操作数应按什么次序转换为表达式中最宽的类型。在包含多种类型的表达式中,转换规则要确保计算值的精度。例如原创 2008-10-27 15:24:00 · 626 阅读 · 0 评论 -
switch
int aCount = 0 , bCount = 0 , cCount = 0; char ch; cin>>ch; switch (ch) { case a: ++aCount; case b: ++bCount; case c: ++cCount; } cout输入a,输出为1 1 1输入b,输出为0 1 1输入c,输出为0 0 1输入d,输出为0 0 0执行完一个case原创 2008-10-27 17:49:00 · 655 阅读 · 0 评论 -
for
for 语句的语法形式是: for (init-statement condition; expression) statementinit-statement 必须是声明语句、表达式语句或空语句。这些语句都以分号结束。一般来说,init-statement 用于对每次循环过程中都要修改的变量进行初始化,或者赋给一个起始值。而 condition 则是用来控制循环的。当原创 2008-10-28 10:01:00 · 486 阅读 · 0 评论 -
goto
goto 语句提供了函数内部的无条件跳转,实现从 goto 语句跳转到同一函数内某个带标号的语句。goto 语句的语法规则如下: goto label;其中 label 是用于标识带标号的语句的标识符。在任何语句前提供一个标识符和冒号,即得带标号的语句: end: return; // labeled statement, may be target of a goto形成标号的标原创 2008-10-28 11:49:00 · 4356 阅读 · 0 评论 -
try和异常处理
C++ 的异常处理中包括:throw 表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错误。可以说,throw 引发了异常条件。try 块,错误处理部分使用它来处理异常。try 语句块以 try 关键字开始,并以一个或多个 catch 子句结束。在 try 块中执行的代码所抛出(throw)的异常,通常会被其中一个 catch 子句处理。由于它们“处理”异常,catch 子句也称为处理代码原创 2008-10-28 14:18:00 · 4646 阅读 · 2 评论 -
指针形参
函数的形参可以是指针,此时将复制实参指针。与其他非引用类型的形参一样,该类形参的任何改变也仅作用于局部副本。如果函数将新指针赋给形参,主调函数使用的实参指针的值没有改变。事实上被复制的指针只影响对指针的赋值。如果函数形参是非 const 类型的指针,则函数可通过指针实现赋值,修改指针所指向对象的值: void reset(int *ip) { *ip = 0; /原创 2008-11-03 14:23:00 · 1465 阅读 · 1 评论 -
swap
// incorrect version of swap: The arguments are not changed! void swap(int v1, int v2) { int tmp = v2; v2 = v1; // assigns new value to local copy of the argument v1原创 2008-11-03 14:47:00 · 469 阅读 · 0 评论 -
函数返回值
不带返回值的 return 语句只能用于返回类型为 void 的函数。在返回类型为 void 的函数中,return 返回语句不是必需的,隐式的 return 发生在函数的最后一个语句完成时。一般情况下,返回类型是 void 的函数使用 return 语句是为了引起函数的强制结束,这种 return 的用法类似于循环结构中的 break 语句的作用。例如,可如下重写 swap 程序,使之在输入的两原创 2008-11-06 14:43:00 · 14973 阅读 · 5 评论 -
关于Invalidate和UpdateWindow
Invalidate调用后,会向消息队列里增加一个WM_PAINT消息,所以调用此函数,界面不会立刻被刷新(需要排队)。消息队列里可能有多个WM_PAINT消息,为了增加效率,系统会将多个WM_PAINT消息合并成一个,并且将每个WM_PAINT的无效区域也合并,合并后的无效原创 2011-09-28 17:59:48 · 846 阅读 · 0 评论