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类的指针变量p
	p = &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指向对象s
	Student &s2 = s;
	// 调用成员
	s2.set_value();
	s2.display();
}

5、三种方法区别

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可视化红黑树详解(gif图演示,洛谷P3369 普通平衡树)

文章目录 写在前面红黑树是什么红黑树的平衡性红黑树整体框架旋转操作插入操作双红修正Case 1, 2Case 3Case 4Case 5Case 6 删除操作二叉查找树红黑树Case 0Case 1Case 2Case 3 双黑修正Case 1Case 2Case 3Case 4Case 5 其他查询操作查询排名查询第k大寻找前驱寻找后继 最终代码…

golang和Java的简单介绍和对比

一、golang 1、Golang简介 Golang&#xff0c;也称为Go&#xff0c;是由Google公司在2009年推出的开源编程语言&#xff0c;由罗伯特格瑞史莫(Rob Pike)、肯汤普逊(Ken Thompson)、罗勃派克(Robert Griesemer)等人设计。Go语言的目标是在保持简单高效的编程模型的同时&#xf…

Springboot中的三层架构

我们在进行前后端交互的时候&#xff0c;会分为数据访问&#xff0c;业务逻辑&#xff0c;接受请求并响应数据三个操作&#xff0c;这三部分其实是可以拆分的&#xff0c;让他们解耦&#xff0c;否则代码复用性差并且不易维护&#xff0c;所以诞生了三层架构——1.Dao(数据访问…

主干网络篇 | YOLOv8改进之用RCS-OSA替换C2f(来源于RCS-YOLO)

前言:Hello大家好,我是小哥谈。RCS-YOLO是一种目标检测算法,它是基于YOLOv3算法的改进版本。通过查看RCS-YOLO的整体架构可知,其中包括RCS-OSA模块。RCS-OSA模块在模型中用于堆叠RCS模块,以确保特征的复用并加强不同层之间的信息流动。本文就给大家详细介绍如何将RCS-YOLO…

关系(二)利用python绘制热图

关系&#xff08;二&#xff09;利用python绘制热图 热图 &#xff08;Heatmap&#xff09;简介 热图适用于显示多个变量之间的差异&#xff0c;通过颜色判断彼此之间是否存在相关性。 快速绘制 基于seaborn import seaborn as sns import pandas as pd import numpy as np i…

干货教程【AI篇】| AI大模型文字生成视频环境部署小白级教程

只需要一个主题、一个词语&#xff0c;或者一段描述&#xff0c;就可以生成一个完整的短视频的工具来啦&#xff01; 在文章下方公众号中回复关键词【aivd】即可获取完整代码和配套软件 工具获取 ps&#xff1a;本文不涉及任何代码开发工作&#xff0c;仅仅作为软件推荐。 如…

OpenHarmony实战开发-分布式关系型数据库

介绍 本示例使用ohos.data.relationalStore 接口和ohos.distributedDeviceManager 接口展示了在eTS中分布式关系型数据库的使用&#xff0c;在增、删、改、查的基本操作外&#xff0c;还包括分布式数据库的数据同步同能。 效果预览 使用说明: 1.启动应用后点击“”按钮可以添…

网络以太网之(2)VLAN协议

网络以太网之(1)VLAN协议 Author: Once Day Date: 2024年4月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day…

主流公链 - Fantom

Fantom&#xff1a;高性能的区块链协议 Fantom是一种开创性的区块链协议&#xff0c;旨在革新去中心化应用和数字金融领域 技术特点 共识机制 Lachesis协议&#xff1a;Fantom使用了Lachesis协议作为其共识算法。Lachesis是一种 异步拜占庭容错&#xff08;ABFT&#xff09;共…

2023数模国赛C 题 蔬菜类商品的自动定价与补货决策-完整版创新多思路详解(含代码)

题目简评&#xff1a;看下来C题是三道题目里简单一些的&#xff0c;考察的点比较综合&#xff0c;偏数据分析。涉及预测模型和运筹优化(线性规划)&#xff0c;还设了一问开放型问题&#xff0c;适合新手入门&#xff0c;发挥空间大。 题目分析与思路&#xff1a; 背景&#x…

文心一言 vs GPT-4 ----全面横向比较

文心一言 (Wenxin Yiyan) 和 GPT-4 是两个强大的人工智能语言模型&#xff0c;它们在处理自然语言方面表现出了出色的能力。但它们有一些关键的区别和优势。以下是它们的横向比较&#xff1a; 公司和平台&#xff1a; * 文心一言是由百度开发的中文语言模型&#xff0c;专门为…

【JavaScript】函数 ③ ( 形参 与 实参 匹配问题 | 实参个数 = 形参个数 | 实参个数 > 形参个数 | 实参个数 < 形参个数 )

文章目录 一、JavaScript 函数 形参 与 实参 匹配问题1、函数形参与实参不匹配问题2、形参与实参个数匹配3、实参个数 > 形参个数4、实参个数 < 形参个数5、完整代码示例 一、JavaScript 函数 形参 与 实参 匹配问题 1、函数形参与实参不匹配问题 在 其它语言 中 , 如 Ja…

Java 设计模式系列:备忘录模式

简介 备忘录模式是一种软件设计模式&#xff0c;用于在不破坏封闭的前提下捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 备忘录模式提供了一种状态恢复的实现机制&#xff0c;使得用户可以方便地回到一个特定…

【VTKExamples::Meshes】第三期 ClipClosedSurface

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ClipClosedSurface,并解析接口vtkClipClosedSurface,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(…

HTML标签之表格标签和表格案例

表格标签的使用案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevic…

yolov7代码 | model.named_models

文章目录 前言1. print(model)2. print(model.named_models)2.1 print(name)2.2 print(module)2.3 print(f"{name}:: {module}") 3. hasattr(module, weight) 前言 了解model.named_models&#xff0c;为剪枝做准备。 剪枝有一些层如果你不想剪掉&#xff0c;那就用…

IP代理池赋能Python网络爬虫

文章目录 什么是IP代理池代理服务器IP代理池的作用IP代理池的构建IP代理池的管理 相关案例IP代理在爬虫中的运用IP代理在数据收集中的运用IP代理在反爬虫中的运用 结语 什么是IP代理池 IP代理池是一个存储了多个可用代理IP地址的资源池&#xff0c;用于在网络爬虫、数据采集、…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(6)复发

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 橘子老师章节9-17图像的调色 等文件 https://www.a…

网站备案进度

1.网站开通后&#xff0c;请在网站首页底部中间位置放置您的ICP备案号并链接至"https://beian.miit.gov.cn"。 并在开通之日起30日内登录全国互联网安全管理平台提交公安联网备案申请。获取《公安备案信息填写指南》&#xff0c;或者通过“公安备案助手”协助您完成申…

文件操作的详序

1.为什么使用文件&#xff1f; 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运行程序&#xff0c;是看不到程序的数据的&#xff0c;如果将数据进行持久化的保存…