c++的类与对象(下)

2023-11-12

1.初始化列表
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化,因为初始化只能初始化一次(初始化的本质就是只能初始化一次),而构造函数体内可以多次赋值
①.以一个冒号开始:接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或者表达式
②.初始化列表是每个成员定义的地方,不管你写不写,每个成员都要走初始化列表,不写的话,内置类型为随机值,自定义类型会调用默认构造
③.在声明给值是缺省值而非定义,这个缺省值是给初始化列表用的,如果初始化列表没有显式给值,就用这个缺省值,如果显式给值,就不用这个缺省值
④.每个成员在初始化列表中只能出现一次(初始化只能初始化一次)
⑤.类中包含以下成员,必须在初始化列表位置进行初始化
引用成员变量 - 引用必须在定义的时候初始化,而初始化列表是每个成员定义的地方
const成员变量 -const常量必须在定义的时候初始化
自定义类型成员(该类没有默认构造函数)
⑥.成员变量在类中的声明顺序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
2.explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用

A aa2=2;
//用2构造一个临时对象,再用这个临时对象拷贝构造aa2
//但编译器会优化,直接用2构造对象,只需要调用一次构造函数,而不用先调用构造函数再拷贝构造
const A&ref=2;
//必须用const修饰,因为2会生成一个临时变量,临时变量具有常性

类似

int i=0;
double d=1.1;
i=d;
//中间会生成一个临时变量

c++11支持多参数的转换

B bb2={2,2};
const B&ref={3,3};

如果用explicit修饰构造函数,将会禁止单参构造函数的隐式转换
3.static成员
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称为静态成员变量,用static修饰的成员函数,称为静态成员函数,静态的成员变量一定要在类外进行初始化
①.静态成员为所有类所共享,不属于某个具体的实例(静态成员变量属于整个类)
②.静态成员变量必须在类外定义,定义时不添加static关键字
在类内 static int n;
类外 int A::n=0;
③.类静态成员既可用类名::静态成员 也可以用对象.静态成员来访问
④.静态成员函数没有隐藏的this指针不能访问任何非静态成员
⑤.静态成员与类的普通成员一样,也有public,private,protected3种访问级别,也可以具有返回值
A*ptr=nullptr;
cout<n<m<<endl;
这里ptr->n,虽然ptr是空指针,但是n是静态成员变量,与用空指针调用成员函数一样,都是可以的
有没有解引用,不能看形态,要看存放的位置
static int&getm(){
return m;}
用引用返回,可以修改m
++A::getm();
私有与保护限制的是不能在类外访问,但是这个函数返回m不受影响

实现一个类,计算程序中创建出了多少个类对象

class A{
	public:
		A(){
			++n;
			++m;
		}
		A(const A&t){
			++n;
			++m;
		}
		~A(){
			--n;
		}
		private:
		int m;
		int n;
};

m代表一共创建了多少对象
n代表目前还有多少对象

求1+2+3+…+n,要求不能使用乘除法,for,while,if else,Switch case,位运算

class solution{
	class sum{
		public:
			sum(){
				_ret+=i;
				_i+=1;
			} 
	};
	public:
		int getsum(int n){
			sum a[n];
			return _ret; 
		}
	private:
	  	static int _ret;
		static int _i;	
};
int solution::_ret=1;
int solution::_i=0;

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

友元函数

比如之前想要重载<<符号,cout的输出流对象和隐藏的this指针都在抢第一个参数的位置,this指针默认是第一个参数,但如果构造正常函数,将this指针放在第二个参数,会导致类外无法访问私有成员,故采用友元
友元函数可以直接访问类的私有成员和保护成员,它是定义在类外的普通函数,不属于任何类,不是类的成员函数,但需要在类的内部声明,声明时需要加friend关键字
①.友元函数不能用const修饰,静态成员函数也不能用const修饰,因为const修饰的实质上是形参this指针,而友元函数和静态成员函数都没有this指针
②.友元函数可以在类定义的任何地方声明,不受类访问限定符的限制
③.一个函数可以是多个函数的友元函数
④.友元函数的调用与普通函数的调用和原理相同

友元类
①.友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类的非公有成员
②.友元类是单向的,不具有交换性
③.在time类中声明date类为其友元类,那么可以在date类中直接访问time类的私有成员变量,但不能在time类中访问date类的私有成员变量
④.友元关系不能传递,如果B是A的友元,C是B的友元,不能说C是A的友元

