C++ 静态数据成员与静态函数成员实例 友元函数实例 动态分配内存实例

简介: C++ 静态数据成员与静态函数成员实例 友元函数实例 动态分配内存实例

1. 静态数据成员与静态函数成员实例


de9e3c491a072d6e508d9a7d87234fcd_948b1d6a0658466682a241f753a1f138.png


程序一:


#include<bits/stdc++.h>
using namespace std;
class Cat{
  public:
  Cat(int age1=0)
  {
    age=age1;
    numOfCats++;
  }//构造函数,总数加一
  ~Cat()
  {
    numOfCats--;
  }//析构函数,个数减一
  Cat(Cat &p)
  {
    age=p.age;
    numOfCats++;
  }//复制构造函数,个数加一
  void getage()
  {
    cout<<age<<endl;
  }//输出年龄
  static void getNumOfCats()
  {
    cout<<"cat的数量为:"<<numOfCats<<endl;
  }//静态成员函数  输出总数
  void reage(int age1)
  {
    age=age1;
  }//修改年龄
  private:
  static int numOfCats;//静态数据成员
  int age; 
};
int Cat::numOfCats=0;//外部定义一次,赋初值,开辟单独空间
int main()
{
  Cat a(12);
  Cat::getNumOfCats();//创建对象a 利用构造函数 输出总个数
  Cat b=a;
  Cat::getNumOfCats();//创建对象b 利用复制构造函数 输出总个数
  a.reage(6);
  b.getage();
  Cat::getNumOfCats();//调用修改函数和输出函数,查看这两个函数对总数的影响
}


结果:


e6862951b2a507f054a1da7f796365c5_1b60d013d8c045c4aabff45d3c62737d.png


程序二(使用动态分配内存):


#include<bits/stdc++.h>
using namespace std;
const int N = 1e4;
int n,t;
class Cat{
  public:
  Cat(int age1=0)
  {
    age=age1;
    numOfCats++;
  }//构造函数,总数加一
  ~Cat()
  {
    numOfCats--;
  }//析构函数,个数减一
  Cat(Cat &p)
  {
    age=p.age;
    numOfCats++;
  }//复制构造函数,个数加一
  void getage()
  {
    cout<<"第"<<numOfCats<<"个对象的年龄为:"<<age<<endl;
  }//输出年龄
  static void getNumOfCats()
  {
    cout<<"cat的数量为:"<<numOfCats<<endl;
  }//静态成员函数  输出总数
  void reage(int age1)
  {
    age=age1;
  }//修改年龄
  private:
  static int numOfCats;//静态数据成员
  int age; 
};
int Cat::numOfCats=0;//外部定义一次,赋初值,开辟单独空间
int main()
{
  Cat *cat[N];
  cin>>n;//输入个数
  for(int i=1;i<=n;i++)
  {
  cin>>t;//输入每个对象的age
  cat[i]=new Cat(t);//每一个对象使用new函数创建
  cat[i]->getage();//注意用 -> 去访问
  Cat::getNumOfCats();//输出个数
  }
  cout<<endl;
  for(int i=1;i<=n;i++)
  {
  delete cat[i];//依次删除每个对象
  Cat::getNumOfCats();
  }
}


输入和结果:


132943d0fb0adc123a8ab70659d9ec0f_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBALkFzaHku,size_20,color_FFFFFF,t_70,g_se,x_16.png


2.友元函数实例


7edbfd2791a77e57d8a8cb1505ac24ed_ce8006b09a274dbba24034a730fd4014.png


程序一:


#include<bits/stdc++.h>
using namespace std;
class Boat;//提前声明Boat类
class Car{
  private:
  int weight;
  public:
  Car(int weight1=0)
  {
    weight=weight1;
  }//构造函数
  ~Car(){}//析构函数
  friend int getTotalWeight(Car &Cara,Boat &Boata);//友元函数,注意在其中是类的引用,方便且高效
};
class Boat{
  private:
  int weight;
  public:
  Boat(int weight1=0)
  {
    weight=weight1;
  }//构造函数
  ~Boat(){}//析构函数
  friend int getTotalWeight(Car &Cara,Boat &Boata);
};
int getTotalWeight(Car &Cara,Boat &Boata)
{
  return Cara.weight+Boata.weight;
}//友元函数实现,可直接访问两个类的私有成员 
int main()
{
  Boat a(11);
  Car b(12);//创建两个类
  cout<<getTotalWeight(b,a)<<endl;//输出总重
  Boat c(123);
  Car d(122);//创建两个新类
  cout<<getTotalWeight(d,c);//输出总重
}


结果:


9f8a0847ce36b0dd9c553ba0d7451feb_278b2d408b6c4b6894406c8454948fc4.png


程序二(动态分配内存):


#include<bits/stdc++.h>
using namespace std;
int weight1,weight2;
class Boat;
class Car{
  private:
  int weight;
  public:
  Car(int weight1=0)
  {
    weight=weight1;
  }
  ~Car(){}
  friend void getTotalWeight(Car &Cara,Boat &Boata);
};//类Car
class Boat{
  private:
  int weight;
  public:
  Boat(int weight1=0)
  {
    weight=weight1;
  }
  ~Boat(){}
  friend void getTotalWeight(Car &Cara,Boat &Boata);
};//类Boat
void getTotalWeight(Car &Cara,Boat &Boata)
{
  cout<<Cara.weight+Boata.weight;
}//友元函数
int main()
{
  Boat *boat[11];
  Car *car[11];//创建两个类的组
  for(int i=1;i<=3;i++)
  {
  cin>>weight1>>weight2;
  car[i]=new Car(weight1);
  boat[i]=new Boat(weight2);
  cout<<"第"<<i<<"组的总重为:";
  getTotalWeight(*car[i],*boat[i]);//每一组调用友元函数并输出,注意调用的时候带上 * 号;
  cout<<endl;  
  }
}


结果:


9f8a0847ce36b0dd9c553ba0d7451feb_278b2d408b6c4b6894406c8454948fc4.png


总结:关于类的动态分配内存非常方便,关于其应用的new函数与delete函数也非常的好用,

但要注意当调用带引用的友元函时,使用时要带好星号,传入指针


getTotalWeight(*car[i],*boat[i]);


当访问动态分配内存对象的外部接口时,要使用箭头;


cat[i]->getage();


更新:


动态内存分配是通过指针来实现的,当通过指针来调用类的成员时要用箭头来实现;


目录
相关文章
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
130 13
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
106 5
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
91 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
64 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
2月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
39 3
|
2月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
51 1
|
2月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
30 1
|
2月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
44 3
|
2月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
56 3
|
2月前
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
27 3