最近应用开发的程过中出现了一个小问题,顺便录记一下原因和方法--函数类
首先来看一下天今的成就:
虽然没到三百,但是还是有先进。
天今的标目是350。
继承录记一下C++里碰到的盲点。
静态成员
分为态静据数成员和态静函数成员。
态静据数成员实际上是类域中的全局变量。所以,态静据数成员的义定(初始化)应不该被放在头件文中。
态静据数成员被 类 的全部对象所享共,包括该类派生类的对象。即派生类对象与基类对象享共基类的态静据数成员。
态静据数成员可以成为成员函数的可选数参,而通普据数成员则不可以。
态静成员函数的地址可用通普函数指针贮存,而通普成员函数地址须要用 类成员函数指针来贮存。
.态静成员函数不可以调用类的非态静成员。因为态静成员函数不含this指针。
态静成员函数不可以同时明声为 virtual、const、volatile函数。
最后要说的一点是,态静成员是可以立独问访的,也就是说,不必创立任何对象实例就够能问访。在存储空间中都只存在一个本副。可以通过类和对象去调用。
用static对全局变量停止修饰变改了其作用域的范围,由本来的个整工程可见为变源本件文可见。
态静成员的初始化在全局区。
友元
类的外部,也就是通过实例来问访私有(private)或掩护(protected)成员,这是被制止的。但从实用性来讲,的确偶然很须要在外部问访,C++增加了一种称之为“友元(friend)”函数的明申,将“权特”赋给一些函数(可是以全局函数,也可是以其它类的成员函数),使之够能问访该类的私有和掩护成员。
友元函数必须在类里头明申,而且友元函数必定不是该类的成员函数。因此,这样的“权特”实际上经已不是完整的面向对象设计了,当然,我们也可以不用它。另外,友元函数的明申在派生类效无,除非派生类中再明申一次,当然类型转换为基类时,应用没有任何问题。
友元类的全部成员函数都是另一个类的友元函数,都可以问访另一个类中的隐藏信息(包括私有成员和掩护成员)。
当望希一个类可以存取另一个类的私有成员时,可以将该类明声为另一类的友元类。
应用友元类时注意:
(1) 友元系关不能被继承。
(2) 友元系关是单向的,不具有交换性。若类B是类A的友元,类A纷歧定是类B的友元,要看在类中是不是有响应的明声。
(3) 友元系关不具有传递性。若类B是类A的友元,类C是B的友元,类C纷歧定是类A的友元,样同要看类中是不是有响应的明声。
宏义定
不带数参的宏义定:宏义定又称为宏代换、宏替换,简称“宏”。格式:#define 标识符 字符串 其中的标识符就是所谓的符号常量,也称为“宏名”。
在讲授带数参的宏的应用之前,样同先来看看应用带数参的宏时须要注意的几点。
宏名和数参表的括号间不能有格空。
宏替换只做替换,不做盘算和表达式求解,这一点要格外注意。
函数调用在译编后程序行运时停止,并且分配存内。宏替换在译编前停止,不分配存内。
extern的用法
在C语言中,修饰符extern用在变量或者函数的明声前,用来讲明“此变量/函数是在别处义定的,要在此处引用”。
其实要调用其它件文中的函数和变量,需只把该件文用#include包括进来便可,为啥要用extern?因为用extern会速加程序的译编程过,这样能节省时间。
在C++中extern还有另外一种作用,用于指示C或者C++函数的调用范规。比如在C++中调用C库函数,就须要在C++程序用中extern “C”明声要引用的函数。这是给链接器用的,诉告链接器在链接的时候用C函数范规来链接。要主原因是C++和C程序译编成完后在标目代码中命名规矩不同,用此来决解名字配匹的问题。
内部函数和外部函数
如果一个函数只能被本件文中其他函数所调用,它称为部内函数。在义定部内函数时,在函数名和函数类型的后面加static。函数部首的一般格式为
static 类型标识符 函数名(形参表)
如
static int fun(int a,int b)
部内函数又称态静(static)函数。应用部内函数,可以使函数只局限于在所件文。如果在不同的件文中有同名的部内函数,互不干扰。平日把只能由统一件文应用的函数和外部变量放在一个件文中,在它们后面都冠以static使之局部化,其他件文不能引用。
在义定函数时,如果在函数部首的最左端冠以关键字extern,则示表此函数是外部函数,可供其他件文调用。
如函数部首可以写为
extern int fun (int a, int b)
这样,函数fun就够能为其他件文调用。如果在义定函数时略省extern,则认默为外部函数。本书后面所用的函数都是外部函数。
在须要调用此函数的件文中,用extern明声所用的函数是外部函数。
复制造构函数
贝拷造构函数的名称必须与类名称致一,函数的形式数参是本类型的一个引用变量,且必须是引用。
当用一个经已初始化过了的自义定类类型对象去初始化另一个新造构的对象的时候,贝拷造构函数就会被主动调用,如果你没有自义定贝拷造构函数的时候系统将会供给给一个认默的贝拷造构函数来成完这个程过。
贝拷和浅贝拷的义定可以简略懂得成:如果一个类有拥资源(堆,或者是其它系统资源),当这个类的对象生发复制程过的时候,这个程过就够能叫做深贝拷,反之对象存在资源但复制程过并未复制资源的况情视为浅贝拷。
浅贝拷资源后在释放资源的时候会发生资源归属不清的况情致使程序行运错出,这点其尤须要注意!
运算符重载
C++中预义定的运算符的操纵对象只能是基本据数类型。但实际上,对于很多户用自义定类型(例如类),也须要似类的运算操纵。这时就必须在C++中重新义定这些运算符,付与已有运算符新的功能,使它够能用于特定类型行执特定的操纵。运算符重载的质实是函数重载,它供给了C++的可扩展性,也是C++最吸引人的特性之一。
运算符重载是通过创立运算符函数现实的,运算符函数义定了重载的运算符将要停止的操纵。运算符函数的义定与其他函数的义定似类,唯一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号成构的。
要循遵的规矩:
(1) 除了类属系关运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"外以,C++中的全部运算符都可以重载。
(2) 重载运算符制约在C++语言中已有的运算符范围内的许允重载的运算符当中,不能创立新的运算符。
(3) 运算符重载质实上是函数重载,因此译编程序对运算符重载的选择,循遵函数重载的选择则原。
(4) 重载后之的运算符不能变改运算符的优先级和结合性,也不能变改运算符操纵数的个数及语法结构。
(5) 运算符重载不能变改该运算符用于部内类型对象的含意。它只能和户用自义定类型的对象一同应用,或者用于户用自义定类型的对象和部内类型的对象混合应用时。
(6) 运算符重载是针对新类型据数的实际须要对原有运算符停止的恰当的造改,重载的功能应该与原有功能相似类,免避没有目的地应用重载运算符。
iomanip
iomanip.h是I/O流控制头件文,就像C里头的格式化输出一样,在新版本的c++中头件文经已用iomanip代取了iomanip.h,其中io代表输入输出,manip是manipulator(操纵器)的缩写(在c++上只有缩写才有效)。
setw(n) 设域宽为n个字符
setfill(c) 设填充字符为c
setbase(int n) 将数字转换为 n 进制
setprecision(n) 设示显小数精度为n位
setiosflags(ios::left) 左对齐
setiosflags(ios::right) 右对齐
天今的c++,从343冲起
文章结束给大家分享下程序员的一些笑话语录:
一位程序员去海边游泳,由于水性不佳,游不回岸了,于是他挥着手臂,大声求.救:“F1,F1!”