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();


更新:


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


目录
相关文章
|
5天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
18 4
|
8天前
|
存储 缓存 安全
阿里云服务器内存型r7、r8a、r8y、r8i实例区别及选择参考
随着阿里云2024年金秋云创季的开始,目前在阿里云的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y和内存型r8i这几个实例规格,相比于活动内的经济型e和通用算力型u1等实例规格来说,这些实例规格等性能更强,虽然这几个实例规格的云服务器通常处理器与内存的配比为都是1:8,但是他们在处理器、存储、网络、安全等方面等性能并不是一样的,所以他们的适用场景也有着不同。本文为大家介绍内存型r7、r8a、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
20天前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
19天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
41 1
|
24天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
25天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
26天前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
61 1
|
29天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
35 2
|
28天前
|
存储 C语言 C++
【C++打怪之路Lv6】-- 内存管理
【C++打怪之路Lv6】-- 内存管理
35 0
【C++打怪之路Lv6】-- 内存管理
|
1月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
37 4