C++类和对象 -- 知识点补充

news2024/11/17 21:51:58

补充

  • const成员函数
  • static成员
  • 友元
  • 内部类
  • 匿名对象
  • 拷贝对象时的一些编译器优化

const成员函数

将const修饰的成员函数称为const成员函数,const修饰类成员函数,实际是修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的成员进行修改。

位置:const 放在函数参数列表()的后面
在这里插入图片描述
const对象和非const对象都可以调用const成员函数,而const对象无法调用非const函数,所以成员函数的成员均不修改时建议都加上const。

static成员

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。

比较:
非静态成员变量 - - 属于每个对应的类对象,存储在对象里面;

静态 成员变量 - - 属于类,类的每个对象共享,存储在静态区。

非静态成员函数 - - 第一个参数是隐含的this指针,只能通过对象访问;

静态成员函数 - - 没有this指针,不能访问非静态成员,对象访问和指定类域就可调用该函数。
  

静态成员的特性及写法:

  1. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明;
  2. 类静态成员可用 类名::静态成员 或者 对象.静态成员 来访问;
  3. 静态成员也是类的成员,受public、protected、private 访问限定符的限制。

非静态成员函数内可以调用静态成员函数,因为非静态成员函数在类内部,不受类域限制;但静态成员函数内不能调用非静态成员函数,因为调用非静态成员函数需要this指针。

友元

友元分为:友元函数和友元类,关键字:friend
  
(友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。)

友元函数的写法:
  friend + 函数声明

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

class Date  //示例
{
	//类内声明
	friend ostream& operator<<(ostream& _cout, const Date& d);
  //……//
};

//类外定义
ostream& operator<<(ostream& _cout, const Date& d)
{
	_cout << d._year << "-" << d._month << "-" << d._day;
	return _cout; 
}

说明:

  • 友元函数可访问类的私有和保护成员,但不是类的成员函数
  • 友元函数不能用const修饰
  • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元函数的调用与普通函数的调用原理相同

流插入<< 和 流提取>> 操作符不能重载成成员函数,因为类对象中this指针默认占用了第一个参数,也就是左操作数是对象,违背了左操作数是cout/cin的常规习惯;而在全局中定义又无法访问类的私有和保护成员。

这时候就有两种办法:1、声明成友元函数 2、声明成静态成员函数

友元类
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

class Time
{
   friend class Date;   // 声明日期类为时间类的友元类,
   //则在日期类中就直接访问Time类中的私有成员变量
   
   //……//
}
  • 友元关系是单向的,不具有交换性。 比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员,但不能在Time类中访问Date类中私有成员。
  • 友元关系不能传递。如果C是B的友元,B是A的友元,不能说明C时A的友元。
  • 友元关系不能继承。

内部类

概念: 如果一个类定义在另一个类的内部,这个类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。

注意:
内部类默认为外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。

特性:

  1. 内部类可以定义在外部类的public、protected、private都是可以的。
  2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
  3. sizeof(外部类)=外部类,和内部类没有任何关系。

匿名对象

不取对象名,直接用类名定义的对象就是匿名对象。

//匿名对象
Date();

Solution().Sum_Solution(10);  //匿名对象调用成员函数

匿名对象的生命周期只在当前行,匿名对象具有常性。不过const引用可以延长匿名对象的生命周期,使生命周期变为当前局部域。

const& d = Date();

拷贝对象时的一些编译器优化

同一行的一个表达式中连续的构造,构造+拷贝构造,或连续拷贝构造,编译器会将其合二为一。 一个表达式中,连续拷贝构造+赋值重载 -> 无法优化

可以减少对象的拷贝。

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

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

相关文章

javaWeb ssh自习室管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh自习室管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,…

预报名通道已开启,2023第11届国际生物发酵展,8月4-6日上海见!

新机遇、新挑战、新发展 同期展会&#xff1a;酵素产品与益生产品展 制药机械与包装技术展 生化仪器及实验室设备展 合成生物技术与生物制造展 展会时间&#xff1a; 2023年8月4日 9:00-17:00 2023年8月5日 9:00-17:00 2023年8月6日 9:00-15:00 展会地点&#xff1a…

【数据结构】栈和队列选择题和面试编程题

目录 一、选择题 二、栈和队列的面试题 1、括号匹配问题 1.1 题目说明 1.2 题目解析 2、用队列实现栈 2.1 题目说明 2.2 题目解析 3、用栈实现队列 3.1 题目说明 3.2 题目解析 一、选择题 1、若进栈序列为 1,2,3,4 &#xff0c;进栈过程中可以出栈&#xff0c;则下列不可能的…

软考A计划-电子商务设计师-信息安全知识

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

安全防御——IDS(入侵检测系统)

安全防御——IDS&#xff08;入侵检测系统&#xff09; IDS介绍为什么需要IDSIDS的工作原理IDS的工作过程第一步&#xff1a;信息收集第二步&#xff1a;数据分析 IDS的主要检测方法1、模式匹配&#xff08;误用检测&#xff09;2、统计分析&#xff08;异常检测&#xff09;3、…

chatgpt赋能python:Python创建venv的完全指南

Python创建venv的完全指南 在Python开发中&#xff0c;虚拟环境是一个非常有用的工具。它可以让我们在同一台计算机上拥有多个Python环境&#xff0c;而不会互相干扰。在本文中&#xff0c;我们将介绍如何使用Python创建venv&#xff08;虚拟环境&#xff09;。 什么是venv&a…

