C++默认函数和类的组合07

深入理解C++类的默认成员赋值和常量对象 本文探讨了C++中类对象的默认成员赋值机制,以及常量对象和常量成员函数的使用。通过实例展示了如何使用默认的成员逐一赋值将对象赋值给另一个对象,并指出了这种赋值方式的潜在问题。同时,介绍了如何通过const关键字声明不可修改的对象,并阐述了const成员函数的规则和意义。最后,通过类的组合使用,展示了如何在类中嵌入其他类的对象,实现代码的复用和结构的优化。 阅读详情

C++默认函数和类的组合

                        完成优先于完美

直接上代码:

  • 什么类的组合?
  • <通过把别人的对象当做自己成员,然后访问“可访问”成员>
    以另一个类的对象为数据成员
  • 类的组合:
    • 构造函数的写法,必须采用初始化参数列表的写法
#include"iostream"
#include"string"
using namespace std;
class Boy{
public:
	Boy(string name, int age) :name(name), age(age) { "construction funtion\n"; }
	void print()
	{
		cout << name << " " << age << endl;
	}
protected:
	void pringdata()
	{
		cout << age << '\t' << name<<endl;
	}
	int age;
	string name;
};
class girl {
public:
	// 必须用初始化参数列表
	girl(string boyname, int boyage, string gname) :boy(boyname, boyage) //init combine object
	{
		this->gname = gname;// init own object
	}
	// 可以合并一起写,或下面分开重载;设置默认数据
	girl(string gname) :gname(gname),boy("Bigboy",22) {}
	void print()
	{
		boy.print();
		//boy.printdata();  不可访问,因为boy对于Boy来说类外
		cout << gname << endl;

	}
protected:
	string gname;
	Boy boy;// only can create a none argument object
};
int main()
{
	Boy b("YY",21);
	b.print();
	girl G("boy",19,"G");
	G.print();
	girl g = { "ff" };
	g.print();

	
	return 0;
}

在这里插入图片描述

类的组合构造顺序问题:

  • 构造顺序只和定义对象顺序的有关,和初始化参数列表无参
#include"iostream"
#include"string"
using namespace std;
class A {
public:
	A(string aa) :a(aa) { cout << a << endl; }
protected:
	string a;
};
class B{
public:
	B(string bb) :b(bb) { cout << b << endl; }
protected:
	string b;
};
class C {
public:
	C(string cc) :c(cc) { cout << c << endl; }
protected:
	string c;
};
class D {
public:
	D(string a,string b,string c) :a(a),b(b),c(c) { cout << 'D' << endl; }
protected:
	A a;
	B b;
	C c;
};
int main() {

	D d("A", "B", "C");
	return 0;
}

在这里插入图片描述

类中类

  • 依旧受权限限定
  • 访问方式,需要类名限定
#include<iostream>
#include<string>
using namespace std;
struct Node 
{
	int data;
	Node* next;
};
class List {
public:
protected:
	Node* headnode;//看做数据
private:
	class iterator {
	public:

	protected:
    // 类中类
	};

};
int main()
{
	List::iterator iter;// 不可访问
	return 0;
}

在这里插入图片描述
private ----> public is OK;
迭代器:类模仿指针行为
可以用类中类来 遍历链表

#include <iostream>
using namespace std;
struct Node 
{
	int data;
	Node* next;
	Node()
	{
		this->next = nullptr;
	}
	Node(int data) 
	{
		this->next = nullptr;
		this->data = data;
	}
};
class List 
{
public:
	List() 
	{
		headNode = new Node;
	}
	void push_front(int data) 
	{
		Node* newNode = new Node(data);
		newNode->next = headNode->next;
		headNode->next = newNode;
	}
protected:
	Node* headNode;
public:
	//迭代器-->类模仿指针行为
	class iterator 
	{
	public:
		iterator(Node* pMove=nullptr) :pMove(pMove) {}	
		void operator=(Node* pMove) 
		{
			this->pMove = pMove;
		}
		bool operator!=(Node* pMove) 
		{
			return this->pMove != pMove;
		}
		iterator operator++()
		{
			pMove = pMove->next;
			return iterator(pMove);
		}
		Node*& operator*() 
		{
			return pMove;
		}
	protected:
		Node* pMove;
	};
	Node* begin()
	{
		return headNode->next;
	}
	Node* end() 
	{
		return nullptr;
	}
};
//类中枚举类型
class  A 
{
public:
	enum time {first,second};
protected:
	enum date {mon,sur,tus};
	//类中的枚举类型受权限限定
};

