c++类和对象(下篇)下

        下面就来补充一下c++雷和对象最后一点内容.

        首先先补充一下上一篇博客上c++类和对象(下篇)上-CSDN博客最后学习的静态成员变量的小练习求1+2+3+...+n_牛客题霸_牛客网 (nowcoder.com)下面就是题解.灵活的运用了静态成员变量不销毁的特点,建立数组利用构造函数来完成n次相加.

class A{
public:A(){_sum+=_a;++_a;}static int Getsum(){return _sum;}
private:static int _a;static int _sum;
};
int A::_a=1;
int A::_sum=0;
class Solution {
public:int Sum_Solution(int n) {A arr[n];return arr[0].Getsum();}
};

        下面我们开始今天的学习.

友元

        其实在日期类中重载<<,>>操作符是已经使用过友元函数了.下面就让我们好好的了解一下友元.

        友元提供了⼀种突破类访问限定符封装的⽅式,友元分为:友元函数和友元类,在函数声明或者类声明的前⾯加friend,并且把友元声明放到⼀个类的里面.

        友元函数:外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数.友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制.只是声明.且⼀个函数可以是多个类的友元函数.

        友元类:如果A是B的友元类,那么A可以访问B中的私有和保护成员.友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元.友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元.(互为友元要声明和定义分离,不然会有定义在上面的那个找不到下面的成员的问题)

        虽然友元可以提供便利,但是友元破坏了封装,所以友元尽量不要多用.

        一点点相关练习(注释是我的易错点)

