c++(二)

news2024/11/17 4:42:50

C++(二)

  • 类和对象
    • C中的结构体和C++中的结构体有什么区别
    • C++中的结构体和类有什么区别
    • 访问限定符
    • 类的定义
    • 对象
    • 类与对象之间的关系
    • 封装
  • this指针
  • 类中特殊的成员函数
    • 构造函数
      • 默认构造函数
      • 普通构造函数
      • 拷贝构造函数
        • 浅拷贝
        • 深拷贝
    • 析构函数

类和对象

什么是结构体:描述一类事物相关属性的集合,是一种自定义的数据类型

C中的结构体和C++中的结构体有什么区别

  • c中结构体不能有函数,而c++的结构体可以有函数
  • c中空结构体的大小为0,而c++的空结构体的大小为1
    在这里插入图片描述
    在这里插入图片描述

C++中的结构体和类有什么区别

  • c++结构体的关键字是struct,类的关键字是class
  • c++结构体定义的叫做变量,类定义的叫做对象
  • 如果没有写访问限定符,c++结构体默认是共有的,类默认是私有的
  • c++中的空结构体和空类的大小都是1

在这里插入图片描述
在这里插入图片描述

访问限定符

访问限定符
public:共有的,在类内可以访问,在类外也可以访问
private:私有的,在类内部可以访问,在类的外部不能访问
protected:受保护的,在类内部可以访问,在内外不能访问

类的定义

class 类名
{
	//访问限定符
	public:
	private:
	protected:
	//成员
	成员变量:属性
	成员函数:行为
};

对象

用类这种自定义数据类型定义的变量就叫做对象

类与对象之间的关系

类是抽象的对象,对象是类的具体化

封装

面向对象编程的特点:封装、继承、多态、抽象
把一类事物共同的的属性和行为提取出来(抽象),将提取出来的内容用一个自定义的数据类型保存起来,将该隐藏的隐藏,该暴露的暴露出来
隐藏:属性
暴露:行为

  1. 每一个对象都有一份自己的成员变量
  2. 所有的对象公用一得成员函数
  3. 类的大小是由成员变量来决定,遵循字节对齐
  4. 类本身不占内存空间,但是有大小,只有在实例化对象的时候才会分配内存空间
#include <iostream>
using namespace std;
//定义类
//class 类名
//{
// //访问限定符:
//public://共有的,在类内部可以访问,在类外部也可以访问
//private://私有的,在类内部可以访问,在类的外部不可以访问
//protected://受保护的,在类内部可以访问,在类的外部不可以访问
// //成员
// 成员变量:属性
// 成员函数:行为
//};
class Phone
{
public:
	//行为
	void call()
	{
		cout << "打电话中..." << endl;
	}
	void sendMessage()
	{
		cout << "发短信" << endl;
	}
	void playGames()
	{
		cout << "打游戏" << endl;
	}
	void setPrice(int _price)
	{
		price = _price;

	}
	void show()
	{
		cout << "价格为:" << price << endl;
		}
private:
	//属性
	string brand;
	string color;
	int price;
	int size;
	protected:
};
int main()
{
	//类的大小
	cout << sizeof(string) << endl;//28
	cout << sizeof(Phone) << endl;//类的大小是由成员变量的大小来决定的
	//实例化对象
	Phone phoneA;
	phoneA.setPrice(3999);
	phoneA.show();
	Phone phoneB;
	phoneB.setPrice(4999);
	phoneB.show();
	phoneA.show();
	return 0;
}

在这里插入图片描述

this指针

  • 哪个对象调用类中的成员函数,this指针指向的就是哪个对象的地址
  • 每一个非静态成员函数都隐藏了一个this指针,this指针的格式
类名 * const this;

备注:this指针是成员函数中的第一个参数
在这里插入图片描述

  • 当类中的成员函数要操作成员变量时,当形参的名称和成员变量的名称一样的时候,我们可以用this指针来避免因为名字一样而造成的数据混乱
#include <iostream>
using namespace std;
//封装手机的类
class Phone
{
public:
	void call();
	void sendMessage();
	void playGames();
	void setPrice(int price);
private:
	string brand;
	string color;
	int price;
protected:
};
//返回值的类型 类名::成员
void Phone::call()
{
	cout << "打电话" << endl;
}
void Phone::sendMessage()
{
	cout << "发短信" << endl;
}
void Phone::playGames()//void Phone::playGames(Phone *const this)
{
	cout << "打游戏" << endl;
}
void Phone::setPrice(int price)//void Phone::setPrice(Phone * const this,int_price)
{
	this->price = price;
}
int main()
{
//实例化对象 类名 对象名;
	Phone phoneA;
	phoneA.setPrice(3999);//phoneA.setPrice(&phoneA,3999)
	Phone phoneB;
	return 0;
}

