C++面向对象程序设计 - 访问对象中成员的3种方法

        在C++程序中访问对象的成员变量和成员函数,有三种方法:

  1. 通过对象名和成员运算符访问对象中的成员;
  2. 通过指向对象的指针访问对象中的成员;
  3. 通过对象的引用变量访问对象中的成员

        在了解访问对象中成员的3种方法前,先了解下C++面向对象程序设计的特点。

1、struct和class区别

        C++增加了class类型后,扔保留了结构体类型(struct),而且把它的功能也扩展了。c++允许用struct业定义一个“类”类型。如果struct类体内没用private和public对其成员作显式声明,系统将全部成员默认为public(公用的),外界可以任意引用其中的数据成员和成员函数。代码如下:

#include <iostream>
#include <string>
using namespace std;struct Student{int age;string name;string sex;// 显示学员信息void display(){cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex;}
};int main(){Student s;s.age = 20;s.name = "Jack";s.sex = "male";s.display();
}

       运行结果如下:

        如果class类体内没有private和public对其成员作显示声明,系统将全部成员默认为private(私有的),外界不可以任意引用其中的数据成员和成员函数。

        所以如果希望成员是公用的,使用struct比较方便,如果希望部分成员是私有的,宜用class。

2、类外定义成员函数

        在C++中,成员函数可以在类体内定义,也可以在类体外进行函数定义。在类体内定义函数时,不需要在函数名前加上类名,因为函数属于哪个类已不言而喻。但成员函数在类外定义时,必须在函数名前添加上类名,予以限制,“::”两个冒号作为作用域限定符,用它声明函数是属于类中的函数。代码如下:

#include <iostream>
#include <string>
using namespace std;class Student{private:int age;string name;string sex;public:// 定义内置函数inline void set_value(){cin >>name >>age >>sex;}// 显示成员信息void display(){cout <<endl;cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;}string get_name();
};int main(){Student s;s.set_value();s.display();string student_name = s.get_name();cout <<"student name:" <<student_name <<endl;
}string Student::get_name(){return name;
}

3、inline成员函数

        类的成员函数也可以指定为内置(inline)函数。C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已被隐含地指定为内置函数。代码如下:

#include <iostream>
#include <string>
using namespace std;class Student{private:int age;string name;string sex;public:// 定义内置函数inline void set_value(){cin >>name >>age >>sex;}// 显示成员信息void display(){cout <<endl;cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;}
};int main(){Student s;s.set_value();s.display();
}

        其实void display()也可以写成inline void display(),将display()函数显示地声明为内置函数。不写也是等效的,在类体内定义的函数,一般都省写inline。

        但是如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,应当用inline作显式声明。代码如下:

#include <iostream>
#include <string>
using namespace std;class Student{private:int age;string name;string sex;public:// 定义内置函数inline void set_value(){cin >>name >>age >>sex;}// 显示成员信息void display(){cout <<endl;cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;}inline string get_name();
};int main(){Student s;s.set_value();s.display();string student_name = s.get_name();cout <<"student name:" <<student_name <<endl;
}string Student::get_name(){return name;
}

4、访问对象中的成员

        在实际编程中,选择使用对象实例、指针对象还是引用变量,取决于你的具体需求和场景。

4.1、通过对象名访问成员

        对象实例是直接创建的对象。可以直接使用点“.”运算符来访问它的成员(成员变量和成员函数)。代码如下:

#include <iostream>
#include <string>
using namespace std;class Student{private:int age;string name;string sex;public:// 定义内置函数inline void set_value(){cin >>name >>age >>sex;}// 显示成员信息void display(){cout <<endl;cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;}
};int main(){Student s;// 设置对象信息s.set_value();// 显示学员信息s.display();
}

        对象名和成员运算符访问对象中的成员,用点“.”(成员运算符)来对成员进行限定和调用,可以用"."调用对象中所有的公用成员。

4.2、通过对象的指针访问成员

        指针对象是一个指向对象的指针。你需要使用"->"运算符来访问它所指向的对象的成员。指针提供了更多的灵活性,比如动态内存分配和对象数组的操作。但使用指针时,需要格外小心内存泄漏和野指针等问题。代码如下:

