张鹏辉

个人站

欢迎来到我的个人站,本人小白,希望大家指导。


c++ 数据共享与保护

说明:本系列博客用来记录在学习c++语言时的笔记,便于与同学相互之间的学习讨论。(注:笔记会记录我学习过程中的重难点,不包括学习的所有知识点。)

1.标识符的作用域与可见性

1.1 作用域

作用域是一个标识符在程序正文中有效的区域。

(1) 函数原型作用域

函数原型中的参数,其作用域始于”(“,结束于”)”。
例如: double area(double radius)

(2) 局部作用域

函数的形参、在块中声明的标识符;
其作用域自声明处起,限于块中。
例子:


void fun(int a) {
   int b = a;
   cin >> b;
   if (b > 0) {
     int c;

     ......
   }
}

(3) 类作用域

类可以被看成是一组有名成员的集合,类$X$的成员$m$具有类作用域,对$m$的访问方式有如下 3 种。
(1) 如果在 $X$ 的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以直接访问成员 $m$。也就是说 $m$ 在这样的函数中都起作用。
(2) 通过表达式 $x.m$或者$x::m$。这正是程序中访问对象成员的最基本方法
(3) 通过$ptr->m$这样的表达式,其中$ptr$为指向$X$类的一个对象的指针

(4) 命名空间作用域

举例:


//作用域实例
#include <iostream>

using namespace std;

int i;            //在全局命名空间中的全局变量

namespace Ns{
    int j;        //在 NS 命名空间中的全局变量
}

// 主函数
int main(){
    i = 5;        //为全局变量 i 赋值
    Ns::j=6;    //为全局变星]赋值
    {
        using namespace Ns; //使得在当前块中可以直接引用 Ns 命名空间的标识符
        int i;              //局部变量,局部作用域
        i = 7;
        cout<<"i="<<i<<endl; //输出 7
        cout<<"j="<<j<<endl; //输出 6

    }
    cout<<"i="<<i<<endl;//输出 5
    return 0;

}

1.2 可见性

从标识符引用的角度,来看标识符的有效范围,即标识符的可见性。程序运行到某一点,能够引用到的标识符,就是该处可见的标识符。
作用域可见性的一般规则如下:
1.标识符要声明在前,引用在后。
2.在同一作用域中,不能声明同名的标识符。
3.在没有互相包含关系的不同的作用域中声明的同名标识符,互不影响。
4.如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外层标识符在内层不可见。

2.对象的生存期

对象(包括简单变量)都有诞生和消失的时刻。对象从诞生到结束的这段时间就是它的生存期。

2.1 静态生存期

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

2.2 动态生存期

在局部作用域中声明的具有动态生存期的对象,习惯上也称为局部生存期对象。局部生存期对象诞生于声明点,结束于声明所在的块执行完毕之时

3. 类的静态成员

3.1 静态数据成员

3.2 静态函数成员


//具有静态数据和函数成员的Point类

#include<iostream>
using namespace std;

class Point{                                                   //Point类定义
public:                                                       //外部接口
    Point(int x=0,int y=0):x(x),y(y){                         //构造函数
        //在构造函数中对count累加,所有对象共同维护同一个count
        count++;
    }
    Point(Point &p){                                          //复制构造函数
        x=p.x;
        y=p.y;
        count++;
    }
    ~Point(){count--;}
    int getX(){return x;}
    int getY(){return y;}

    static void showCount(){                                 //静态函数成员
        cout<<" Object count="<<count<<endl;
    }
private:                                                     //私有数据成员
    int x,y;
    static int count;                                //静态数据成员声明,用于记录点的个数
};

int Point::count=0;                               //静态数据成员定义和初始化,使用类名限定

int main(){                                                //主函数
    Point::showCount();
    Point a(4,5);                               //定义对象a,其构造函数会使count增1
    cout<<"Point A: "<<a.getX()<<","<<a.getY();
    Point::showCount();                                    //输出对象个数

    Point b(a);                                  //定义对象b,其构造函数会使count增1
    cout<<"Point B: "<<b.getX()<<","<<b.getY();
    Point::showCount();                                     //输出对象个数

    return 0;
}

4. 类的友元

友元是C++提供的一种破坏数据封装和数据隐藏的机制。

通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。

4.1 友元函数

友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问 private 和 protected 成员.

4.2 友元类

若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员。
声明语法:将友元类名在另一个类中使用friend修饰说明。


class A {
    ...
    friend class B;
    ....
};


转载请注明:张鹏辉的博客 » c++ 数据共享与保护

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