C++_基本语法笔记_类和对象

news2024/9/21 23:53:17
  • 对于有Java基础的思想不过多记录,仅看语法

创建和封装对象

  • 类似Java中的set操作,可以写一个赋值操作用于给实例化对象赋属性值
    在这里插入图片描述

  • 三种权限:public , protect ,private

在这里插入图片描述

Class和Struct区别

  • Struct默认为public权限
  • class默认为private权限,除非public:成员

私有成员属性

  • 可以自己控制读写权限
  1. 先给每个属性加上private

在这里插入图片描述
3. 对每个属性进行set和get方法,办法:给不期望被写的属性值,不写set方法即可
4.
在这里插入图片描述

  • 对于写权限,可以检测数据有效性

在这里插入图片描述

分开放置类的声明和方法

以计算

该类的.h文件

  • 写在头文件位置,命名:point.h
  • 仅需要写出属性和函数声明
#pragma once		//确保同一个头文件在同一个编译单元中只被包含一次
#include<iostream>
using namespace std;

class point {
	//只保留函数和成员变量的声明
public:
	void setx(int x);

	int getx();
	
	void sety(int y);
	
	int gety();

private:
	int m_x = 10;
	int m_y = 20;

};

设计该类的方法

  • 专门用一个文件,放置类的方法:point.cpp
  • 每个方法都声明是在point的作用域下
#include "point.h"		//自定义的头文件,使用" "而不是< >

//方法实现部分,用point::说明,在point作用域
//才能对point的属性值m_x和m_y进行赋值

void point::setx(int x) {
	m_x = x;
}

int point::getx() {
	return m_x;
}

void point::sety(int y) {
	m_y = y;
}

int point::gety() {
	return m_y;
}

用一个主函数调用该类

  • 在circle类:仅写了个方法,其中调用point的类及其方法。
  • 在main类中,也可以用到point类及其方法
#include<iostream>
using namespace std;
#include "point.h"		//引入自定义头文件


class circle {

public:
	void showcenter(point p) {
		cout << p.getx() << "---" << p.gety() << endl;		//虽然
		
	}

};

int main() {
	circle c1;
	point p1;
	p1.setx(10);
	p1.sety(10);

	c1.showcenter(p1);
	system("pause");
}

拷贝构造函数

声明和使用

通过构造函数,将某个对象的属性完全拷贝到一个新对象。

#include<iostream>
using namespace std;

class person
{
public:
	person() {
		cout << "无参构造" << endl;
	}

	//拷贝构造函数
	//参数:引用&获取拷贝的对象。用const,保证不改变原对象
	//使用时传入一个person类即可,将参数位置的对象属性,拷贝到调用该方法的对象中
	person(const person &p) {
		age = p.age;
		cout << "拷贝构造,年龄:"<<age << endl;
	}

	void setage(int age) {
		this->age = age;
	}
	~person() {};

private:
	int age;

};