class Date;//前置声明
class Time;
{
	friend class Date;//声明Date类是Time类的友元类,可以在Date类中直接访问Time类的私有成员变量
	public:
		Time(int hour,int minute,int second)
	    :_hour(hour)
	    ,_minute(minute);
	    ,_second(second);
	    {}
	private:
		int _hour;
		int _minute;
		int _second;
};
class Date{
	public:
		Date(int year=1900,int month=1,int day=1)
			:_year(year);
			,_month(month);
			,_day(day);
			{}
			void settimeofdate(int hour,int minute,int second){
				_t.hour=hour;
				_t.minute=minute;
				_t.second=second;//因为已经声明了Date类为Time类的友元类,故Date类可以访问Time类的私有成员变量
			}
		private:
			int _year;
			int _month;
			int _day;
			Time _t;		
};

5.内部类
如果一个类定义在另一个类的内部,这个内部类就叫做内部类,此时内部类是一个独立的类,不属于外部类,不能通过外部类的对象去调用内部类,外部类对内部类没有任何优越的访问权限
内部类是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类不是内部类的友元(友元关系不具有交换性)
①.内部类可以定义在外部类的Public,protected,private都是可以的
②.内部类可以直接访问外部类的static,枚举成员,不需要外部类的对象/类名
③.sizeof(外部类)=外部类,和内部类没有任何关系