#include <iostream>
#include <string>
using namespace std;class Student{private:int age;string name;string sex;public:// 定义内置函数inline void set_value(){cin >>name >>age >>sex;}// 显示成员信息void display(){cout <<endl;cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;}
};int main(){Student s, *p;	//定义对象s和指向Student类的指针变量pp = &s;        // 使用p指向对象s// 调用成员p->set_value();p->display();
}

4.3、通过对象的引用访问成员

        引用变量是对象的别名。你可以像使用对象实例一样使用.运算符来访问它的成员。引用通常用于函数参数和返回值,以避免复制大型对象,提高效率。代码如下:

#include <iostream>
#include <string>
using namespace std;class Student{private:int age;string name;string sex;public:// 定义内置函数inline void set_value(){cin >>name >>age >>sex;}// 显示成员信息void display(){cout <<endl;cout <<"name:" <<name <<", age:" <<age <<", sex:" <<sex <<endl;}
};int main(){Student s;	//定义对象s// 引用变量s2指向对象sStudent &s2 = s;// 调用成员s2.set_value();s2.display();
}

5、三种方法区别

        语法:对象实例和引用变量都是使用点"."运算符,指针对象对象使用"->"运算符。

        灵活性:指针对象提供了更多的动态性和灵活性,可以使用动态内存分配和复杂的数据结构。引用变量则更侧重于提供对象的别名,避免不必要的复制。

        安全性:使用指针时需要格外小心,因为不正确的使用可能导致内存泄露,野指针等问题。

        用途:对象实例通常用于简单的局部变量或对象创建。指针对象常用于动态内存管理、数组、键表等复杂数据结构。引用变量常用于函数参数和返回值,以提高效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

StarRocks部署

介绍 tarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库。StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷。用户无需经过复杂的预处理&#xff0c;就可以用 StarRocks 来支持多种数据分析场景的极速分析。 官网 ## 部署 https://docs.sta…

速盾:cdn加速接口会被劫持吗?

CDN&#xff08;Content Delivery Network&#xff09;加速接口是一种常用的网络加速技术&#xff0c;通过将静态资源分发到全球多个节点&#xff0c;提高资源的访问速度和稳定性。然而&#xff0c;随着互联网的发展&#xff0c;网络安全问题也日益突出&#xff0c;因此人们对于…

网络安全之IP地址证书的重要性

在数字化时代&#xff0c;网络空间已成为各类活动的重要载体&#xff0c;无论是商业交易、信息交流还是远程办公&#xff0c;都离不开互联网的支撑。然而&#xff0c;网络环境的开放性与匿名性也带来了安全风险&#xff0c;如何确保网络交互中的身份真实可信&#xff0c;成为了…

【御控物联】JSON结构数据转换在物联业务中应用(场景案例二)

文章目录 一、物联网业务场景现状二、物联网业务场景数据交互格式三、JSON格式数据转换案例四、JSON数据格式转换DEMO五、在线转换工具六、技术资料 一、物联网业务场景现状 目前&#xff0c;市场上多数物联网关与物联平台捆绑售卖&#xff0c;网关采集到设备数据只能按照指定…

Excel·VBA二维数组组合函数之穷举推理题

看到一个帖子《CSDN-求助一道推理题》&#xff0c;与之前《python穷举暴力破解《2018年刑侦推理题》用python穷举的推理题很类似 那么是否可以使用《ExcelVBA二维数组组合函数、组合求和》combin_arr2d函数&#xff0c;生成结果进行穷举呢&#xff1f; Sub 穷举推理题()Dim …

修改Gradio界面中按钮Submit、Clear,Flag为中文,修改additional_inputs标签。

展示如图 Submit、Clear、additional_inputs标签 Submit、Clear修改 修改gradio库中interface.py additional_inputs标签 同一文件下 flag修改 flag展示

壁纸小程序Vue3(自定义头部组件)

1.自定义头部 coustom-nav <view class"layout"><view class"navbar"><view class"statusBar"></view><view class"titleBar"><view class"title">标题</view><view class&qu…

卷积神经网络(CNN)的数学原理解析

文章目录 前言 1、介绍 2、数字图像的数据结构 3、卷积 4、Valid 和 Same 卷积 5、步幅卷积 6、过渡到三维 7、卷积层 8、连接剪枝和参数共享 9、卷积反向传播 10、池化层 11、池化层反向传播 前言 本篇主要分享卷积神经网络&#xff08;CNN&#xff09;的数学原理解析&#xf…

深入了解 Vue 3 中的 Transition 过渡动画