类中特殊的成员函数

构造函数

作用
在创建对象的时候,给对象分配内存空间并对成员变量进行初始化
什么时候调用
在创建对象的时候
谁调用:系统调用
如果没有自定义构造函数,系统会自动生成一个无参的构造函数
如果自定义了构造函数,调用的时候就执行的是自定义的构造函数
构造函数的格式:与类同名,没有返回值,参数不确定(构造函数是可以重载的
类名(形参列表)
{
;
}

默认构造函数

  • 无参的,自己写的,编译器自动生成
  • 有参数并且所有的参数都有默认值
  • 一个类中最多可以有多少个默认构造函数?只能有一个

自己没有写,在创建对象的时候,编译器帮我们自动生成的一个无参的构造函数;
自己写的,无参的构造函数,也是默认构造函数;编译器就不会再生成了!!!
自己写的,有参数的构造函数,并且所有参数都有默认值!!!
在这里插入图片描述

普通构造函数

相当于被重载出来

有2个或者2个以上参数的,并且不是所有参数都有默认值!
在这里插入图片描述

拷贝构造函数

什么时候调用
用一个已经存在的对象给正在创建的对象赋值的时候
谁调用:系统
如果没有自定义拷贝构造函数,系统自动生成一个浅拷贝构造函数
如果自定义了拷贝构造函数,系统执行自定义的拷贝构造函数
拷贝构造函数的格式:与类名相同,无返回值,有且仅有一个参数(类类型的应用)
类名(类名 & 引用名)
{
}

有一个参数并且这个参数是类类型的引用! 如果自己不写,编译器会自动生成一个
浅拷贝构造函数,如果要进行深拷贝,拷贝构造函数要自己写!!!!

在这里插入图片描述
在这里插入图片描述

浅拷贝

在这里插入图片描述

深拷贝

在这里插入图片描述
总结:什么时候用深拷贝什么时候用浅拷贝?编译器自动生成的是深拷贝还是浅拷贝?
就看构造函数中是否动态申请内存空间(new),如果没有就用浅拷贝,如果有就用深拷贝
编译器自动生成的也是浅拷贝

浅拷贝

#include <iostream>
using namespace std;
//封装手机的类
class Phone
{
public:
	//构造函数与类同名,无返回值,参数不确定
	//默认构造函数
	//Phone();
	Phone(string brand = "苹果", string color = "粉色", int price = 9999);
	void call();
	void sendMessage();
	void playGames();
	void setPrice(int price);
	void show();
private:
	string brand;
	string color;
	int price;
protected:
};
//Phone::Phone()
//{
// this->brand = "小米";
// this->color = "白色";
// this->price = 3999;
// cout << "Phone()" << endl;
//}
Phone::Phone(string brand, string color, int price)
{
	this->brand = brand;
	this->color = color;
	this->price = price;
	cout << "Phone(string,string,int)" << endl;
}
//返回值的类型 类名::成员
void Phone::call()
{
	cout << "打电话" << endl;
}
void Phone::sendMessage()
{
	cout << "发短信" << endl;
}
void Phone::playGames()//void Phone::playGames(Phone *const this)
{
	cout << "打游戏" << endl;
}
void Phone::setPrice(int price)//void Phone::setPrice(Phone * const this,int
_price)
{
	this->price = price;
}
void Phone::show()
{
	cout << "品牌:" << this->brand << ","
	<< "颜色:" << this->color << ","
	<< "价格:" << this->price << endl;
}
int main()
{
//实例化对象 类名 对象名;
	Phone phoneA;
	phoneA.show();
	Phone* p = new Phone("华为");
	p->show();
	Phone phoneB("oppo", "蓝色");
	phoneB.show();
	Phone phoneC("苹果", "黑色",2999);
	phoneC.show();
	delete p;
	return 0;
}

深拷贝

