C++数据的共享与保护 概念整理

1、函数形参列表中形参的作用域从形参列表中的声明处开始,到整个函数体结束指出为止。

函数体内声名的变量,其作用域从声明处开始,一直到声明所在的块结束的花括号为止。

X::m的方式用于访问类的静态成员   ptr->m这样的表达式,其中ptr指向X类的一个对象的指针

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

2、命名空间本质上定义了实体所属的空间,使用namespace关键字

namespace namespace_name{
       //代码声明
}

使用某个命名空间中的函数、变量等实体,需要命名空间::实体名称或者通过using namespace namespace_name的方式。

3、如果对象的生存期与程序的运行期相同,称他具有静态生存期。

如果要在函数内部的局部作用域中声明具有静态生存期的对象,则要使用关键字static,即静态变量。

定义时未指定初始值的基本类型静态生存期变量,会被0初始化,动态生存期变量不指定初始值则意味着初值不确定。

4.如果某个属性为整个类所共有,不属于任何一个具体对象,则采用static关键字来声明为静态成员。 

类属性是描述类的所有成员共有特征的一个数据项,对于任何对象实例,他的属性值相同。

静态数据成员需要在类定义之外再加以定义,是因为需要以这种方式专门为它们分配空间。

5.一个关于Point类的例子

#include <iostream>
using namespace std;
class 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;}

     void showCount(){                    //输出静态数据成员
            count<<“Object cout="<<count<<endl;
     }
private:                                  
     int x,y;
     static int count;                 //静态数据成员声明,用于记录点的个数
     constexpr static int origin=0;    //常量静态成员类内初始化
};
 
int Point::count=0;                 //静态数据成员定义和初始化,使用类名限定
constexpr int Point::origin;        //类外定义常量静态成员,但不可二次初始化
int main(){              
      Point a(4,5);                 //定义对象a,其构造函数会使count增1
      count<<"Point A:"<<a.getX()<<","<<a.getY();
      a.showCount();                //输出对象个数
      
      Point b(a);
      count<<"Point B:"<<b.getX()<<","<<b.getY();
      b.showCount();
      return 0;
}

6、静态成员函数可以直接访问该类静态数据和成员函数,而访问非静态成员,须通过对象名。原因:对静态成员函数的调用时没有目的对象的。

7、若类B中内嵌了类A的对象,但是B的成员函数却无法直接访问A的私有成员x,所以需要引出:友元关系:提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。   是在类中用关键字friend修饰的非成员函数。   虽然它不是本类的成员函数,但是它在函数体中可以通过对象名访问类的私有和保护成员

类中声明友元函数原型,在类外定义函数。

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

声明语法为:

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

注意:

友元关系不能传递,友元关系是单向的、友元关系不能被继承

9、常对象的数据成员在对象的整个生存期间不能被改变,必须进行初始化,不被更新。

声明语法为:
 

const 类型说明符 对象名;
例如:
const A a(3,4);        //a是常对象,不能被更新

不能对常量进行赋值。

常成员函数的声明格式如下:

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

注意点:

const是函数类型的一个组成部分,因此在函数的定义部分也要带const关键字。

如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数。

const关键字可以用于对重载函数的区分,例如在类中这样声明:

void print();

void print() const;

对于无须改变对象状态的成员函数,都应当使用const

10、例子

#include <iostream>
using namespace std;
class A{
public:
     A(int i);
     void print();
private:
     const int a;
     static const int b;           //静态常数据成员
};

const int A::b=10;                 //静态常数据成员在类外说明和初始化

A::A(int i):a(i){}

void A:print(){
     cout<<a<<":"<<b<<end;
}
int main(){
/*建立对象a和b,并以100和0作为初值,分别调用构造函数,通过构造函数的初始化列表给对象的数据成员赋初始值*/
       A a1(100),a2(0);
       a1.print();
       a2.print();
       return 0;
}

11、常引用所引用的对象不能被更新

const 类型说明符 &引用名;

对于在函数中无须改变其值的参数,不宜使用普通引用方式加以传递,因为会使得常对象无法被传入。    复制构造函数的参数一般也宜采用常引用传递。

12、使用类名可以初始化静态成员函数,如类名为Point,则可以使用int Point::count=0;来对静态数据成员初始化。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值