在本文中&#xff0c;我们将深入探讨 Vue 3 中实现 Transition 过渡动画的技术细节。过渡动画可以为用户界面增添平滑和生动的效果&#xff0c;提升用户体验。 首先新建一个基于uni-app框架为transition.vue的测试文件&#xff0c;在其中编写如下JavaScript、HTML和CSS代码&…

问题2-前端json数组数据转换成csv文件

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>将 JSON 数据导出为 CSV 文件</title> …

局域网与城域网(练习题)

局域网与城域网 ⭐️⭐️⭐️⭐️ 红色标记为答案⭐️⭐️⭐️⭐️ ⭐️⭐️⭐️ 蓝色标记为要点解析⭐️⭐️⭐️ 1.以下关于VLAN标记的说法中&#xff0c;错误的是&#xff08;&#xff09;。 A.交换机根据目标地址和VLAN标记进行转发决策 B.进入目的网段时&#xff0c;交换机…

Docker:使用MinIO搭建对象存储平台

1、简述 MinIO是一个基于对象存储技术的开源项目&#xff0c;它可以帮助用户快速搭建起私有的、高性能的对象存储平台。MinIO兼容Amazon S3 API&#xff0c;使得用户可以使用标准的S3工具和SDK来访问和管理MinIO存储的数据。此外&#xff0c;MinIO还提供了分布式部署、自动数据…

【Oracle篇】expdp/impdp高效完成全部生产用户的全库迁移(第四篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣️❣️…

AcWing 1111:字母 ← dfs bfs

【题目来源】https://www.acwing.com/problem/content/1113/【题目描述】 给定一个 RS 的大写字母矩阵&#xff0c;你的起始位置位于左上角&#xff0c;你可以向上下左右四个方向进行移动&#xff0c;但是不能移出边界&#xff0c;或者移动到曾经经过的字母&#xff08;左上角字…

如何重置woocommerce,如何批量删除woocommerce产品

默认情况下当我们在后台删除Woocommerce插件的时候&#xff0c;woocommerce 的数据并不会从数据库中自动清除。 这个时候&#xff0c;为了能清除数据库里的数据&#xff0c;我们可以在wp-config.php 文件里添加如下代码&#xff1a; define( WC_REMOVE_ALL_DATA, true ); 添…

VTK 简介

VTK 简介 VTK 简介什么是 VTK&#xff1f;VTK 能做什么&#xff1f;VTK 的基本组成VTK 的框架结构VTK 的数据结构VTK 的可视化流程参考 VTK 简介 什么是 VTK&#xff1f; VTK&#xff0c;全称是Visualization Toolkit&#xff0c;即可视化工具包。是一个开源、跨平台、可自由…

vue+element ui实现表单组件的封装

效果图&#xff1a; 主要是使用vue elmentUi 的from的基础上进行封装 使用改组件&#xff0c;是需要自定义从父组件传入一下字段表单字段 export const topicTypeMainTaskEdit: any new Map([// 主任务可编辑状态[feasibleInstructions, // 督办件[{value: documentNum…

云计算面临的威胁

目录 一、概述 二、威胁建模分析 2.1 威胁建模的概念 2.2 威胁建模起到的作用 2.3 威胁建模的流程 2.3.1 威胁建模流程图 2.3.2 威胁建模流程内容 2.3.2.1 绘制数据流图 2.3.2.2 威胁识别与分析 2.3.2.2.1 STRIDE威胁分析方法论 2.3.2.3 制定消减措施 2.3.2.3.1 消减…

景联文科技提供高质量医疗健康AI大模型数据

医疗行业是典型的知识和技术密集型行业&#xff0c;其发展水平直接关系到国民健康和生命质量。 医疗健康AI大模型&#xff0c;作为人工智能的一个分支&#xff0c;能够通过学习大量的数据来生成新的数据实例&#xff0c;在医药研发、医学影像、医疗文本分析等都有广泛的应用前景…

检索增强微调(RAFT)---使语言模型适应特定领域的 RAG

原文地址:retrieval-augmented-fine-tuning-raft 2024 年 3 月 29 日 摘要(Abstract) 论文介绍了一种名为Retrieval Augmented Fine Tuning(RAFT)的训练方法,旨在提升模型在特定领域“开卷”环境下回答问题的能力。RAFT通过训练模型忽略那些对回答问题没有帮助的文档(称为…