??xml version="1.0" encoding="utf-8" standalone="yes"?> 一、知识点 string对象初始化方?/span> string s1; 默认构造函敎ͼs1为空?/span> string s2(s1) ?/span>s2初始化ؓs1的一个副?/span> string s3(“Value”); ?/span>s3初始化ؓ一个字W串字面值的副本 string s4(n, ‘c’); ?/span>s4初始化ؓ字符‘c’?/span>n个副?/span> Q?Q、stringcd的输入操作符和getline函数 Cctype定义的函?/span> isalnum(c) 如果c是字母和数字Q则?/span>true isalpha(c) 如果c是字母,则ؓtrue isdigit(c) 如果c是数字,则ؓtrue isxdigit(c) 如果c是十六进制数Q则?/span>true iscntrl(c) 如果c是控制字W,则ؓtrue ispunct(c) 如果c是标点符P则ؓtrue isspace(c) 如果c是空白字W,则ؓtrue isprint(c) 如果c是可打印的字W,则ؓtrue isgraph(c) 如果c不是I格Q但可以打印Q则?/span>true islower(c) 如果c是小写字母,则ؓtrue isupper(c) 如果c是大写字母,则ؓtrue tolower(c) 如果c是大写字母,则返回其写字母形式Q否则直接返?/span>c toupper(c) 如果c是大写字母,则返回其写字母形式Q否则直接返?/span>c 引用QreferenceQ就是对象的另一个名Uͼ非congst引用只能l定C该引用相同类型的Ҏ上,const引用可以l定C同但相关的类型对象或l定到右倹{?/p>
重点Qconst引用Q指向const对象的引用?
3、typedef typedef可以用来定义cd的同义词。格式ؓQtypedef + 数据cd + 标识W?/p>
4、枚举(enumQ?/p>
格式Qenum enumName(l可? {enumerator1Q?enumerator2Q?..} Q?Q、枚举成员都是常量表辑ּQ在~译器编译是p计算出结果的整型表达式,或整型字面值常量)Q?/p>
Q?Q、默认的W一个枚举成员是0Q后面的每个枚D成员都比前一个大1Q?/p>
Q?Q、枚举成员g是唯一的:enum Points { p1 = 1, p2, p3 = 2, p4}Q这其中p1=1,p2=2,p3=2,p4=3Q?/p>
Q?Q、枚丄型的对象初始化或赋值时Q只能通过该类型枚丄某个成员q行?/p>
5、类cd 注意class和struct的区别:唯一区别Q?span style="color: #ff0000">默认情况下,struct的成员ؓpublicQclass的成员ؓprivate?/span> 6、头文g 在const变量是用帔R表达式初始化Ӟ可以它定义在头文g中;如果不是Q则不应该在头文件中定义?/p>
]]>
1、命名空间的using声明
2、标准库stringcd
3、标准库vectorcd
4、P代器?br /> 5、标准库bitsetcd
二、要?/strong>
1、命名空间的using声明
使用using声明可以在不需要加前缀namespace_nameQ:的情况下讉K命名I间中的名字Q格式如Q?span style="color: #0000ff">using namespace::name;
2、标准库stringcd
stringcd的输入操作符Q读取ƈ忽略开头所有的I白字符Q空根{换行符、制表符Q;d字符直到再次遇到I白字符Q读取结束?br /> getline函数Q包?个参敎ͼ输入对象和string对象Q读取内容直到碰到换行符Q但q不包括换行W(它不忽略开头的换行W,如果有,那么q次的读取内容ؓI)
Q?Q、string::size_typecd
string::size_type是一U与机器无关的、无W号的整型类型(intQlong都可能)Q它可以保存Lstring对象的长度?br />
Q?Q、与字符串字面D接的注意?br />string s1 = "hello";
string s2 = "world";
string s3 = s1 + " "; // ok
string s4 = "hello" + " "; // errorQ不?个字面串字面值相?/span>
string s5 = s1 + " " + "world"; // okQs1? "相加后还是一个新的string对象Q可以和后面的相?/span>
string s6 = "hello" + " " + s2; // errorQ前?个就相当于字面串字面值相?br />
Q?Q、string对象中字W的处理
主要是用到cctype头文件中定义的函敎ͼ如下Q?nbsp;
]]>
1、基本内|类型(术cd和voidcdQ?br />
2、字面值常量和变量
3、const限定W?br />
4、引?br />
5、typedef名字
6、枚?br />
7、类cd
8、头文g
二、要?/strong>
1、const限定W?br />
数Q在上下文中没有体现出来Q好像这个数是魔术般的从IZ出现的。如下面?#8220;512”q个?nbsp;
for (int i = 0; i != 512; ++i) {
//
..
}
使用const限定W需注意Q?br />
Q?Q、定义的const的变量仍难是一个左|但是q个左值是不可修改的;且在定义时必d始化Q?br />
Q?Q、const变量默认都是文g局部的Q如果想被其他文件访问,必须在前面加入extern。如Q?
file_1.cpp:
extern const int bufszie = 512; // 定义Q需要赋初?/span>
fiel_2.cpp:
extern const int bufsize;
.
for (int i = 0; i != bufsizeQ?++i) {
//
.
}
2、引?br />
const int &refVal = ival; // q个是正的赋?/span>
int &ref2 = ival; // q个是错误的赋|ref2是可以重新赋|q样Dival的g被改变,但ival是const的,所以这栯值是不允许的Q?/span>
2、初始化
double dval = 42.12;
const int &r1 = 42; // 用右|字面值常量)初始?/span>
const int &r2 = dval; // 用不同那个类型的对象初始化,q里的r2 = 42。如果r2不是const的话Q这样初始化是错误的?/span>
q个大家看不出来区别的话那我举个例子:
int* a[]; int (*a)[];
前者是指针数组Q数l里每个元素是指针,后者是数组指针Q这?*a)[]指向一个数l的地址?/span>
再看下个例子:
int* a(); int (*a)();
前者返回一个整形指针,后者是函数指针Q指向一个函数的地址;
也就是说
int* a; a是一个整形指针型变量
int *a; a本n是指针,存储整Ş变量的地址
效果来说这两者等P可能有点晕,Ҏ下上面的例子理解下就好了?/span>
在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言~译q程的一部分Q但它ƈ不实际分配内存空_实例像:
typedef int INT;
typedef int ARRAY[10];
typedef (int*) pINT;
typedef可以增强E序的可L,以及标识W的灉|性,但它也有“非直观?#8221;{缺炏V?/p>
二?define的用?/p>
#defineZ宏定义语句,通常用它来定义常?包括无参量与带参?Q以及用来实现那?#8220;表面似和善、背后一长串”的宏Q它本nq不在编
译过E中q行Q而是在这之前(预处理过E?/span>)已l完成了Q但也因此难以发现潜在的错误及其它代码维护问题,它的实例像:
#define INT int
#define TRUE 1
#define Add(a,b) ((a)+(b));
#define Loop_10 for (int i=0; i<10; i++)
在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代ҎQ大家可参看?/p>
三、typedef?define的区?/p>
从以上的概念便也能基本清楚,typedef只是Z增加可读性而ؓ标识W另L新名U?仅仅只是个别?Q?define原本在C中是Z定义帔R
Q到了C++Qconst、enum、inline的出C它也渐渐成ؓ了v别名的工兗有时很Ҏ搞不清楚与typedef两者到底该用哪个好Q如#define
INT intq样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedefQ因为在早期的许多C~译器中q条语句是非法的Q只是现今的
~译器又做了扩充。ؓ了尽可能地兼容,一般都遵@#define定义“可读”的常量以及一些宏语句的Q务,而typedef则常用来定义关键字、冗
长的cd的别名?/p>
宏定义只是简单的字符串代?原地扩展)Q而typedef则不是原地扩展,它的新名字具有一定的装性,以致于新命名的标识符h更易定义?/p>
量的功能。请看上面第一大点代码的第三行Q?/p>
typedef (int*) pINT;
以及下面q行:
#define pINT2 int*
效果相同Q实则不同!实践中见差别QpINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;
表示定义了一个整型指针变量a和整型变量b?/p>
typedef的四个用途和两个陷阱
用途一Q?
定义一U类型的别名Q而不只是单的宏替换。可以用作同时声明指针型的多个对象。比如:
char* pa, pb; // q多CW合我们的意图,它只声明了一个指向字W变量的指针Q?#160;
// 和一个字W变量;
以下则可行:
typedef char* PCHAR; // 一般用大写
PCHAR pa, pb; // 可行Q同时声明了两个指向字符变量的指?
虽然Q?
char *pa, *pb;
也可行,但相Ҏ说没有用typedef的Ş式直观,其在需要大量指针的地方Qtypedef的方式更省事?
用途二Q?
用在旧的C代码中(具体多旧没有查)Q帮助struct。以前的代码中,声明struct新对象时Q必要带上structQ即形式为: struct l构?#160; 对象名,如:
struct tagPOINT1
{
int x;
int y;
};
struct tagPOINT1 p1;
而在C++中,则可以直接写Q结构名 对象名,卻I
tagPOINT1 p1;
估计某h觉得l常多写一个struct太麻烦了Q于是就发明了:
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p1; // q样比原来的方式少写了一个structQ比较省事,其在大量用的时?
或许Q在C++中,typedef的这U用途二不是很大Q但是理解了它,Ҏ握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码?
用途三Q?
用typedef来定义与q_无关的类型?
比如定义一个叫 REAL 的Q点类型,在目标^C上,让它表示最高精度的cd为:
typedef long double REAL;
在不支持 long double 的^C上,改ؓQ?
typedef double REAL;
在连 double 都不支持的^C上,改ؓQ?
typedef float REAL;
也就是说Q当跨^台时Q只要改?#160; typedef 本npQ不用对其他源码做Q何修攏V?
标准库就q泛使用了这个技巧,比如size_t?
另外Q因为typedef是定义了一U类型的新别名,不是单的字符串替换,所以它比宏来得E_Q虽然用宏有时也可以完成以上的用途)?
用途四Q?
为复杂的声明定义一个新的简单的别名。方法是Q在原来的声明里逐步用别名替换一部分复杂声明Q如此@环,把带变量名的部分留到最后替换,得到的就是原声明的最化版。D例:
1. 原声明:int *(*a[5])(int, char*);
变量名ؓaQ直接用一个新别名pFun替换a可以了Q?
typedef int *(*pFun)(int, char*);
原声明的最化版Q?
pFun a[5];
2. 原声明:void (*b[10]) (void (*)());
变量名ؓbQ先替换双部分括号里的QpFunParam为别名一Q?
typedef void (*pFunParam)();
再替换左边的变量bQpFunx为别名二Q?
typedef void (*pFunx)(pFunParam);
原声明的最化版Q?
pFunx b[10];
3. 原声明:doube(*)() (*e)[9];
变量名ؓeQ先替换左边部分QpFuny为别名一Q?
typedef double(*pFuny)();
再替换右边的变量eQpFunParamy为别名二
typedef pFuny (*pFunParamy)[9];
原声明的最化版Q?
pFunParamy e;
理解复杂声明可用?#8220;叛_法则”Q?span style="COLOR: red">从变量名看vQ先往叻I再往左,到一个圆括号p转阅ȝ方向Q括号内分析完就跛_括号Q还是按先右后左的顺序,如此循环Q直到整个声明分析完。D例:
int (*func)(int *p);
首先扑ֈ变量名funcQ外面有一对圆括号Q而且左边是一?Pq说明func是一个指针;然后跛_q个圆括P先看双Q又遇到圆括Pq说?*func)是一个函敎ͼ所以func是一个指向这cd数的指针Q即函数指针Q这cd数具有int*cd的Ş参,q回值类型是int?
int (*func[5])(int *);
func双是一个[]q算W,说明func是具?个元素的数组Qfunc的左Ҏ一?Q说明func的元素是指针Q注意这里的*不是修饰funcQ而是修饰func[5]的,原因是[]q算W优先?高,func先跟[]l合Q。蟩个括P看右边,又遇到圆括号Q说明func数组的元素是函数cd的指针,它指向的函数hint*cd的Ş参,q回值类型ؓint?
也可以记?个模式:
type (*)(....)函数指针
type (*)[]数组指针
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?
陷阱一Q?
CQtypedef是定义了一U类型的新别名,不同于宏Q它不是单的字符串替换。比如:
先定义:
typedef char* PSTR;
然后Q?
int mystrcmp(const PSTR, const PSTR);
const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const?
原因在于constl予了整个指针本w以帔R性,也就是Ş成了帔R指针char* const?
单来_C当const和typedef一起出现时Qtypedef不会是简单的字符串替换就行?
陷阱二:
typedef在语法上是一个存储类的关键字Q如auto、extern、mutable、static、register{一PQ虽然它q不真正影响对象的存储特性,如:
typedef static int INT2; //不可?
~译失败,会提C?#8220;指定了一个以上的存储c?#8221;?/p>
|络字节序与本地字节顺序之间的转换函数Q?br>
之所以需要这些函数是因ؓ计算机数据表C存在两U字节顺序:NBO与HBO
|络字节序NBOQNetwork Byte OrderQ:
按从高到低的序存储Q在|络上用统一的网l字节顺序,可以避免兼容性问题?/p>
L字节序QHBOQHost Byte OrderQ:
不同的机器HBO不相同,与CPU设计有关Q数据的序是由cpu军_?而与操作pȝ无关?br>
?Intel x86l构? short型数0x1234表示?4 12, int型数0x12345678表示?8 56 34 12
如IBM power PCl构? short型数0x1234表示?2 34, int型数0x12345678表示?2 34 56 78
׃q个原因不同体系l构的机器之间无法通信,所以要转换成一U约定的数序,也就是网l字节顺?其实是如同power pc那样的顺?。在PC开发中有ntohl和htonl函数可以用来q行|络字节和主机字节的转换?/p>
PSQ{?a >http://www.cnblogs.com/heaad/archive/2009/07/16/1525112.html