int main() 
{
	person p1;		//默认构造函数不加(),如果有括号,会认为是函数声明
	p1.setage(20);
	
	//拷贝构造函数
	//person p2(p1);		//拷贝构造,年龄:20
	person p2 = person (p1);	//这个也能实现拷贝构造	(括号里是被拷贝的对象)
	// person p2 = p1;					//也是一种拷贝构造写法
	system("pause");
}
  • 参数:引用&获取拷贝的对象。 用const为了保证不改变原对象
  • 使用时传入一个person类即可,将参数位置的对象属性,拷贝到调用该方法的对象中(括号里是被拷贝的对象,返回值是拷贝得到的对象

使用场景

  • 克隆一个已有的对象:
    在这里插入图片描述
  • 值传递的形式,给函数传参
    在这里插入图片描述

返回一个局部对象时

默认规则

在这里插入图片描述

  • 即使不写拷贝函数,默认也会有一个拷贝函数,进行值拷贝
  • 如果自己写了有参构造,并且没写无参构造,无参实例化一个变量,编译器会报错:没有构造函数。因为当你写了有参构造,编译器不再提供无参,加上你没写无参,那就是没有构造参数。

深浅拷贝

https://www.bilibili.com/video/BV1et411b73Z/?p=110

  • 浅拷贝:简单赋值

  • 深拷贝:堆中重新申请空间进行拷贝

  • 浅拷贝:

在这里插入图片描述
进行如下:将p1拷贝至p2。会报错

在这里插入图片描述

因为:二者通过指针,同时使用堆区的内存。但是上面两行代码运行结束时。p2的析构函数先释放了堆区,等到p1想释放的时候,已经没有可以释放的,重复释放会出问题。

在这里插入图片描述解决:编译器自带的拷贝是浅拷贝,不好用。自己写一个深拷贝
在这里插入图片描述

初始化列表

构造函数():属性1(值1),属性2(值2),属性3(值3) ... {}
或者写成
构造函数(int a,int b,int c):属性1(a),属性2(b),属性3(c)...{}

成员类和自己哪个先构造

在这里插入图片描述

  • 先构造内部成员类对象,再构造外层对象。(先有胳膊腿,再有自身)
  • 先析构外层对象,再析构内部成员对象。

静态变量

成员变量

  • 可以视为:专属这个类的全局变量(静态变量也有private权限)
    在这里插入图片描述在这里插入图片描述
  • 注意声明时候,不带static,并且Person作用域形式

p2对这个值进行修改,输出m_A确实变了

在这里插入图片描述
访问方式:
在这里插入图片描述

成员函数

在这里插入图片描述

在这里插入图片描述

  • 因为无法确定调用静态函数func时候,所用的m_B是哪个对象的属性,所以静态(公用)函数只能处理静态(公用)变量

  • 同时,静态成员函数也有权限,例如:private权限就不能被类外调用

调用方式:
成员.func()或者类名::func()

在这里插入图片描述

成员变量和成员函数分开存储

  • 一般把成员变量和成员函数分开存储
  • 静态的变量/函数,都不属于类的对象上
    在这里插入图片描述

this指针

  • 指向被调用的成员函数所属的对象(是固定,不可修改的)

  • 隐含在每个非静态成员函数内

  • 用途1:形参和成员变量重名时,this所指是成员变量
    在这里插入图片描述

  • 用途2:希望某个函数的返回值,是对象本身,就return *this
    在这里插入图片描述
    在这里插入图片描述
    注意:引用是地址传递。指针返回的地址通过引用地址传给自己,如果不用引用是传给克隆出来的对象,对象自己就不能链式递增了,而是不停的克隆本体,如下图所示:
    在这里插入图片描述

  • 返回值如果不加引用,会返回一个新的对象

  • 加上引用,就是对当前对象进行类似覆盖的拷贝,可以继续使用原对象

空指针访问成员

在这里插入图片描述

在这里插入图片描述通常增加一个判断增强鲁棒性:
在这里插入图片描述

const修饰

常函数

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

常对象

属性值不能改
在这里插入图片描述

友元

让其他特殊函数/类,访问本类的private权限内容,关键字是friend

全局函数友元

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

类友元

在这里插入图片描述
这样,GoodGay就可以防伪Building中的私有成员:BedRoom

成员函数做友元

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

运算符重载

对已有运算符进行重新定义,例如把两个自定义类型相加。

  • 可以通过成员函数重载
  • 也可以通过全局函数重载

在这里插入图片描述

  • 因为函数可以重载,所以也可以写operator(Person &p1 , int num){…},实现给自定义对象内部增加num数字
  • 不要滥用(防御性代码)

左移运算符重载(cout << )

希望能输出p内部的属性值,类似Java的show

  • 通常使用全局函数重载
  • 蓝色确保<<左边是cout,右边是Person类型
    在这里插入图片描述
  • 因为我们一般让类内属性值为private,所以需要把左移运算符变成友元
    在这里插入图片描述

递增运算符重载

对自定义类型内部的数据进行递增

  • 分为 前置 和 后置
  • 前置递增写法
    在这里插入图片描述
  • 后置递增写法(官方设定用 int 区分)
    在这里插入图片描述
  • 用下面代码,检查两 种递增
    在这里插入图片描述

赋值 运算符重载

类似于拷贝一个对象,但是现在是将一个对象的值覆盖。

  • 直接赋值是使用浅拷贝,会出现重复释放的问题,所以要申请新空间进行深拷贝

在这里插入图片描述

  • 所以需要修改为Person &类型
    在这里插入图片描述

  • 使用方法:
    在这里插入图片描述

关系运算符重载

在这里插入图片描述

函数调用运算符重载( 括号() )

  • 重载之后的方式非常像函数调用,因此称为仿函数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

小知识点

  • 空对象也占1字节内存,目的是为了区分空对象占内存的位置

  • 箭头运算符(->)用于结构体/类指针变量访问成员。A->B则A为指针,->是成员提取,A->B是提取A中的成员B,A只能是指向类、结构、联合的指针

  • cout是输出流ostream的对象

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

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

相关文章

SpringBoot统一功能处理——拦截器

目录 一、什么是拦截器&#xff1f; 二、拦截器使用 2.1 定义拦截器 2.2 注册配置拦截器 三、拦截器详解 3.1 拦截器的拦截路径配置 3.2 拦截器执行流程 一、什么是拦截器&#xff1f; 拦截器是Spring框架提供的核心功能之一, 主要用来拦截用户的请求, 在指定方法前后,…

C语言 | Leetcode C语言题解之第332题重新安排行程

题目&#xff1a; 题解&#xff1a; char* id2str[26 * 26 * 26];int str2id(char* a) {int ret 0;for (int i 0; i < 3; i) {ret ret * 26 a[i] - A;}return ret; }int cmp(const void* _a, const void* _b) {int **a (int**)_a, **b (int**)_b;return (*b)[0] - (*…

python网络爬虫使用代理

Python网络爬虫使用代理的实用指南 在网络爬虫的开发过程中&#xff0c;使用代理是一个非常重要的环节。代理不仅可以帮助爬虫绕过反爬虫机制&#xff0c;还能保护开发者的隐私。本文将介绍如何在Python中使用代理进行网络爬虫&#xff0c;包括基本的设置和示例代码。 1. 代理…

手机短视频素材网站有哪些啊?手机视频素材库网站分享

在当今的数字时代&#xff0c;智能手机与社交媒体平台的融合推动了手机短视频的兴起。这种形式的媒体已经渗透到我们的日常生活中&#xff0c;无论是作为娱乐手段、教育工具还是商业推广手段&#xff0c;优质的短视频都具有极高的吸引力和广泛的应用价值。因此&#xff0c;选择…

『 C++ 』智能指针 ( 万字梳理 )

文章目录 智能指针概念内存泄漏的危害RAII与智能指针智能指针的赋值auto_ptr 管理权转移auto_ptr 的对象悬空问题 unique_ptr 防拷贝unique_ptr 简单实现 shared_ptr 引用计数shared_ptr 简单实现shared_ptr 的循环引用问题与 weak_ptr 智能指针的自定义删除器 智能指针概念 智…

【独家原创】基于NRBO-Transformer多特征分类预测【24年新算法】 (多输入单输出)Matlab代码

【独家原创】NRBO-Transformer分类 Matlab代码 基于牛顿拉夫逊优化算法优化Transformer的数据分类预测&#xff0c;Matlab代码&#xff0c;可直接运行&#xff0c;适合小白新手 NRBO优化的超参数为&#xff1a;自注意力机制中的头数、正则化系数、初始化学习率 1.程序已经调试…

《知识点扫盲 · Redis 分布式锁》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

数据库索引设计原则

1. 概述 索引是优化数据库性能最重要的工具之一。但是&#xff0c;创建过多的索引或索引错误的列也会对性能产生负面影响。因此&#xff0c;在设计索引时遵循一定的原则很重要。 2. 原则A - 根据工作负载创建索引 创建高效索引最重要的原则是根据您的工作负载而不是表结构创…

数据库连接池的深入学习

为什么需要数据库连接池&#xff1f; 正常操作数据库需要对其进行连接&#xff0c;访问数据库&#xff0c;执行sql语句&#xff0c;断开连接。 创建数据库连接是一个昂贵的过程&#xff0c;在高并发的情况下&#xff0c;频繁的创建数据库的连接可能会导致数据库宕机。 有了连…

Leetcode JAVA刷刷站(8)字符串转换整数

一、题目概述 二、思路方向 要实现这个功能&#xff0c;我们可以遵循以下步骤来编写 myAtoi 函数&#xff1a; 去除前导空格&#xff1a;使用循环或字符串的 trim() 方法&#xff08;虽然直接操作字符串更高效的方式是使用循环&#xff09;。检查符号&#xff1a;记录第一个非…

TGANet部分复现

Kvasir-SEG复现结果 M e t h o d m I o U m D S C R e c a l l P r e c i s i o n F 2 P r a N e t − − − − − − 0.9663704860609511 − − T G A N e t 0.8331 0.8982 0.9132 − − 0.9029 \begin{array}{lccccr} Method&mIoU&mDSC&Recall&Precision&a…

5、Linux : 网络相关

OSI七层网络模型 TCP/IP四层 概念模型 对应网络协议 应用层&#xff08;Application&#xff09; HTTP、TFTP, FTP, NFS, WAIS、 表示层&#xff08;Presentation&#xff09; 应用层 Telnet, Rlogin, SNMP, Gopher 会话层&#xff08;Session&#xff09; SMTP…

ICETEK-DM6437-AICOM——CPU定时器及直流电机控制中断控制

一、设计目的&#xff1a; 1.1 CPU定时器程序设计&#xff1b; 1.2 2直流电机程序设计&#xff1b; 1.3 外中断。 二、设计原理&#xff1a; 2.1 定时器的控制&#xff1a; 在DM6437&#xff08;是一种数字信号处理器&#xff0c;DSP&#xff09;上使用其内部定时器和中断来…

设计模式-动态代理模式

目录 什么是代理模式&#xff1f; 为什么要用代理模式&#xff1f; 有哪几种代理模式&#xff1f; 动态代理&#xff08;jdk自带&#xff09;&#xff1a; 动态代理&#xff08;第三方库-cglib&#xff09;&#xff1a; 什么是代理模式&#xff1f; 代理模式给某一个对象提供…

Windows10不能直接拖拽文件到微信或者钉钉的解决办法【玖毅网】

不知道从何时起,微信、QQ和钉钉等相关软件,无法拖拽文件到对话窗口,拖拽的时候显示一个红色图标,可能是上次更新win之后导致的,所以嘛,系统真的不能设置自动更新,说不准哪些更新就把原设置覆盖或者关闭了,哎,吃一堑长一智吧,赶紧关闭自动更新,emmmm我在说我自己啊。…

日撸Java三百行(day17:链队列)

目录 一、队列基础知识 1.队列的概念 2.队列的实现 二、代码实现 1.链队列创建 2.链队列遍历 3.入队 4.出队 5.数据测试 6.完整的程序代码 总结 一、队列基础知识 1.队列的概念 今天我们继续学习另一个常见的数据结构——队列。和栈一样&#xff0c;队列也是一种操…

零基础5分钟上手谷歌云GCP核心云开发技能 - 利用语音AI服务搭建应用

简介&#xff1a; 欢迎来到小李哥全新谷歌云GCP云计算知识学习系列&#xff0c;适用于任何无云计算或者谷歌云技术背景的开发者&#xff0c;让大家零基础5分钟通过这篇文章就能完全学会谷歌云一个经典的服务开发架构方案。 我将每天介绍一个基于全球三大云计算平台&#xff0…

arcgis(shp)注记转CAD(dwg)文字

arcgis&#xff08;shp&#xff09;注记转CAD&#xff08;dwg&#xff09;文字方法如下&#xff1a; 1、添加shp文件&#xff0c;标注要素&#xff0c;然后选标注转注记 2、 点击文件夹图标打开文件夹&#xff0c;选择保存路径。&#xff08;提前需新建好文件地理数据库、数据…

Arm Linux 设置系统日期时间的方法

一、设置系统日期时间的方法 1.命令行工具 date 命令&#xff1a;是Linux系统中用于查看和设置系统时间的常用命令行工具。通过date -s选项&#xff0c;可以手动设置系统时间。 sudo date -s "YYYY-MM-DD HH:MM:SS"hwclock 命令&#xff1a;用于查询和设置硬件时钟…

8月8日复习内容(基础的文件IO操作)

man手册 主要分为以下几个章节&#xff1a; User Commands&#xff08;用户命令&#xff09;&#xff1a;这一章节包含了普通用户&#xff08;非root用户&#xff09;可以执行的命令。这些命令通常用于日常的文件管理、文本编辑、程序执行等任务。 System Calls&#xff08;系…