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


更新:


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


目录
相关文章
|
17天前
|
存储 分布式计算 安全
阿里云服务器经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例介绍与选择参考
在阿里云现在的活动中,可选的云服务器实例规格主要有经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例,虽然阿里云在活动中提供了多种不同规格的云服务器实例,以满足不同用户和应用场景的需求。但是有的用户并不清楚他们的性能如何,应该如何选择。本文将详细介绍阿里云服务器中的经济型e、通用算力型u1、计算型c8i、通用型g8i、内存型r8i实例的性能、适用场景及选择参考,帮助用户根据自身需求做出合适的选择。
|
28天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
100 13
|
28天前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
57 11
|
29天前
|
存储 缓存 C语言
【c++】动态内存管理
本文介绍了C++中动态内存管理的新方式——`new`和`delete`操作符,详细探讨了它们的使用方法及与C语言中`malloc`/`free`的区别。文章首先回顾了C语言中的动态内存管理,接着通过代码实例展示了`new`和`delete`的基本用法,包括对内置类型和自定义类型的动态内存分配与释放。此外,文章还深入解析了`operator new`和`operator delete`的底层实现,以及定位new表达式的应用,最后总结了`malloc`/`free`与`new`/`delete`的主要差异。
49 3
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
86 4
|
1月前
|
存储 缓存 安全
阿里云服务器内存型r7、r8a、r8y、r8i实例区别及选择参考
随着阿里云2024年金秋云创季的开始,目前在阿里云的活动中,属于内存型实例规格的云服务器有内存型r7、内存型r8a、内存型r8y和内存型r8i这几个实例规格,相比于活动内的经济型e和通用算力型u1等实例规格来说,这些实例规格等性能更强,虽然这几个实例规格的云服务器通常处理器与内存的配比为都是1:8,但是他们在处理器、存储、网络、安全等方面等性能并不是一样的,所以他们的适用场景也有着不同。本文为大家介绍内存型r7、r8a、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
2月前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
2月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
98 1
|
2月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
2月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。