int main() 
{
	List list;
	for (int i = 0; i < 3; i++) 
	{
		list.push_front(i);
	}
	List::iterator iter;
	for (iter = list.begin(); iter != list.end(); ++iter)
	{
		cout << (*iter)->data;
	}
	//cout << A::date::mon << endl; 不可访问
	cout << A::time::first << endl;
	return 0;
}

在这里插入图片描述

C++类中默认的函数

  • 默认构造函数
  • 默认拷贝构造函数
  • 默认析构函数
  • 默认赋值运算
#include <iostream>
using namespace std;
class A
{
public:
	A() = default;  //调出默认函数
	A(A& object) = default;  //默认拷贝构造函数 对对object引用
	//void print() = default;  它 普通函数不存在默认函数
	A& operator=(A& object) = default;  // 等号赋值运算也是有默认函数
	~A() = default;
};
int main()
{
	A a;
	A b = a;
	A c;
	c = a;
	return 0;
}

在这里插入图片描述

总结

迭代器:类模仿指针行为
可以用类中类来 遍历链表

电赛综合测评题练习(一)-(与2013年电赛综合测评要求类似) 电赛综合测评题练习 文章目录电赛综合测评题练习前言1. 波形发生器1.1 题目说明1.1.1 可用器件1.1.2 设计要求1.1.3 设计方案论证1.2 仿真电路设计1.2.1 脉冲波发生器电路1.2.1.1 方案介绍1.2.1.2 理论分析与计算1.2.1.3 电路系统设计1.2.1.4 仿真方案与仿真测试结果1.2.2 锯齿波电路1.2.2.1 理论分析与计算1.2.2.2 电路系统设计1.2.2.3 仿真方案与仿真测试结果1.2.3 正弦波I电路1.2.3.1 理论分析与计算1.2.3.2 电路系 阅读详情

相关推荐

ADB详细(从下载安装到灵活运用)

ADB(Android Debug Bridge)是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。可以在Android SDK/platform-tools中找到 adb 工具或下载ADB Kits。

LiuYong_01的博客 10万+

c++实现排列与组合