//要先声明,不然A不认识B
class B;class A
{friend void Func(A& a, B& b);
public:A(int a1,int a2){_a1 = a1;_a2 = a2;}
private:int _a1 = 0;int _a2 = 0;
};class B
{friend void Func(A& a, B& b);
public:B(int b1){_b1 = b1;}
private:int _b1 = 0;
};void Func(A& a, B& b)
{cout << a._a1 << " " << a._a2 << endl;cout << b._b1<< endl;
}
int main()
{A a= { 5,6 };B b = 2;Func(a, b);return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>using namespace std;class A
{friend void Func(A& a);
public:A(int a1, int a2):_a1(a1),_a2(a2){}
private:int _a1 = 0;int _a2 = 1;
};void Func(A&a)
{cout << a._a1 << " " << a._a2 << endl;
}
int main()
{A a= { 5,6 };Func(a);return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>using namespace std;class Time
{friend class Date;
public:Time(int hour=8):_hour(hour){}
private:int _hour;
};class Date
{
public:Date(int year = 2025, int month = 3, int day = 19):_year(year), _month(month), _day(day)//,_hour(hour){}void Func(Time& t){cout << t._hour<<endl;cout << Time()._hour << endl;//cout<<_hour<<endl// 会有为识别_hour的报错//_hour不可以在友元类中直接使用,要先创建出自己类的对象在使用,或用匿名对象来使用才可以//也不可以直接在构造函数中直接用初始化列表来初始化_hour}
private:int _year;int _month;int _day;
};int main()
{Time t;Date d;d.Func(t);return 0;
}

内部类

        如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类.内部类是⼀个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类.(用sizeof计算时只算自己的类的大小).且内部类默认是外部类的友元类.(内部类可以访问外部类的成员变量但是外部类却不能访问内部类的成员函数).

        内部类本质也是⼀种封装,当A类实现出来主要就是给B类使用,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了.(主意和友元做区分,友元不受访问限定符的限制.)


class A
{
public:class B{public:void Fuc(const A&a){cout << a.a1 << " " << a2 << endl;}private:int b = 0;};
private:int a1 = 0;static int a2;
};int main()
{cout << sizeof(A) << endl;A a;//B b;//没有突破类域所以没办法找到B这个类A::B b;b.Fuc(a);return 0;
}
class A
{
public:private:int a1 = 0;static int a2;class B{public:void Fuc(const A& a){cout << a.a1 << " " << a2 << endl;}private:int b = 0;};
};int main()
{cout << sizeof(A) << endl;A a;//B b;//没有突破类域所以没办法找到B这个类//A::B b;//b.Fuc(a);//定义为private后就不能在类外访问了return 0;
}

匿名对象

       类型(实参) 定义出来的对象叫做匿名对象,而之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象.匿名对象⽣命周期只在当前一行,即用即销毁.(在向链表/顺序表中插入数据时很好用).

        一点点相关代码

class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};
int main()
{A(1);return 0;
}

对象拷贝时的编译器优化(了解)

        现代编译器会为了尽可能提⾼程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传返 回值的过程中可以省略的拷⻉,但是在c++标准中却没有定义如何优化.一般看编译器,下面简单的了解下几种适中的编译器优化.(通常会比下面说的更优化)

        1.传值传参下同一行中连续的构造+拷贝构造->直接构造

        2.传值返回,连续构造+拷贝构造->直接构造

                        ​    

        以上就是我所学习的类和对象的全部内荣啦,类和对象暂时告一段落了.大家晚安

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

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

相关文章

《TCP/IP网络编程》学习笔记 | Chapter 19:Windows 平台下线程的使用

《TCP/IP网络编程》学习笔记 | Chapter 19&#xff1a;Windows 平台下线程的使用 《TCP/IP网络编程》学习笔记 | Chapter 19&#xff1a;Windows 平台下线程的使用内核对象内核对象的定义内核对象归操作系统所有 基于 Windows 的线程创建进程与线程的关系Windows 中线程的创建方…

分布式事务解决方案:Seata原理详解与实战教程

一、为什么需要Seata&#xff1f; 在微服务架构中&#xff0c;跨服务的事务管理成为核心痛点&#xff1a; 传统事务失效&#xff1a;服务拆分导致无法使用本地事务数据不一致风险&#xff1a;网络抖动、服务宕机等情况导致数据错乱复杂场景处理难&#xff1a;涉及多个数据库、…

docker需要sudo才能使用

一种方法是添加当前用户到docker组里去&#xff0c;当时添加的时候貌似是没问题的&#xff0c;但是现在又不可以了 产生的报错 ❯ docker images Cannot connect to the Docker daemon at unix:///home/ying/.docker/desktop/docker.sock. Is the docker daemon running?解决…

学习记录 6 pointnet复现

一、复现代码 然后去找相关的2d的声呐图像分类的算法 融合可以搞的&#xff0c;虽然有文献但是不多&#xff0c;感觉也是可以的 """ Author: Benny Date: Nov 2019 """import os import sys import torch import numpy as npimport datetime …

Linux 文件操作-标准IO函数3- fread读取、fwrite写入、 fprintf向文件写入格式化数据、fscanf逐行读取格式化数据的验证

目录 1. fread 从文件中读取数据 1.1 读取次数 每次读取字节数 < 原内容字节数 1.2 读取次数 每次读取字节数 > 原内容字节数 2.fwrite 向文件中写入数据 2.1写入字符串验证 2.2写入结构体验证 3. fprintf 将数据写入到指定文件 4. fscanf 从文件中逐行读取内容…

Python 中下划线 “_” 的多面性:从变量到约定

# Python中下划线“_”的多面性&#xff1a;从变量到约定 在Python的语法体系里&#xff0c;下划线“_”看似毫不起眼&#xff0c;实则扮演着极为重要且多样化的角色。它不仅能作为普通变量参与编程&#xff0c;更在多个特殊场景下有着独特的用途与约定。深入理解下划线的各种…

深入 Linux 声卡驱动开发:核心问题与实战解析

1. 字符设备驱动如何为声卡提供操作接口&#xff1f; 问题背景 在 Linux 系统中&#xff0c;声卡被抽象为字符设备。如何通过代码让应用程序能够访问声卡的录音和播放功能&#xff1f; 核心答案 1.1 字符设备驱动的核心结构 Linux 字符设备驱动通过 file_operations 结构体定…

基于Spring Boot的图书管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

记录 macOS 上使用 Homebrew 安装的软件

Homebrew 是 macOS 上最受欢迎的软件包管理器之一&#xff0c;能够轻松安装各种命令行工具和 GUI 应用。本文记录了我通过 Homebrew 安装的各种软件&#xff0c;并对它们的用途和基本使用方法进行介绍。 &#x1f37a; Homebrew 介绍 Homebrew 是一个开源的包管理器&#xff…

个人AI助手的未来:Yi AI开源系统助力快速搭建

摘要 Yi AI推出了一站式个人AI助手平台解决方案&#xff0c;助力用户快速搭建专属AI助手。该平台采用全套开源系统&#xff0c;涵盖前端应用、后台管理及小程序功能&#xff0c;并基于MIT协议开放使用。同时&#xff0c;平台集成了本地RAG方案&#xff0c;利用Milvus与Weaviate…

dpkg-architecture命令详解

dpkg-architecture 是 Debian 系系统中用于处理软件包架构相关操作的工具&#xff0c;尤其在软件包构建和交叉编译环境中至关重要。以下是其核心功能及用法的详细说明&#xff1a; ‌一、核心功能‌ ‌架构查询与验证‌ 显示或验证当前系统&#xff08;DEB_HOST_ARCH&#xff…

STM32HAL库,解决串口UART中断接收到的第一个字节数据丢失

1.问题描述&#xff1a; 只有上电后第一次接收到的第一字节数据会丢失&#xff0c;往后再接收也不会存在问题了。 2.先贴出来重写UART中断回调函数 我在接收到第一字节数据后开启定时器中断的&#xff0c;做一个超时处理&#xff0c;每次接收到数据会对定时器计数值清零&…

解决 vxe-table 固定列对不齐,滚动后错位、展开行遮挡的问题,解决渲染空白、边框丢失问题

解决 vxe-table 固定列对不齐&#xff0c;滚动后错位、展开行遮挡的问题&#xff0c;解决渲染空白、边框丢失问题。 解决方法&#xff0c;更新到最新版本就完美解决了&#xff1b;v4 版本更新到 v4.12&#xff0c;v3版本更新到 v3.14 查看官网&#xff1a;https://vxetable.cn…

React相关面试题

以下是150道React面试题及其详细回答&#xff0c;涵盖了React的基础知识、组件、状态管理、路由、性能优化等多个方面&#xff0c;每道题目都尽量详细且简单易懂&#xff1a; React基础概念类 1. 什么是React&#xff1f; React是一个用于构建用户界面的JavaScript库&#xff…

设备健康管理系统是什么,设备健康管理系统多少钱?

想象一下&#xff0c;你的汽车在仪表盘报警前 3 天&#xff0c;手机就收到 “发动机轴承剩余寿命 1500 公里” 的提醒 —— 这就是 ** 设备健康管理系统&#xff08;EHM&#xff09;** 的日常。在制造业&#xff0c;设备故障每年造成全球 3.4 万亿美元损失&#xff0c;而 80% 的…

Redis项目:秒杀业务

/*** 抢购秒杀券** param voucherId* return*/TransactionalOverridepublic Result seckillVoucher(Long voucherId) {// 1、查询秒杀券SeckillVoucher voucher seckillVoucherService.getById(voucherId);// 2、判断秒杀券是否合法if (voucher.getBeginTime().isAfter(LocalD…

区块链(Blockchain)

区块链&#xff08;Blockchain&#xff09;是一种去中心化、分布式的账本技术&#xff0c;它通过密码学保证数据的安全性和不可篡改性。它的核心特点包括去中心化、不可篡改性、可追溯性、智能合约等。 区块链的关键概念 区块&#xff08;Block&#xff09;&#xff1a;每个区…

和鲸科技受邀赴中国气象局气象干部培训学院湖南分院开展 DeepSeek 趋势下的人工智能技术应用专题培训

为深入贯彻落实国家关于人工智能与气象业务深度融合的战略部署&#xff0c;提升在实际业务中应用人工智能技术解决问题的能力&#xff0c;推动气象现代化高质量发展&#xff0c;中国气象局气象干部培训学院湖南分院于 2025 年 3 月 14 日组织开展 “DeepSeek 等人工智能技术在气…

Ubuntu 24 常用命令方法

文章目录 环境说明1、账号管理1.1、启用 root 2、包管理工具 apt & dpkg2.1、apt 简介 & 阿里源配置2.2、dpkg 简介2.3、apt 和 dpkg 两者之间的关系2.4、常用命令 3、启用 ssh 服务4、防火墙5、开启远程登录6、关闭交换分区7、build-essential&#xff08;编译和开发软…

OpenCV计算摄影学(22)将输入的彩色图像转换为两种风格的铅笔素描效果函数pencilSketch()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 铅笔风格非写实线描图。 该函数通过图像处理技术将输入的彩色图像转换为两种风格的铅笔素描效果&#xff1a; dst1&#xff1a;炭笔效果的灰度图…