【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )(一)

简介: 【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )(一)

成员函数


此处继续上一篇博客继续向后讲解C++面向对象


类成员方法 , 除了定义构造方法与析构方法之外 , 还可以定义普通的成员方法 , 如设置 int age 变量的方法 , 这里声明一个成员方法 , 传入参数 int age , 给成员变量 int age 赋值 ;


使用共有函数访问私有成员变量 , 在类中私有的成员变量时不允许从外部直接访问的 , 需要通过共有函数来访问 , 在共有函数中调用 this->成员变量 进行访问 ; 这里的访问是指获取成员变量的值 , 或修改成员变量的值 ;


成员函数中申请内存 , 需要在析构函数中将内存释放 , 不管在构造函数 , 还是在成员函数中申请的内存 , 都需要在析构函数中 , 将内存释放掉 ;


Student.h 中相关声明 :


//默认作用域 : 如果没有指定作用域, 其作用域默认是 private 私有的
  //类中的属性定义 
  int age;
//声明共有的成员方法 , 该方法需要实现
public : 
  void setAge(int age);


Student.cpp 实现上述声明的方法 :


void Student::setAge(int age) {
  //使用 this 关键字访问成员变量 , 并给成员变量赋值
  this->age = age;
}




常量函数


外部访问类中的私有成员变量 , 有两种方法 , 一种是使用共有的成员方法访问 , 另一种是在友元函数中访问 ;


常量函数 , 在头文件中函数定义时 , 在方法后面加上 const 关键字 , 这个函数就变成了常量函数 , 该函数中不允许修改类中的成员变量 , 一般获取成员变量值的函数可以定义成常量函数 ;


成员函数声明时可以直接实现 , 可以在类中声明成员函数的位置 , 直接实现该函数 , 这样就不同在 Student.cpp 中实现了 ;


Student.h 中声明并实现成员方法 :


//默认作用域 : 如果没有指定作用域, 其作用域默认是 private 私有的
  //类中的属性定义 
  int age;
//声明共有的成员方法 , 该方法需要实现
public : 
  //在函数后加上 const , 该函数就变成了常量函数
  //常量函数中是不允许修改成员变量的
  //函数在声明的时候也可以实现
  int getAge()const {
  return this->age;
  }


友元函数


外部访问类中的私有成员变量 , 有两种方法 , 一种是使用共有的成员方法访问 , 另一种是在友元函数中访问 ;


友元函数 , 在友元函数中 , 可以从类的外部访问类中的私有成员变量 , 友元函数声明方法 friend 返回值类型 方法名称 ( 参数列表 ) ; ;


Student.h 中友元函数声明


//友元函数声明 , 可以在外部修改类中的私有成员变量
  friend void changeAge(Student*);


友元函数实现 , 友元函数并不与类实现写在一起 , 而是在使用的位置进行实现 , 这里在 main() 函数所在的文件中进行实现 , 在该实现的友元函数中 , 可以访问类对象的私有成员变量和方法 ;


003_Object_Oriented.cpp ( main函数定义文件 ) 中友元函数实现


//引用 Student 类声明的头文件
#include "Student.h"
//友元函数实现 , 在类的外部修改类中的私有成员变量 age
void changeAge(Student* student){
  student->age = 88;




new 创建对象


使用 new 创建对象 , 表示在堆中申请内存 , 将其定义成 Student 类型 , new 与 mallloc 作用类似 , 当对象不使用之后 , 需要使用 delete 对象名 , 对象会自动调用析构函数 , 将该对象销毁 ; 下面的代码中展示了 , 创建对象 , 使用对象 , 销毁对象的过程 ;


创建对象 , new Student(18, 1); 使用 new 关键字 , 在堆内存中创建对象 , 注意这种对象使用完毕后需要手动调用 delete 对象名 进行释放 ;

友元函数 , changeAge(student); 是调用友元函数修改对象的私有成员变量 ;

常量函数 , student->getAge() 调用共有的常量函数 , 获取私有成员变量值 , 注意常量函数中不允许修改成员变量值 , 只允许获取该值 ;

释放内存 , delete student 作用是, 释放使用 new 申请的堆内存中的内存 ;

//使用 new 创建对象 , 注意该对象在堆内存中创建的 
  //用完之后需要使用 delete 释放该对象
  Student* student = new Student(18, 1);
  //调用友元函数, 修改 student 对象类私有变量 age 的值
  changeAge(student);
  //调用 getAge() 常量函数获取 student 对象的 age 成员变量值
  //并将该值打印出来
  cout<< "age : " << student->getAge() <<endl;
  //释放使用 new 申请的堆内存中的内存
  delete student;


代码执行结果


Student() 构造方法
age : 88
~Student() 析构方法


image.png




目录
相关文章
|
18天前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
|
3月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
211 6
|
5月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
140 19
|
5月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
173 13
|
5月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
137 5
|
5月前
|
存储 C++
【C++面向对象——输入输出流】处理二进制文件(头歌实践教学平台习题)【合集】
本任务要求使用C++读取二进制文件并在每行前添加行号后输出到控制台。主要内容包括: 1. **任务描述**:用二进制方式打开指定文件,为每一行添加行号并输出。 2. **相关知识**: - 流类库中常用的类及其成员函数(如`iostream`、`fstream`等)。 - 标准输入输出及格式控制(如`cin`、`cout`和`iomanip`中的格式化函数)。 - 文件的应用方法(文本文件和二进制文件的读写操作)。 3. **编程要求**:编写程序,通过命令行参数传递文件名,使用`getline`读取数据并用`cout`输出带行号的内容。 4. **实验步骤**:参考实验指
160 5
|
5月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
103 5
|
5月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
107 4
|
5月前
|
设计模式 IDE 编译器
【C++面向对象——类的多态性与虚函数】编写教学游戏:认识动物(头歌实践教学平台习题)【合集】
本项目旨在通过C++编程实现一个教学游戏,帮助小朋友认识动物。程序设计了一个动物园场景,包含Dog、Bird和Frog三种动物。每个动物都有move和shout行为,用于展示其特征。游戏随机挑选10个动物,前5个供学习,后5个用于测试。使用虚函数和多态实现不同动物的行为,确保代码灵活扩展。此外,通过typeid获取对象类型,并利用strstr辅助判断类型。相关头文件如&lt;string&gt;、&lt;cstdlib&gt;等确保程序正常运行。最终,根据小朋友的回答计算得分,提供互动学习体验。 - **任务描述**:编写教学游戏,随机挑选10个动物进行展示与测试。 - **类设计**:基类
115 3
|
8月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。

热门文章

最新文章