①
友元函数:友元函数一般用在类中,比如在主函数外定义一个函数,如果在一个类中不把其声明为友元函数的话,是不能调用它访问类中的私有成员变量的,而如果定义了,就可以调用类中的私有成员变量。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。
②
try {//执行的代码,其中可能有异常。一旦发现异常,则立即跳到catch执行。否则不会执行catch里面的内容 }
catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 }
finally {//不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally }
③
new int 创建一个int大小的内存,如int* p = new int; new int (100) 创建一个int型的内存,并赋值为100; int *p = new int(100); new int[100] 创建100个int型的内存; int* p[] = new int[100];
④
无法动态申请二维数组,只能申请一段连续的数组空间,如指针数组来模拟二维数组。
删除动态数组用delete [] p;
⑤
"return 0"出现可能有两种能,一是在主函数〔main()函数〕中出现,二是在自定义函数中出现,在主函数中出现是代表的是无系统返回值,即执行到这时直接跳出程序了。在自定义函数中出现时代表的是无函数返回值,只执行了代码,做了一些代码让做的事,但不返回数值给主调函数。
⑥
strcat() 函数用来连接字符串,其原型为:
char *strcat(char *dest, const char *src);
【参数】dest 为目的字符串指针,src 为源字符串指针。
strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。
注意:dest 与 src 所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。
【返回值】返回dest 字符串起始地址。
return('0')是返回字符'0',
⑦
return(c-'0')是返回表达式c-'0'的值,字符在计算机内是以一个整数值来存储的,都有固定的数值,被解释为字符(显示的时候是显示字符),也可以对char作算术运算,因为char也是一个数值。
return(0)是返回数值0,
其实有无括号均可,只要它不影响表达式的优先级,就当是一种风格罢了,()在表达式中多是用来改变表达式中运算符的优先级,因为()在表达式中的优先级很高。
⑧
换行符‘\n’和回车符‘\r’
顾名思义,换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符
'\n' 10 换行(newline)
'\r' 13 回车(return)
也可以表示为'\x0a'和'\x0d'.(16进制)
在windows系统下,回车换行符号是"\r\n".但是在Linux等系统下是没有"\r"符号的。
在解析文本或其他格式的文件内容时,常常要碰到判定回车换行的地方,这个时候就要注意既要判定"\r\n"又要判定"\n"。
写程序时可能得到一行,将其进行trim掉'\r',这样能得到你所需要的string了。
⑨
默认构造函数(default constructor)就是在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。
⑩
拷贝构造函数(copy constructor)被用来以一个对象来初始化同类型的另一个对象,拷贝赋值运算符(copy assignment operator)被用来将一个对象中的值拷贝到同类型的另一个对象中:Widget w3 = w2; // invoke copy constructor!
幸运的是,拷贝构造函数很容易从拷贝赋值中区别出来。如果一个新的对象被定义(就象上面那行代码中的 w3),一个构造函数必须被调用;它不可能是一个赋值。如果没有新的对象被定义(就象上面那行 "w1 = w2" 代码中),没有构造函数能被调用,所以它就是一个赋值。
const char*const p;
const char*p;
char*const p;
const vector<int>::iterator iter不可实现++iter,可实现*iter=10
vector<int>::const_iterator iter不可实现*iter=10,可实现++iter
在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数,virtual 函数返回类型 函数名(参数表) {函数体;},实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数
定义虚函数的限制:
(1)非类的成员函数不能定义为虚函数,类的成员函数中静态成员函数和构造函数也不能定义为虚函数,但可以将析构函数定义为虚函数。实际上,优秀的程序员常常把基类的析构函数定义为虚函数。因为,将基类的析构函数定义为虚函数后,当利用delete删除一个指向派生类定义的对象指针时,系统会调用相应的类的析构函数。而不将析构函数定义为虚函数时,只调用基类的析构函数。
(2)只需要在声明函数的类体中使用关键字“virtual”将函数声明为虚函数,而定义函数时不需要使用关键字“virtual”。
(3)当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数自动成为虚函数。
(4)如果声明了某个成员函数为虚函数,则在该类中不能出现和这个成员函数同名并且返回值、参数个数、类型都相同的非虚函数。在以该类为基类的派生类中,也不能出现这种同名函数。
虚函数联系到多态,多态联系到继承。所以本文中都是在继承层次上做文章。没了继承,什么都没得谈。
---------------------------------------------------------
线程同步的方式主要有:临界区、互斥区、事件、信号量四种方式。
前边讲过了临界区线程同步-----windows核心编程-关键段(临界区)线程同步,这章我来介绍一下互斥器(Mutexes)在线程同步中的使用。
互斥器(Mutexes)的用途和临界区(critical section)的用途非常相似,如:一个时间内只能够有一个线程拥有mutex,就好像同一时间内只能够有一个线程进入同一个critical section一样。但是mutex通过牺牲速度,提高了灵活性,功能变得更加强大了。
虽然mutex和critical section做相同的事情,但它们的运作还是有差别的:
1、锁住一个未被拥有的mutex,比锁住一个未被拥有的critical section需要花费几乎100倍的时间。
2、mutex可以跨进程使用。critical section则只能在同一个进程中使用。
3、等待一个mutex时,你可以指定“结束等待”的世间长度,但对于critical section则不行。
getline一行行独立读取