page contents

C++——类中的三种特殊成员

C++——类中的三种特殊成员:静态、常量、友元成员

一、类中静态成员

1、类中的静态数据成员,所有对象都共享这一个成员,这个静态数据成员只有一份存在于内存中

2、类中的静态函数成员,因为他不属于对象,所以在这个函数中只能操作类的静态数据,静态函数

3、类中的静态数据成员,不管共有私有都是在类外进行初始化

4、类中静态数据成员初始化,静态数据成员不属于对象,无法通过对象的操作进行初始化,它是属于类的

5、静态数据成员,可以被重新赋值,可以被普通函数访问

 

class A
{
public:
 int a;
 static int m;//类中的静态数据成员,所有的对象都共享这一个成员,这个静态数据成员只有一份存在于内存中
public:
 A()
 {
  m++;
  //m = 123;不能再类内初始化  必须再类外初始化  类型 类名::静态成员=初始化值
 }
 ~A()
 {
  m--;
 }
 void setM(int i){ m = i; }//但是可以被重新赋值
 int getM(){ return m; }//类中的静态数据成员可以被普通函数访问
 static int fun()//静态成员函数也不属于任何对象,只属于类
 {
  //a += 10;因为它不属于对象,所以在这个函数中只能操作类的静态数据和静态函数
  m += 10;
  int a=12;
  a++;
  cout << m << endl;
  return m;
 }
};
int A::m = 0;

 

二、类中常量成员

1、类中常量成员分为两种:常量数据成员和常量函数成员

2、类中的常量数据成员,必须要使用初始化列表的方式进行初始化     <const int a;>

3、类中的常量函数成员,这个函数不能对自身变量进行修改,这个是常量的特性    <void fun() const {}>

         Ⅰ、受语法限定,只要是this指针所指向的所有数据,在这个函数里面都不可以改

         Ⅱ、初始化之外的形参数据,临时变量,不属于this指针的数据都可以改

         Ⅲ、根据语法,可以帮助我们来限定去修改自身的数据

4、对象被说明说常量对象时,这个对象只能调用常量数据成员函数

        Ⅰ、这个对象里面的所有数据都是不可以被修改的

        Ⅱ、可以对象里面的静态成员,因为静态成员不属于对象

class A
{
public:
 int a;
 const char sex;//类中常量数据成员
 static int b;

 A(char s) :sex(s)
 {
  a=666;
 }
 //const 写在前面不合适,是修饰返回值
 void fun1()const//类得常量函数成员,const必须写再函数的后面
 {
  //a += 10;不能对自身变量进行修改,这个是常量的特性
  //受语法限定,只要是this指针所指向的所有数据,在这个函数里面都不可以改
  //初始之外的形参数据,临时变量,不属于this指针指的数据,都可以改
  int n = 10;
  n++;
 }//只读操作
 ////1、根据语法可以帮助我们来限定在函数去修改自身的数据
 ////2、当对象被说明为常量对象时,只能够调用常量成员函数
 static void fun2(int a)
 {
  a = 12;
 }
 void fun3()
 {

 }
};
int A::b = 0;


三、类中的友元成员

1、类的特点是封装,友元是C++为用户提供打破这中封装(数据隐藏)的手段

2、友元分为两种:友元函数,友元类

3、友元函数:是一个函数,这个函数不是对象的成员,对象是点不出来的,不管在哪里定义,但是这个函数有权调用类的所有的私有成员以及保护成员  声明一个友元函数:把函数的声明写在类中,无论私有共有保护,然后在前面加上一个friend即可

4、友元成员:类B为类A的友元类

B类和A类是两个类,友元类B必须在雷伟说明,B类所有成员函数都有权访问A类的所有成员

5、友元的三个特点

       Ⅰ、单方向:B是A的朋友,B可以访问A的数据,A不可以访问B的数据

       Ⅱ、不传递:A是B的朋友,B是C的朋友,A和C没有朋友关系

       Ⅲ、不继承:A是B的朋友,B是C的父亲,A和C没有关系

class B;//声明类
class A
{
 int a;
public:
 friend class B;
 friend void fun(A *srca);//友元函数的声明,这个函数不属于类
 int geta()
 {
  return a;
 }
};
class B
{
public:
 void fun(A&a)
 {
  a.a = 123;
 }
};
void fun(A &srca)
{
 srca.a = 10;
}

 

  • 发表于 2021-06-11 21:57
  • 阅读 ( 867 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小威
小威

64 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章