首先来看一下今天的成绩:

C++ 从零单排(2)-基础知识二_c++


虽然没到三百,但是还是有进步。


今天的目标是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程序编译完成后在目标代码中命名规则不同,用此来解决名字匹配的问题。


部函数和外部函数

如果一个函数只能被本文件中其他函数所调用,它称为内部函数