#include <iostream>
using namespace std;
class A{
	private:
		static int k;
		int h;
		public:
			class B{
				public:
				void fun(){
                    k=1;//内部类可以直接访问外部类的static,不需要对象名/类名
					A aa1;
					aa._h=1;//内部类是外部类的友元类,可以访问外部类的私有成员变量
				}
			};
};
int A::k=0;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++的类与对象(下) 的相关文章

  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • 替换后增量

    我自己已经有一个问题了 但我想扩展它后增量示例 https stackoverflow com questions 51308967 post increment with example char a D int b 5 System o
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 将 Azure AD 高级自定义角色与 Spring Security 结合使用以进行基于角色的访问

    我创建了一个演示 Spring Boot 应用程序 我想在其中使用 AD 身份验证和授权 并使用 AD 和 Spring Security 查看 Azure 文档 我执行了以下操作 package com myapp contactdb c
  • 使用 next.js 进行服务器端渲染与传统 SSR

    我非常习惯 SSR 意味着页面得到完全刷新并从服务器接收完整 HTML 的方法 其中根据后端堆栈使用 razor pub other 进行渲染 因此 每次用户单击导航链接时 它只会向服务器发送请求 整个页面将刷新 接收新的 HTML 这就是
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么这个作业不起作用?

    我有课Results which extends ArrayList
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • Flot 库将 y 轴设置为最小值 0 和最大值 24

    如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • centos网页/phpmyadmin 打不开_苹果手机Safari打不开网页?按下一个键,马上就能用...

    Safari 苹果手机自带的一个浏览器 很多人都认为是个垃圾 甚至把它卸载 但其实 Safari是当时乔布斯最看重的一个苹果武器 如果真要好好利用起来 这个自带软件远远比你想象的厉害
  • 下载LAMBDA Group的代码

    LAMBDA Group 的文章在其主页有公布代码和数据集 具体在其 主页 gt 数据与代码 下面的 代码 栏列了文章 比如点开第一篇 AcMR 里面有个下载代码的链接 code 但点开会发现 无法链接到服务器 根据杨嘉祺的邮件回复 在网址
  • Google前工程经理王忻:如何准备软件工程师的面试

    2010 10 20 10 48 4639次阅读 来源 伯乐在线 职场博客 已有0条评论 发表评论 关键词 Google 软件工程师 面试 作者 人力资源 收藏这篇资讯 导读 原文作者王忻 Google前工程经理 2003年月加入Googl
  • 【华为OD机试真题2023B卷 JAVA&JS】人气最高的店铺

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 人气最高的店铺 知识点贪心排序 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 某购物城有m个商铺 现决定举办一场活动选出人气最高店铺 活动共有n位市民参与 每位市民只能
  • 微信小程序Token登录验证

    上图是微信开发文档提供的图 最近开发一款小程序 看了许久的微信文档 这里来记录一下其中的登录与授权过程 总体流程 前端执行wx login 获取code传给后端 后端通过微信官方的登录凭证校验接口获取到session key与openid
  • 使用PHP语言实现ETH 及 token转账

    以太坊转账 废话不多说直接上代码 代码下载地址 https download csdn net download u012841825 11021920 github代码 用你们可爱的小手 点一下星星 https github com zc
  • Angular 模态框 入坑记

    今天用到了ui bootstrap中的modal 觉得用起来还不错 也比较简单 博主以前用个ngDialog做的模态框 虽然不知道对不对 但这个插件也还可以 这貌似是我目前为止用过最简单的功能了 所以博客内容也很简单 大家一看就能懂 因为博
  • Qt中布局管理使用总结

    目录 1 五大布局 1 1 QVBoxLayout垂直布局 1 2 QHBoxLayout水平布局 1 3 QGridLayout网格布局 1 4 QFormLayout表单布局 1 5 QStackedLayout分组布局 1 6 五大布
  • linux下多线程:经典生产者和消费者示例

    生产者和消费者典型案例 include
  • 使用db doctor批量更新库

    之前旧版本的封装库 在更新candence软件后 需要使用db doctor对其进行更新 但是一个一个更新太慢 搜了半天 没有找到如何批处理更新 直接硬钢 于是将放置封装库文件目录下任意类型文件全部设置 将原来选中的文件名和后缀替换为 点击
  • Mac远程Win桌面官方工具——Microsoft Remote Desktop for mac

    微软官方专门为Mac用户提供了一款类Windows mstsc的远程桌面工具 Microsoft Remote Desktop for mac 专门用于远程控制Windows桌面 但是 苹果Appstore中国区无法搜索到该软件 不知道什么
  • 简单几步升级Spring security4.x升级到5.x

    本次升级源自一次安全漏洞提醒 Spring Security 身份认证绕过漏洞 CVE 2022 22978 现将漏洞相关详情下发 如系统使用了受影响版本软件 请参照处置建议及时完成处理 风险名称 Spring Security 身份认证绕
  • oracle自动生成uuid的实现方法

    oracle自动生成uuid方法 1 创建一个表 1 create table t user id varchar2 200 name varchar2 200 2 生成uuid的语句 1 2 alter table t user modi
  • Android Studio出现ERROR: AdbHostServer.cpp:102: Unable to connect to adb daemon on port: 5037问题

    打开android studio自带模拟机出现问题 原因是adb exe因为被阻止不能启动 具体错误代码如下 Emulator emulator ERROR AdbHostServer cpp 102 Unable to connect t
  • 性能不输 x265!国产开源 AVS2 高清实时编码器 xAVS2

    2018 年 1 月 31 日 北京大学数字视频编解码技术国家工程实验室视频编码算法研究室 PKU VCL 开源了 AVS2 高清实时编码器 xAVS2 V1 0 AVS2 是我国新一代视频编码国家标准 和第一代 AVS 视频编码标准相比
  • jenkins添加网页链接方法

    代码 li 外网页测试链接 a href http www baidu com 百度 a li li 本地网页测试链接 a href http 192 168 0 236 8080 seed package index html 我的本地h
  • 高德地图实现点聚合功能的详细步骤加截取地图图片 (附源码)

    目录 介绍 准备工作 1 注册并登录高德地图开放平台 申请密钥 2 在Vue项目中安装高德地图的相关库 插件 一 点聚合 1 引入高德地图API font color purple initializeMap font color purp
  • Codeforces ZeptoLab Code Rush 2015

    Codeforces ZeptoLab Code Rush 2015 比赛链接 http codeforces com contest 526 A King of Thieves time limit per test 1 second m
  • python不能创建字典的是_python字典key不能是可以是啥类型

    python中字典的key不能是可变类型 字典可存储任意类型对象 其中值可以取任何数据类型 但键必须是不可变的 如字符串 数字或元组 语法格式 d key1 value1 key2 value2 字典是另一种可变容器模型 且可存储任意类型对
  • c++的类与对象(下)

    1 初始化列表 在创建对象时 编译器通过调用构造函数 给对象中各个成员变量一个合适的初始值 构造函数体中的语句只能将其称作为赋初值 而不能称作初始化 因为初始化只能初始化一次 初始化的本质就是只能初始化一次 而构造函数体内可以多次赋值 以一