#include <iostream>
using namespace std;
//封装手机的类
class Phone
{
public:
	//构造函数与类同名,无返回值,参数不确定
	//默认构造函数
	Phone(string brand = "苹果", string color = "粉色", int price = 9999);
	Phone(Phone& demol);
	~Phone();
	void call();
	void sendMessage();
	void playGames();
	void setPrice(int price);
	void show();
private:
	string brand;
	string color;
	int price;
	int* p;
protected:
};
Phone::Phone(string brand, string color, int price)
{
	this->brand = brand;
	this->color = color;
	this->price = price;
	this->p = new int;
	*p = 100;
	cout << "Phone(string,string,int)" << endl;
}
Phone::Phone(Phone& demol)
{
	cout << "Phone(Phone &)" << endl;
	this->brand = demol.brand;
	this->color = demol.color;
	this->price = demol.price;
	this->p = new int;
	*(this->p) = *(demol.p);
}
Phone::~Phone()
{
	cout << "~Phone()" << endl;
	delete p;
	cout << this << endl;
}
//返回值的类型 类名::成员
void Phone::call()
{
	cout << "打电话" << endl;
}
void Phone::sendMessage()
{
	cout << "发短信" << endl;
}
void Phone::playGames()//void Phone::playGames(Phone *const this)
{
	cout << "打游戏" << endl;
}
void Phone::setPrice(int price)//void Phone::setPrice(Phone * const this,int
_price)
{
	this->price = price;
}
void Phone::show()
{
	cout << "品牌:" << this->brand << ","
	<< "颜色:" << this->color << ","
	<< "价格:" << this->price << endl;
}
int main()
{
	Phone phoneA;
	Phone phoneB = phoneA;
	return 0;
}

析构函数

作用:在对象生命周期结束的时候,回收资源
什么时候调用:对象生命周期结束的时候
谁调用:系统自动调用
如果没有自定义析构函数,系统会自动生成一个空的析构函数
如果自定义了析构函数,系统就会调用自定义的析构函数
析构函数的格式:没有返回值,函数名与类同名,在函数名前加一个~,没有参数(不能重载)
~类名()
{
;
}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

简易CAD程序:Qt多文档程序的一种实现

注&#xff1a;文中所列代码质量不高&#xff0c;但不影响演示我的思路 实现思路说明 实现DemoApplication 相当于MFC中CWinAppEx的派生类&#xff0c;暂时没加什么功能。 DemoApplication.h #pragma once#include <QtWidgets/QApplication>//相当于MFC中CWinAppEx的派生…

AI语音识别技术-ASR

一、首先什么是ASR技术&#xff1f; 语音识别技术是一种将人的语音转换为文本的技术。其目标是将人类的语音中的词汇内容转换为计算机可读的输入&#xff0c;ASR技术就是将人的语言转化为计算机能够识别的文字的过程。 二、ASR技术应用中遇到的难点 在自动语音识别应用场景中&…

快速搭建流媒体服务

1、安装流媒体服务 源码地址&#xff1a;https://gitee.com/ossrs/srs 本次采用docker安装 docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 -p 8000:8000/udp -p 10080:10080/udp registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5 查看运行效果&#xff…

2024年5月19日优雅草蜻蜓K知识付费系统旗舰版v1.0.9进度更新

v1.1.0更新 v1.1.0更新 2024年5月19日优雅草蜻蜓K知识付费系统旗舰版v1.0.9进度更新&#xff0c;首页体育栏目完善新增用户发布页面 开发进度 首页体育栏目完善 新增用户发布页面 新增用户登录完善 新增学习课程页面完善-过往课程数据完成 去掉其他三方登录&#xff0c;新增…

linux安装KubeSphere

linux安装KubeSphere 介绍 KubeSphere 是在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器平台&#xff0c;提供简单易用的操作界面以及向导式操作方式&#xff0c;在降低用户使用容器调度平台学习成本的同时&#xff0c;极大减轻开发、测试、运维的日常…

Centos7.9安装卸载Docker

文章目录 1、官网安装1.1、卸载旧版本Docker1.2、通过rpm仓库安装1.2.1、设置仓库1.2.2、安装Docker Engine1.2.3、启动Docker1.2.4、验证安装 1.3、通过rpm软件包安装1.4、通过便捷脚本安装 2、yum安装2.1、安装docker-ce以及客户端2.2、启动docker2.3、配置镜像加速 3、卸载D…

Shell编程之条件判断语句

目录 一、条件判断 1、test命令 2、文件测试 3、整数值比较 4、字符串判断 5、逻辑测试 二、if语句 1、if单分支语句 2、双分支语句 3、多分之语句 4、case 分支语句 一、条件判断 Shell环境根据命令执行后的返回状态值&#xff08;echo $?&#xff09;来判断是否执行成…

docker如何拉取nginx最新镜像并运行

要拉取Docker Hub上的最新Nginx镜像&#xff0c;您可以使用以下命令&#xff1a; docker pull nginx 这个命令会从Docker Hub下载最新版本的Nginx镜像。如果您想要拉取特定版本的Nginx镜像&#xff0c;可以指定版本号&#xff0c;例如&#xff1a; docker pull nginx:1.18.0 拉…

思科模拟器--06.单臂路由升级版--多端路由互连实验--24.5.20