直接实现排列较为难,可以先实现全排列和组合,在组合的每个结果中调用全排列函数,可以较为直观实现非全排列的实现。 我们先来实现组合:对C(N,M),如果M已知,则直接写M值已知,则直接写M个嵌套循环即可实现。例如,M=3: for(int i=0;i<len;i++) for(int j=i+1;j<len;j++) for(int k=j+1;k<l...

hangyudd的博客 5695

Java8动态生成SFunction:基于字段名的Lambda表达式实践

本文深入探讨了在Java8中如何基于字段名动态生成SFunction,以解决MyBatis Plus的LambdaQueryWrapper在动态查询场景下的局限性。通过核心原理LambdaMetafactory的解析和手把手的代码实现,展示了如何将字符串字段名转换为类型安全的Lambda表达式,从而实现真正动态、类型安全的查询条件构建与通用数据处理,显著提升代码的灵活性与安全性。

sss66的博客 953

C++实现组合

intfunc(intn,intm){//这个函数功能是实现组合C(n,m) intans=1; for(inti=1;i<=m;i++){ ans=ans*(n-i+1)/i; } returnans; } ...

qq_41687938的博客 384

[Linux外设驱动详解]RK3588 U-Boot网络功能深度分析

本文深入分析了RK3588平台上U-Boot的网络功能实现,主要内容包括: 网络架构:详细剖析了从硬件层到协议层的完整网络栈架构,包括GMAC驱动、TFTP/NFS启动、网络命令等关键组件。 驱动实现:重点介绍了RK3588 GMAC驱动结构,包含关键数据结构、专用操作函数集、设备树兼容性配置和GRF寄存器设置。 功能实现:详细说明了驱动初始化流程、RGMII速度适配机制以及PHY接口配置过程。 高级特性:涵盖了网络启动功能、镜像更新和MAC地址传递到Linux内核的机制。 文档通过代码片段和流程图清晰展示

Just Linux! 1114

手把手教你用ADuC845 DAC调试恒流电路(附实测数据与避坑指南)

本文详细介绍了如何利用ADuC845 DAC调试恒流电路,包括硬件搭建、DAC输出校准、低端死区问题解决方案及系统级调试技巧。通过实测数据和避坑指南,帮助工程师快速解决非线性输出和稳定性问题,提升电路性能。

life6的博客 336

高效学 C++|组合类的构造函数

设计好MyString类后,就可以像使用普通类型一样使用它了。例如,类的对象可以像普通的变量一样作为另一个类的数据成员。

不断学习,不断进步,提高自己 1134

OCR开发实战:如何用PaddleOCR C++版实现本地文字识别(附模型文件处理技巧)

本文详细介绍了如何使用PaddleOCR C++版实现本地文字识别,包括环境搭建、工程编译、运行时优化等全流程。重点讲解了在VS2019/VS2022环境下配置PaddleOCR的CPU推理性能优化技巧,以及模型文件处理的实际应用方法,帮助开发者高效完成OCR本地化部署。

devops8pract的博客 335

C++排列组合及应用

1. 基础 1.1. 加法原理 加法原理是分类计数原理,常用于排列组合中,具体是指:做一件事情,完成它有n类方式,第一类方式有M1种方法,第二类方式有M2种方法,……,第n类方式有Mn种方法,那么完成这件事情共有M1+M2+……+Mn种方法。 如:从武汉到上海有乘火车、飞机、轮船3种交通方式可供选择,而火车、飞机、轮船分别有k1,k2,k3个班次,那么从武汉到上海共有k1+k2+k3种方式可以到达。 1.2. 乘法原理 做一件事,完成它需要分成n个步骤,做第一 步有m1种不同的方法,做第二步有m2种不同的方

飞鹤的程序员人生 4833

Ruoyi-Cloud集成Seata2.0实现分布式事务

在网络上,关于Spring Cloud和Ruoyi-Cloud整合Seata的教程有很多,针对不同版本的 Seata 也有不少相关教程。事实上,无论是 Spring Cloud 还是 Ruoyi-Cloud,其整合 Seata 的原理基本相同。这篇博文将详细介绍如何在本地开发环境下,在中实现Seata 2.0的整合,希望能为大家在分布式项目中实现 Seata 的整合提供实用的帮助,提供一个清晰的操作思路。

SR003的博客 2246

ArcGIS实验教程——实验二十五:大型商场选址经典案例

本实验基于ArcGIS平台进行商场选址分析,综合考虑道路、居民点、停车场和已有商场四个影响因素。通过缓冲区分析建立各要素的影响范围(道路50米、居民点100米、停车场100米、已有商场500米),采用叠加分析中的相交和擦除运算确定最优选址区域。实验建立了区位评价体系,通过属性赋值(1/-1)和联合运算生成综合评价结果,并实现分级可视化显示。注意事项包括距离参数设置对结果的影响以及正确选择空间分析工具。该流程为商业选址提供了科学的GIS解决方案。

智慧空间实验室 1万+

C++类的组合

一、类的组合 1.以另一个类的对象为数据成员 ●构造函数的写法,必须采用初始化参数列表的写法 #include<iostream> #include<string> using namespace std; class Boy { public: Boy(string name, int age) :name(name), age(age){} void print() { cout << name &l...

qq_54492880的博客 4396

SAP ABAP CDS View 里的日期函数

摘要:本文系统介绍了ABAP CDS日期函数在企业级应用中的关键作用,包括账龄计算、合同续期等业务场景。重点解析了DATS_IS_VALID、DATS_DAYS_BETWEEN等核心函数的语义和使用边界,特别强调on_error四种异常处理策略的选择逻辑。针对系统日期获取,对比了经典CDS的参数注入和View Entity会话变量两种方式。文章还提供了完整可运行的示例代码(包含CDS视图和ABAP程序),帮助开发者快速验证不同版本下的函数行为差异,确保在实际项目中正确应用这些日期处理函数。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 379

【C++】构造函数与类的组合以及初始化

构造函数 构造函数出现原因 举例桌子类Table,属性为长宽高,一个输出函数printf,一个设置函数set,在主函数内定义桌子类的对象t,输出该对象的属性,又定义了桌子属性类的对象t1,设置高为60,输出该对象的属性,如下代码所示:

qq_53830608的博客 2081

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【C++课程学习】:继承:默认成员函数

🔍。

路虽远,行则将至!事虽难,做则必成! 5846

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

c++类的对象与使用、类的构造函数、类的组合

作为一种典型的面向对象程序设计语言,C++ 语言将抽象之后的数据和函数封装在一起,就构成了 C++ 的类。 类是面向对象程序设计方法的核心——通过类,我们可以实现对于数据的封装和隐藏。 C++ 语言中,继承自 C 语言的部分——面向过程的编程范式。在面向过程的结构化程序设计中,程序的模块是由函数构成的,函数将逻辑上相关的语句与数据封装,用于完成特定的功能。 在面向对象的程序设计中,程序模块是由一个个的类构成的——类是对逻辑上相关的函数与数据的封装,是对问题的抽象描述。因此,后者的集成度更高,也就更适合用于大

qyt_722的博客 1266

c++类的组合、类中类、类中默认的函数、类中的枚举、移动构造

小技巧:能用组合,尽量不用继承 以另一个类的对象为数据成员 组合类的对象,写构造函数,必须采用初始化参数列表的写法 对于组合类的构造函数 ~要为自己的属性初始化--->初始化参数列表,this指针 ~为组合类的对象做初始化<--->必须采用初始化参数列表的方式调用分支类的构造函数 MM类以boy类的对象为数据成员 #include <iostream> using namespace std; class Boy { public:......

weixin_60569662的博客 574

【类与对象】组合类的构造函数和复制构造函数

初始化列表 初始化列表是用于构造函数参数的初始化,与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。 如: class myClock { public: myClock(int hh,int mm,int ss); //构造函数的声明 private: int hour,minu,second; }; //构造函数的实现和初始化设定 myClock::myCl

小宋小宋 4678

C++中类的组合

今天时间匆忙,明天整理后写出

u014158041的专栏 6073

c++——类的组合对内嵌对象的初始化

首先

Cipher的博客 4901

第07节 C++类的组合

C++类的组合 ## 以另一个类的对象为数据成员 例子1:类的组合 #include <iostream> #include <string> using namespace std; class Boy { public: Boy(string name, int age) :name(name), age(age){} protected: string name; int age; }; class MM { public: protected: string mmNa

qq_24409999的博客 484

C++类的定义

静态数据成员 用关键字static声明 为该类的所有对象共享,静态数据成员具有静态生存期 必须在类外定义和初始化,用(::)来指明所属的类 class 类名称 { // 在关键字public后面声明的是共有类型成员,类与外部的接口,任何外部函数都可以访问共有类型数据和函数。类(class)中只有声明,定义在外部定义 public: 共有成员(外部接口) //在关键字private后面声明的是私有类型成员,只允许本类中的函数访问,而类外部的任何函数都不能访问。

Sermisry的博客 5672

Day 7 C++类的组合和一些默认函数

一、以另一个类的对象作为一个类的数据成员 1.构造函数的写法必须采用初始化参数列表的写法 注意点:①当B类含有数据成员A a;时,此时的a是不能直接初始化的。 ②一般在B的构造函数参数中,先写类组合的参数,且在初始化参数列表中用的是调用A的初始化成员列表(A的构造函数的方式) ③权限问题:B类中的a对象相对于A类是属于类外的,仅能通过“提供一个接口”去访问protected中的数据成员(函数),但是B类访问自己是不受限制的(如下面B类中的print()函数,通过A类中写好...

zjjaibc的博客 325

【Cpp筑基】三、对象和类

内联函数是一种建议编译器在每次调用该函数时,将其代码插入到调用点处,而不是进行常规的函数调用。这可以减少函数调用的开销,提高程序执行效率,尤其是对于短小的函数。

Shen Mu Xin's Blog 1300

c++ 继承 和 组合

下⾯我们看到Person是基类,也称作父类。man是派生类,也称作子类。(因为翻译的原因,所以既叫基类/派生类,也叫父类/子类)继承的结构。

be_a_big_cattle的博客 1471
上一篇: 06C++运算符重载
下一篇: C++类继承和派生类08 继承家产上辈
燕子01
博客等级 码龄6年 8粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值