1. 作用域
作用域包括:函数原型作用域、局部作用域、类作用域、命名空间作用域。
命名空间的语法形式:
namespace 命名空间名{
命名空间内的各种声明(函数声明、类声明、...)
}
如果需要引用其它命名空间的标识符:
命名空间名::标识符名
或
using 命名空间名::标识符名;
或
using namespace 命名空间名;
2. 对象生存期
2.1 静态生存期
如果对象的生存期与程序的运行期相同,则具有静态生存期。在命名空间作用域中声明的对象都是具有静态生存期的。如果要在函数内部的局部作用域中声明具有静态生存期的对象,需使用关键字static。
局部作用域中的静态变量在每次调用共享,保持上一回的值,并不会随着每次函数的调用而产生一个副本,也不会随着函数返回而失效,即使发生了递归调用。
2.2 动态生存期
3. 类的静态成员
3.1 静态数据成员
如果某个属性为整个类所共有,不属于任何一个具体对象,使用static关键字来声明。类属性对于任何对象实例来说他的属性值是相同的。静态数据成员具有静态生存期。
访问形式:
类名::标识符
3.2 静态函数成员
静态成员函数就是使用static关键字声明的函数成员。也属于整个类,为所有对象共享。静态函数成员可以通过类名或对象名来调用。
4. 类的友元
友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通过友元关系,一个普通函数或类的成员函数可以访问另一个类中的数据。利用friend关键字进行声明。
友元关系不能传递、单向、不被继承。
4.1 友元函数
可以是一个普通函数也可以是其他类的成员函数,在它的函数体中可以通过对象名访问类的私有和保护成员。
声明:
friend 数据类型 函数名(参数表);
4.2 友元类
若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。
声明:
friend class 类名;
5. 共享数据的保护
对于即需要共享又需要防止改变的数据可以声明为常量
5.1 常对象
const 类型说明符 对象名;
与符号常量类似,必须赋初值,不能更新。
5.2 用const修饰的类成员
(1)常成员函数
类型说明符 函数名(参数表)const;
在类外函数定义部分也要带const关键字;
常对象只能调用它的常成员函数;
在常成员函数调用期间,目的对象都被视为常对象;
const可以用于对重载函数的区分。
(2)常数据成员
如果在一个类中说明了常数据成员,任何函数都不能对该成员赋值。构造函数只能通过初始化列表对该数据成员进行初始化。静态常数据成员在类外进行初始化也要加const关键字。
5.3 常引用
常引用所引用的对象不能被更新。
const 类型说明符 &引用名;
非const引用只能绑定到普通对象,常引用可以绑定到常对象。但无论常引用绑定的是普通对象还是常对象,通过该引用访问对象时只能当做常对象。
6. 编译预处理指令
(1)#include 指令
//按标准方式搜索
#include <文件名>
//首先在当前目录搜索
#include "文件名"
(2)#define指令
用来定义符号常量(也可用const定义)
#define PI 3.14
还可定义空符号
#define MYHEAD_H
(3)#undef指令
删除由#define指令定义的宏
(3)条件编译指令
可以限定程序中某些内容在满足一定条件的情况下才参与编译。利用条件编译可以使同一个源程序在不同的编译条件下产生不同的目标代码。
形式一
#if 常量表达式
程序段 //当表达式非零时编译此程序段
#endif
形式二
#if 常量表达式
程序段1
#else
程序段2
#endif
形式三
#if 常量表达式1
程序段1
#elif 常量表达式2
程序段2
...
else 常量表达式n
程序段n
#endif
形式四
#ifdef 标识符
程序段1 //如果标识符经#define定义且未被#undef删除
#else
程序段2
#endif
形式五
#ifndef 标识符
程序段1 //如果标识符未被定义过
#else
程序段2
#endif
(4)define操作符
defined是一个预处理操作符,不是指令,不以#开头。形式
defined(标识符)
若标识符经#define定义过且未被删除则表达式非0,否则为0。