C++语法笔记 - C++程序的结构

变量的作用域:

函数原型作用域:

在函数原型声明时形式参数的作用范围就是函数原型作用域。

块作用域:

在块中声明的标识符,其作用域从声明处开始,一直到块结束的大括号为止。

类作用域:

类可以被看成时一组有名成员的集合,类X的成员M具有类的作用域,对M的访问方式如下:

x.M x :: M prt -> M

文件作用域:

作用域开始于声明点,结束于文件尾。

可见性:

程序运行到某一点,能够引用到的标识符,就是该处可见的标识符。

对象的生存期:

静态生存期:

如果对象的生存期与程序的运行期相同,我们称它具有静态生存期。在文件作用域中声明的对象都是具有静态生存期的。如果要在函数的内部的块作用域中声明具有静态生存期的对象,则要使用关键字static。

动态生存期:

动态生存期诞生于声明点,结束于该标识符作用域结束处。

类的静态成员:

如果某个属性为整个类所共有,不属于任何一个具体对象,则采用static关键字来声明为静态成员。静态成员在每个类只有一个拷贝,由该类所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。

静态数据成员:

具有静态生存期,在类的定义中仅仅对静态成员进行声明,必须在文件作用域的某个地方使用类名限定对静态数据成员进行定义,这时也可以进行初始化:

类中声明:static int countP; 类外定义:int Point :: countP = 0;

静态函数成员:

静态成员函数可以直接访问该类的静态数据和函数成员。而访问非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名来访问具体的数据成员。

类的友元:

友元函数:友元函数时在类中用关键字friend修饰的非成员函数。友元函数可以是一个普通的函数,也可以时其他类的成员函数。虽然它不是本类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员。

在类中声明一个友元函数:

friend float fDist(Point &a, Point &b);

在类外实现友元函数:

float fDist(Point &a, Point &b){cout << a.X;} //X为Point类的一个私有数据成员

友元类:

若A类是B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。

class B {
… //B类的成员声明
friend class A; //声明A为B的友元类

}

注意: ①友元关系时布恩那个传递的; ②友元关系是单向的; ③友元关系时不被继承的。

共享数据的保护

常引用:

常引用所引用的对象不能被更新,如果用常引用作新参,便不会意外的发生对实参的改变,常引用的声明如下:

const 类型说明符 &引用名;
void display(const double &r);

常对象:

常对象的数据成员值在对象的整个声明周期中不能被改变,常对象必须进行初始化,而且不能被更新。声明常对象的方法:

类名 const 对象名;

不能通过常对象调用普通的成员函数,只能调用常成员函数。

用const修饰的类成员:

使用const修饰的函数称为常成员函数,声明的格式如下:

类型说明符 函数名(参数表) const;

常成员函数 类型说明符 函数名(参数表) const; 说明:

const时函数类型的一个组成部分,因此在函数的定义部分也要带const关键字 常成员函数不能更新对象的数据成员,也不能调用该类中没有const修饰的成员函数 如果将一个对象说明为常对象,则通过常对象之恩那个调用他的常成员函数。 const关键字可以用于对重载函数的区分

常数据成员

使用const说明的数据成员称为常数据成员。任何函数中都不能对该成员赋值。构造函数对该数据成员进行初始化,就只能通过初始化表:

class A中声明public类型的变量:const int &r; 声明私有变量:static const int b; const int a;

class A{
public:
A(int i);
void print();
const int &r;
private:
const int a;
static const int b;
};
const int A::b = 10;
A::A(int i):a(i),r(a){}
void A::print(){
cout << a << “:” << b << “:” << r << endl;
}

多文件结构:

通常一个项目至少划分为三个文件:类定义文件(.h)、类实现文件(.cpp)和类的使用文件(*.cpp,主函数文件)。

文件包含指令:

#include

#include “point.h”

内联函数的处理:一般是将内联函数的实现写在头文件中,由调用的编译单元包含这个头文件。

外部变量

用extern关键字说明,外部变量时具有文件呢作用域的变量,定义在所有文件之外。声明一个外部变量时,可以同时定义它,也可以只是引用一个爱别处声明的外部变量:

文件1中的文件作用域中定义:int i = 1;

文件2中使用该变量:extern int i;

外部函数:

在所有类之外声明的函数(也就是非成员函数),都是具有文件作用域的,如果没有特殊说明,这样的函数都可以在不同的编译单元中被调用,只要在调用之前声明函数的原型。当然,也可以使用extern关键字,效果一样。如果使用了static关键字修饰,则含着只能限定在所在的编译单元中。

标准C++库和命名空间

当包含了必要的“*.h”头文件后,就可以使用起中噢噢那个预定义的内容了,但是使用标准C++库时却不同,在紧接着所有的include指令之后,需要加入下面这一条语句来将制定的命名空间中的名称引入到当前命名空间中:using namespace std;

两种头文件不能混用,比如,已经包含了头文件iostream,那么就不能再包含一个math.h,而要使用新的头文件cmath。

编译预处理:

所有的预处理指令在程序中都是以“#”来引导的,每一条预处理指令单独占用一行,不要用分号结束。预处理指令可以根据需要出现在程序中的任何位置。

(1)#include指令 头文件包含指令 (2)#define和#undef指令

#define指令定义符号常量:#define PI 3.1415926

#define指令定义带参数的宏,以实现简单的函数计算,但在C++中这以功能已被内联函数取代,在C中比较常用。

#undef指令删除由#define定义的宏,使之不再起作用。

(3)条件编译指令

使用条件编译指令,可以限定程序中的某些内容要再满足一定条件的情况下才参与编译。

#if 常量表达式
程序段

#endif

(4)defined操作符

是一个预处理操作符,而不是指令,因此不需要以#开头。

defined(标识符)

若标识符在此前经#define定义过,并且未经#undef删除,则上述表达式为非0,否则为0。

#ifndef PI

#definePI
…

#endif

arthinking wechat
欢迎关注itzhai公众号