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;
}

在这里插入图片描述

总结

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

手把手用LTspice仿真运算放大器电路:从虚短虚断到频响分析 本文通过LTspice仿真软件,手把手教你从搭建基础运算放大器电路开始,验证虚短虚断原理,并逐步深入频响分析与稳定性探究。内容涵盖反相/同相放大器、积分器仿真,导入真实运放模型进行蒙特卡洛分析,以及利用交流分析和波特图评估电路性能,帮助工程师和学生将抽象理论转化为直观、可测量的仿真结果,提升电路设计实战能力。 阅读详情

相关推荐

Mac上Office合法安装与激活全指南:2021/2024/M365区别解析

Office是微软办公套件的核心产品,其在macOS平台的部署逻辑与Windows截然不同——不依赖传统密钥激活,而是基于Microsoft账户与设备标识的云端绑定机制。理解这一原理,是解决‘无法验证开发者’‘打不开’‘功能受限’等常见问题的前提。Office 2021代表永久许可模型,Office 2024 LTSC面向企业离线场景,Microsoft 365则是持续订阅服务,三者在授权验证方式、更新策略与系统兼容性上存在本质差异。实际应用中,需结合macOS版本、芯片架构(Intel/Apple Sil

weixin_33491377的博客 1255

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

PPPoe的抓包分析(详细)

PPPoe的报文结构 可以看出PPPoe的报文结构其实很简单,只不过是将PPPoe的报文塞到以太网的载荷中,而且它的头部字段也十分的简单,TLV就不说了,code字段表示了PPPoe不同的报文类型,比较常见的就是上面的五个报文了,PPPoe的报文类型其实还蛮多的。session ID主要的作用就是标识一段会话,因为使用PPPoe的最主要作用就是使得多台设备可以借助以太网多点接入多点访问的特点去和一台设备做上网认证请求,这样运营商一台认证设备就可以满足多个用户的认证请求,这和PPP相比起来好的不止一点。

qq_47529104的博客 7870

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

智能环境感知:STM32多传感器数据融合与报警策略设计

本文详细介绍了基于STM32的多传感器数据融合系统设计,整合DHT11温湿度传感器、MQ-2烟雾检测和光照强度检测模块,通过智能算法实现环境感知与动态报警。系统采用数据滤波、多传感器校验和自适应阈值策略,显著提升监测精度与可靠性,并通过OLED显示屏提供清晰的多级报警界面。

plant的博客 201

AI工具赋能日常工作的实践指南:以产品经理与程序员为例

AI工具赋能日常工作的实践指南:以产品经理与程序员为例

专注于编程、AI、人工智能等多个领域内容研究和分析 591

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

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

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

JavaScript实现斗地主(附完整源码)

JavaScript实现斗地主(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1503

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

MATLAB与ROS联合仿真——订阅ROS消息类功能模块介绍

MATLAB与ROS联合仿真——订阅ROS消息类功能模块介绍 (1)输入参数:无 (2)输出参数:Xr和Yr是小车当前在世界坐标系下的坐标 (3)主要作用:作为ROS与MATLAB的通讯接口,从ROS中订阅小车当前的位置信息,并输出 (4)内部结构: (5)具体实现过程:通过ROS工具箱中的Subscribe模块从ROS中订阅话题/gazebo/link_statesa 通过Bus Selector模块选择ROS总线中的Pose

慕羽★的博客 2699

Android 14.0 SystemUI下拉通知栏通知去掉长按事件

在14.0的系统rom产品定制化开发中,在systemui模块中关于下拉状态栏这块也是非常重要的部分,最近在关于systemui下拉通知栏的每条通知部分 要求去掉通知栏通知的长按事件,不需要长按功能,所以就需要分析下关于长按事件是在哪里注册的,然后去掉就可以了,接下来分析实现 相关功能

安卓兼职framework和app工程师的博客 277

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

Spring AI Alibaba 1.x 源码分析-架构设计

本文通过分析Spring AI Alibaba 框架的源码,分析出其原理和架构设计,无论是用于项目开发、技术评估还是团队培训都具有重要价值。

program哲学 490

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

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

qq_53830608的博客 2081

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

🔍。

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

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

qyt_722的博客 1266

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

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

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、付费专栏及课程。

余额充值