4-5.配置信息和路由信息

一、配置信息 app.run()的参数 参数1&#xff1a;host&#xff0c;如果我们不指定&#xff0c;默认值是127.0.0.1。参数2&#xff1a;port&#xff0c;如果我们不指定&#xff0c;默认值是5000。参数3&#xff1a;debug&#xff0c;调试模式&#xff0c;如果不指定&#xff0…

chatgpt赋能python:Python创建画布语句

Python 创建画布语句 在数据可视化的领域&#xff0c;画布&#xff08;Canvas&#xff09;是一个重要的概念。画布可以视为一个空白的像素或向量画布&#xff0c;用于绘制图表、图形、图像和动画等。Python 提供了多种创建画布的方式&#xff0c;其中包括使用第三方库和内置库…

哲学家就餐问题(死锁)

本文主要讲述死锁的一个经典案例—哲学家就餐问题&#xff0c;并对该问题进行修复。 1. 问题描述 看上图&#xff0c;有五位哲学家&#xff0c;每天循环做两件事&#xff1a;思考&#xff0c;吃面。吃面时每人面前都有一个盘子&#xff0c;盘子左边和右边都有一根筷子&#xff…

5.3 树和二叉树的抽象数据类型定义

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.什么是树的抽象数据类型定义 树的抽象数据类型定义是指对树这种数据结构的一种抽象描述&#xff0c;其中包括了树的基本操作和性质。它定义了树作为一…

基于深度学习的目标姿态检测方法_kaic

目录 摘要 第1章 引言 1.1 研究背景和意义 1.2 国内外研究现状 1.3 主要内容 第2章 单目相机的目标姿态检测技术 2.1单目相机的工作原理 2.2目标姿态检测 2.3已有的目标姿态检测方法及其局限性 2.4本章总结 第3章 构建数据集 3.1 数据集来源 3.2数据集标注 3.3数据集分析 3.4本…

基于Springboot的社区论坛系统(源代码+数据库)055

部分代码地址 https://gitee.com/ynwynwyn/forum-public 基于Springboot的社区论坛系统(源代码数据库) 一、系统介绍 前台&#xff1a; 话题列表&#xff0c;搜索话题&#xff0c;发布话题通过标签筛选话题个人设置&#xff1a;修改个人信息&#xff0c;查看发布话题记录&a…

FPGA设计的指导性原则 (三)

例12. 在SDC文件中附加syn_ramstyle综合约束属性,指定综合存贮单元的类型 SDC文件是Synplicity综合工具通用的综合约束属性文件,其扩展名为”sde”。在SDC 指定 syn_ramstyle的语法格式为: define_attribute (signal_name [bit_range)) syn_ramstyle (atring) 其中,黑体…

1.Python高频函数—数据合并merge()

前言 数据处理中经常对多个表的数据进行合并处理&#xff0c;python 提供两个十分好用的函数处理。merge() 、 concat() merger函数是Python里的数据分析工作中最常见的函数之一&#xff0c;主要应用场景是&#xff1a;针对同一个主键存在两张不同字段的表。&#xff08;这里强…

《Kali渗透基础》05. 主动信息收集(二)

kali渗透 1&#xff1a;端口扫描2&#xff1a;UDP 扫描2.1&#xff1a;Scapy2.2&#xff1a;nmap 3&#xff1a;半开放扫描3.1&#xff1a;Scapy3.2&#xff1a;nmap3.3&#xff1a;hping3 4&#xff1a;全连接扫描4.1&#xff1a;Scapy4.2&#xff1a;nmap4.3&#xff1a;dmit…

前端web入门-CSS-day04

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 复合选择器 后代选择器 子代选择器 并集选择器 交集选择器 伪类选择器 伪类-超链接&#xff08;拓…

leetcode95--不同的二叉搜索树 II(java)

不同的二叉搜索树 II leetcode95 -- 不同的二叉搜索树 II题目描述 解题思路代码演示二叉树专题 leetcode95 – 不同的二叉搜索树 II 原题链接: https://leetcode.cn/problems/unique-binary-search-trees-ii/ 题目描述 给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节…

HTTP协议+Ajax基本知识+axios+模板引擎的基本使用

1.客服端服务器 我们先来了解一下上网的目的是什么&#xff1f; 例如&#xff1a;刷微博、浏览新闻、在线听音乐、在线看电影、等等... 上网的本质目的&#xff1a;通过互联网的形式来 获取和消费资源 1.2 服务器 上网过程中&#xff0c;负责 存放和对外提供资源 的电脑&am…

dockers映射网络及数据卷

DOCKER docker run创建镜像时 1&#xff09;检查本地是狗存在指定的惊像 2&#xff09;利用镜像创建并启动一个容器 3&#xff09;分配一个文件系统给容器&#xff0c;在只读的镜像曾外改在一层可读可写层 4&#xff09;从宿主机配置的网桥接口中桥接一个虚拟机接口到容器…

springboot+vue实验室器材预约学习系统设计与实现

1、理论学习 深入学习Java Web开发技术。 在此基础上研究核心框架SpringBoot, MyBatis和Bootstrap等&#xff0c;为设计开发基于J2EE_SpringBoot的中药实验管理系统做好技术准备。 2.1功能要求 课题以提高中药实验开放共享、实施实验室网络化管理、提供优质的实验教学信息化服…