实验图纸如下: 第0步: 先放置六台个人电脑,一台交换机和一台2911路由器(千兆路由器(G0开头的)) 接着,用直通线将 PC0的F0,PC1的F0分别和交换机的F0/0, F0/1连接 交换机的F0/3和路由器的G0/0连接 PC2的F0,PC3的F0分别和交换机的F0/4, F0/5连接 交换机的F0/6和路由器的G0/1…

MySQL---函数与约束

目录 一、函数 1. 字符串函数 2. 数值函数 3. 日期函数 4. 流程函数 5. 总结 二、约束 1. 概述 2. 约束演示 3. 外键约束 3.1 添加外键 3.2 删除外键 3.3 外键删除更新行为 4. 总结 一、函数 1. 字符串函数 命令如下所示&#xff1a; -- concat select concat("Hel…

Qt | QGridLayout 类(网格布局)

01、上节回顾 Qt | QBoxLayout 及其子类(盒式布局)02、QGridLayout 简介 1、网格布局原理(见下图): 基本原理是把窗口划分为若干个单元格,每个子部件被放置于一个或多个单元格之中,各 单元格的大小可由拉伸因子和一行或列中单元格的数量来确定,若子部件的大小(由 sizeH…

园区网的基本了解

园区网使用的典型技术---IEEE802.3标准/IEEE802.11标准 封闭式园区网络 ---由内部人员使用&#xff0c;不能访问互联网。 ---制订各式各样的规章制度 ---NAC&#xff0c;网络接入控制 开放式园区网络 ---服务于公众的&#xff0c;认证 园区网的发展 第一代&#xff1a;…

开关电源重点可靠性测试项目与测试方法

为确保开关电源在复杂工作环境下的安全性与稳定性&#xff0c;各种安全性测试成为不可或缺的环节。本文将深入探讨几项关键的安全性测试项目&#xff0c;帮助用户全面了解如何评估开关电源的可靠性和安全性。 一、过压保护测试方法 目的是为了检测当输出电压过高时&#xff0c;…

express.js--token中间件验证及token解析(三)

主要作用 访问路由接口时&#xff0c;哪些需要校验token 通过token解析身份信息&#xff0c;就可以知道是哪个人 框架基本搭建express.js--基本用法及路由模块化(一)-CSDN博客 如何生成tokenexpress.js--生成token(二)-CSDN博客 middleware/index.js const jwt require(…

【linux】yumvim工具理解使用

目录 Linux 软件包管理器 yum 关于 rzsz 注意事项 查看软件包 Linux开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 vim末行模式命令集 简单vim配置 配置文件的位置 sudo提权 Linux 软件包管理器 yum 1.yum是什么&#xff1…

Java基础22(JSON解析 注解)

目录 一、JSON解析 1. JSON语法 2. JSON的用途 3. Java解析JSON 4. 使用Fastjson 4.1 Fastjson 的优点 4.2 Fastjson 导包 4.3 Fastjson的主要对象 4.4 常用方法 将Java对象 "序列化"&#xff08;转换&#xff09; 为JSON字符串&#xff1a; 将JSON字符串…

薪资不公、晋升无望?动笔写一份申诉材料吧!

薪资不公、晋升无望&#xff1f;动笔写一份申诉材料吧&#xff01; 引言&#xff1a;每个努力工作的人都值得公平对待 在职场上&#xff0c;我们付出了汗水和智慧&#xff0c;期待着相应的回报——合理的工资和公正的晋升机会。然而&#xff0c;现实并不总是如此美好。当你感觉…

康谋分享 | aiSim5基于生成式AI扩大仿真测试范围(终)

在前面的几章节中探讨了aiSim仿真合成数据的置信度&#xff0c;此外在场景重建和测试流程闭环的过程中&#xff0c;难免会面临3D场景制作重建耗时长、成本高、扩展性低以及交通状况复杂程度难以满意等问题&#xff0c;当前的主要挑战在于如何自动化生成3D静态场景并添加动态实例…

深入理解C#中的IO操作 - FileStream流详解与示例

文章目录 一、FileStream类的介绍二、文件读取和写入2.1 文件读取&#xff08;FileStream.Read&#xff09;2.2 文件写入&#xff08;FileStream.Write&#xff09; 三、文件复制、移动和目录操作3.1 文件复制&#xff08;FileStream.Copy&#xff09;3.2 文件移动&#xff08;…

VMware ESXI 7.0安装部署

1、为什么要虚拟化&#xff1f; 目前&#xff0c;物理服务器存在以下几个问题&#xff1a; 1&#xff09;硬件资源利用率低&#xff1b; 2&#xff09;可靠性不足&#xff0c;物理服务器宕机即可造成整体业务停摆&#xff1b; 3&#xff09;维护量大&#xff0c;无法实现统…