C++课程笔记 类和对象
类概念
结构体:只要属性
类:有属性也有方法
c++可以省略struct c不行
#include<iostream>
using namespace std;typedef struct queue1
{int a;queue1 q() {queue1 q(2);return q;};queue1(){}queue1(int qa){a = qa;}
}q1;
int main()
{queue1 Q1;queue1 Qt=Q1.q();cout << Qt.q().a<<endl;q1 Q2(2);cout << Q1.a<<endl;cout << Q2.a;
}
struct内部成员默认公有,class默认私有。
public private不分上下
声明定义分离原因:
方便代码阅读
Q1.h:
#include<iostream>
#include<stdbool.h>
using namespace std;
class Cycle
{
public :void Init(int n = 4);int getr();
private:int r;
};class Point
{
public:void Init(int a = 4,int b=4);int geta();int getb();
private:int a;int b;
};
void ifin(Cycle& c, Point& p);
源.cpp:
#define _CRT_SECURE_NO_WARNINGS 1
#include"Q1.h"
void Cycle::Init(int n) {r = n;
}
int Cycle::getr() {return r;
}
void Point::Init(int m, int n)
{a = m;b = n;
}
int Point::geta() {return a;
}
int Point::getb() {return b;
}
void ifin(Cycle& c,Point& p)
{int d1 = p.geta() * p.geta() + p.getb() * p.getb();int d2 = c.getr() * c.getr();if (d1 > d2){cout << "不在" << endl;}if (d1 <= d2){cout << "在" << endl;}return;
}
test.cpp
#include"Q1.h"int main()
{Cycle c1;Point p1;ifin(c1, p1);
}
类和对象存储:
成员方法存储在公共区方法
成员变量按结构体空间计算
只有成员函数的类大小都是1
构造函数
构造函数完成初始化
class Date {
public:Date(int year, int month){_year = year;_month = month;}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{/Date d1(2019, 4);d1.print();
}
class Date {
public:Date(int year=2020, int month=2,int day=1){_year = year;_month = month;_day = day;}Date(){_year = 2019;_month = 2;_day = 1;}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2021);d1.print();
}
class Date {
public:Date(int year=2020, int month=2,int day=1){_year = year;_month = month;_day = day;}Date(){/* _year = 2019;_month = 2;_day = 1;*/}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.print();
}
全缺省构造可代替无参构造
class Stack
{
public:Stack(int capacity = 4){_a = (int*)malloc(sizeof(int) * capacity);if (_a == nullptr){perror("malloc fail");exit(-1);}_top = 0;_capacity = 4;}void Push(int t){_a[_top++] = t;}void Print(){for (int i=0;i<_top;i++){cout << _a[i] << endl;}}
private:int* _a;int _top;int _capacity;
};
int main()
{Stack s;s.Push(1);s.Push(2);s.Print();
}
class A {
public:A(){_a = 1;cout << "A()构造函数" << endl;}
private:int _a;
};
class Date {
public:/*Date(int year=2020, int month=2,int day=3){_year = year;_month = month;_day = day;}*///Date()//{///* _year = 2019;// _month = 2;// _day = 1;*///}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;A _A;
};
int main()
{Date d1;return 0;
}
默认构造函数内置类型不处理,自定义类型使用自定义类型默认构造函数。
用栈实现队列中,此类就不用写MyQueue构造函数,可以用MyQueue默认生成的,调用Stack默认构造函数。
释放时也会调用Stack默认析构函数,内置类型同样不会处理,自定义类型调用默认析构函数。
class Stack
{
public:Stack(int capacity = 4){_a = (int*)malloc(sizeof(int) * capacity);cout << "Stack 构造" << endl;if (_a == nullptr){perror("malloc fail");exit(-1);}_top = 0;_capacity = 4;}~Stack(){cout << "Stack 析构" << endl;free(_a);_a = nullptr;_top = 0;_capacity = 0;}void Push(int t){_a[_top++] = t;}void Print(){for (int i=0;i<_top;i++){cout << _a[i] << endl;}}
private:int* _a;int _top;int _capacity;A _A;
};
class MyQueue {private:Stack s1;
};
int main()
{MyQueue m1;return 0;
}
自定义类型构造被内置类型扰乱了
可以用一下c++11特性解决
class Date {
public:/*Date(int year=2020, int month=2,int day=3){_year = year;_month = month;_day = day;}*///Date()//{///* _year = 2019;// _month = 2;// _day = 1;*///}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year=2019;int _month=3;int _day=3;A _A;
};
不传参数就能调用的构造函数是默认构造
析构函数
malloc手动free后销毁
~Stack(){free(_a);_a = nullptr;_top = 0;_capacity = 0;}
return时调用析构函数
拷贝构造
class Date {
public:Date(int year=2019, int month=2,int day=3){_year = year;_month = month;_day = day;}Date(Date& d){cout << "拷贝构造" << endl;_year = d._year;_month = d._month;_day = d._day;}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year=2019;int _month=3;int _day=3;A _A;
};
void Func1(Date d)
{cout << "Func1" << endl;
}
void Func2(Date& d) {cout << "Func2" << endl;}
int main()
{Date d1;Func1(d1);Func2(d1);return 0;
}
只要Func1调用了拷贝构造
拷贝构造前加const 为了避免错误更改原先对象
class Stack
{
public:Stack(int top,int capacity = 4){_a = (int*)malloc(sizeof(int) * capacity);cout << "Stack 构造" << endl;if (_a == nullptr){perror("malloc fail");exit(-1);}_top = 0;_capacity = capacity;}~Stack(){cout << "Stack 析构" << endl;free(_a);_a = nullptr;_top = 0;_capacity = 0;}void Push(int t){_a[_top++] = t;}void Print(){for (int i=0;i<_top;i++){cout << _a[i] << endl;}}
private:int* _a;int _top;int _capacity;A _A;
};
int main()
{Stack s(4,4);Stack s2(s);return 0;
}
默认拷贝构造是浅拷贝,函数释放后会free两次,会报错
自定义深拷贝:
class Stack
{
public:Stack(int top,int capacity = 4){_a = (int*)malloc(sizeof(int) * capacity);cout << "Stack 构造" << endl;if (_a == nullptr){perror("malloc fail");exit(-1);}_top = 0;_capacity = capacity;}Stack(const Stack& s){_a = (int*)malloc(sizeof(int) * s._capacity);{if (_a == nullptr){perror("malloc fail");exit(-1);}}memcpy(_a, s._a, sizeof(int) * s._top);_top = s._top;_capacity = s._capacity;}~Stack(){cout << "Stack 析构" << endl;free(_a);_a = nullptr;_top = 0;_capacity = 0;}void Push(int t){_a[_top++] = t;}void Print(){for (int i=0;i<_top;i++){cout << _a[i] << endl;}}
private:int* _a;int _top;int _capacity;//A _A;
};
int main()
{Stack s(0,4);s.Push(1);s.Push(2);s.Print();Stack s2(s);return 0;
}
不用写拷贝构造:
运算符重载
class Date {
public:Date(int year=2019, int month=2,int day=3){_year = year;_month = month;_day = day;}Date(Date& d){cout << "拷贝构造" << endl;_year = d._year;_month = d._month;_day = d._day;}void print(){cout << _year << " " << _month << " " << _day << endl;}bool operator ==(const Date& d){return _year == d._year && _month == d._month && _day == d._day;}
private:int _year=2019;int _month=3;int _day=3;A _A;
};
int main()
{Date d1(2019,3,2);Date d2(2020, 4, 3);cout << (d1 == d2) << endl;//加括号避免运算符优先级问题return 0;
}
在 C++ 中,运算符重载函数
bool operator==(const Date& d)
只需要一个参数的原因是,它实际上是在定义一个成员函数。成员函数隐含地有一个指向当前对象(即this
指针)的参数,因此只需要提供与当前对象进行比较的另一个Date
对象作为参数。具体解释:
隐含的
this
指针: 当你在类内部定义一个成员函数时,这个函数可以访问类的成员变量和成员函数。每个成员函数都有一个隐含的this
指针,它指向调用该函数的对象。operator==
作为成员函数时,隐含的this
指针会指向调用==
运算符的那个对象。例如,假设有两个
Date
对象d1
和d2
,当你写d1 == d2
时,编译器实际上会将其转换为d1.operator==(d2)
。此时,this
指针指向d1
,而d2
作为参数传递给operator==
函数。参数个数:
成员函数重载: 对于成员函数形式的运算符重载,
==
只需要一个参数,因为this
指针隐式地传递了调用该运算符的对象。
bool operator ==(const Date& d){return _year == d._year && _month == d._month && _day == d._day;}bool operator>(const Date& d){if (_year > d._year){return true;}else if (_year == d._year && _month > d._month){return true;}else if (_year == d._year && _month == d._month && _day > d._day){return true;}return false;}bool operator >=(const Date& d){
计算日期程序:
class Date {
public:Date(int year=2019, int month=2,int day=3){_year = year;_month = month;_day = day;}Date(const Date& d){cout << "拷贝构造" << endl;_year = d._year;_month = d._month;_day = d._day;}//Date()//{///* _year = 2019;// _month = 2;// _day = 1;*///}int GetMonthDay(int year, int month){static int monthday[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };if (month == 2 && (year % 4 == 0 && year % 100 != 0 )|| year % 400 == 0){return 29;}return monthday[month];}Date operator+=(int day){_day = day + _day;int monthday = GetMonthDay(_year, _month);while (_day > monthday){++_month;if (_month == 13){_year++;_month = 1;}_day = _day - monthday;monthday = GetMonthDay(_year, _month);}return *this;}Date& operator+(int day){Date ret(*this);ret += (day);return ret;}void print(){cout << _year << " " << _month << " " << _day << endl;}bool operator ==(const Date& d){return _year == d._year && _month == d._month && _day == d._day;}bool operator>(const Date& d){if (_year > d._year){return true;}else if (_year == d._year && _month > d._month){return true;}else if (_year == d._year && _month == d._month && _day > d._day){return true;}return false;}bool operator >=(const Date& d){return *this == d || *this > d;}
private:int _year=2019;int _month=3;int _day=3;A _A;
};
int main()
{Date d1(2024,9,10);Date d2(2019, 3, 2);cout << (d1 == d2) << endl;cout << (d1 > d2) << endl;cout << (d1 >= d2) << endl;d1 += 100000;Date d3(d1+10);return 0;
}
Date& operator=(const Date& d){_year = d._year;_month = d._month;_day = d._day;return *this;
//return d会出现权限放大}
int main()
{Date d1(2024,9,10);Date d2(2019, 3, 2);d1 = d2;return 0;
}
不显示写赋值重载,默认生成的,对自定义类型会浅拷贝
显示写重载,先释放,再开辟空间。
Stack& operator=(const Stack& s){if(this!=&s)
{free(_a);_a = (int*)malloc(sizeof(int) * s._capacity);if (_a == nullptr){perror("malloc fail");exit(-1);}memcpy(_a, s._a, sizeof(int)*s._top);_top = s._top;_capacity = s._capacity;return *this;
}}
运算符重载目的是让自定义类型对象可以用运算符。
this指针默认抢了第一个位置
在.h中定义的Print在两个cpp文件都有定义,链接符号表时出现问题
改成静态可以解决问题 不进符号表
声明定义分离也可以解决问题
.h没有定义,不会进符合表
内敛函数在调用的地方直接展开,也可以解决问题。
友元函数:
友元函数没有this指针。 在类中任意位置可以进行友元声明
可以不用去掉private
权限放大只出现在指针和引用上。
this指针默认是不能修改的。
初始化列表
_m不显示写构造,会调用默认构造
类C没有默认构造:
类C有默认构造:
i给rd引用 i给rd的是临时变量,临时变量具有常性。
加入explicit就不允许隐式类型转换发生了。
int N = 0;
class A {
public:A(int a):_a(a){N++;cout << "A()构造函数" << endl;}A(const A& a):_a(a._a){N++;cout << "A()拷贝构造函数" << endl;}
private:int _a;
};
void Func(A a)
{}
int main()
{A a1(1);A a2 = 2;A a3 = a1;Func(a3);cout << N<<endl;
}
A a3=a1 构造+拷贝构造被优化成了拷贝构造
A::N,指定类域会到命名空间中找, 不指定会先到局部再到全局中找,找不到会报错。
class A {
public:A(int a=1):_a(a){N++;cout << "A()构造函数" << endl;}A(const A& a):_a(a._a){N++;cout << "A()拷贝构造函数" << endl;}int GetN(){return N;}
private:int _a=1;static int N ;
};
int A::N = 0;
int main()
{A a1;A a2 = 2;A a3 = a1;//Func(a3);cout <<a3.GetN()<<endl;cout << a2.GetN() << endl;
}
应该n数组构造n个对象
友元类:
class Time {friend class Date;
public:Time(int hour=1, int minute=1, int second=1):_hour(hour), _minute(minute), _second(second){}
private:int _hour;int _minute;int _second;
};
class Date {
public:friend ostream& operator<<(ostream& out, const Date& d);friend istream& operator>>(istream& in, Date& d);Date(int year=2019, int month=1,int day=3){_year = year;_month = month;_day = day;}Date(const Date& d){cout << "拷贝构造" << endl;_year = d._year;_month = d._month;_day = d._day;}void SetTime(int hour, int minute, int second){_t._hour = hour;_t._minute = minute;_t._second = second;}private:int _year=2019;int _month=3;int _day=3;//A _A;Time _t;
};
内部类:
class A {
public:A(int a=1):_a(a){N++;cout << "A()构造函数" << endl;}A(const A& a):_a(a._a){N++;cout << "A()拷贝构造函数" << endl;}class B {public:void foo(){}};static int GetN(){return N;}
private:int _a=1;static int N ;
};
int main(){
A::B ab1;ab1.foo();
}
匿名对象:
创建完直接销毁
引用的话需要加const 因为传的是临时变量 具有常性
相关文章:

C++课程笔记 类和对象
类概念 结构体:只要属性 类:有属性也有方法 c可以省略struct c不行 #include<iostream> using namespace std;typedef struct queue1 {int a;queue1 q() {queue1 q(2);return q;};queue1(){}queue1(int qa){a qa;} }q1; int main() {queue1 Q1;…...
提问即创作:用Prompt提示词引领AI灵感爆发
文章目录 🍊AI内容创作的精髓:提示词Prompt1 什么是提示词工程?1.1 提示词是如何影响AI的输出结果?1.2 提示词的原理是什么1.3 提示词工程师的前景1.4 谁能成为提示词工程师?1.5 提示词的未来前景 2 提示词的基本书写技巧3 常见的提示词框架…...

一码空传临时网盘PHP源码,支持提取码功能
源码介绍 一码空传临时网盘源码V2.0免费授权,该源码提供了一个简单易用的无数据库版临时网盘解决方案。前端采用了layui开发框架,后端使用原生PHP编写,没有引入任何开发框架,保持了代码的简洁和高效。 这个程序使用了一个无数据…...
自然语言处理实战项目
自然语言处理实战项目 自然语言处理(NLP, Natural Language Processing)是人工智能的重要分支之一,致力于让计算机理解、生成并与人类进行语言交互。随着深度学习、神经网络和大数据的发展,NLP技术在近年来取得了飞跃性的进展&am…...

人工智能物联网的去中心化和分布式学习:全面综述、新兴挑战和机遇
这篇论文的标题是《Decentralized and Distributed Learning for AIoT: A Comprehensive Review, Emerging Challenges, and Opportunities》,作者是Hanyue Xu, Kah Phooi Seng, Li Minn Ang, 和 Jeremy Smith。论文发表在IEEE Access期刊上,接收日期为2…...

滑动窗口算法—最小覆盖子串
题目 ”最小覆盖子串“问题,难度为Hard,题目如下: 给你两个字符串 S 和 T,请你在 S 中找到包含 T 中全部字母的最短子串。如果 S 中没有这样一个子串,则算法返回空串,如果存在这样一个子串,则可…...

应用案例|开源 PolarDB-X 在互联网安全场景的应用实践
背景介绍 中盾数科集团始创于2012年,是由网络安全服务而发展起来的科技型、多元化的企业集团。旗下包括网络安全服务、信创一体化服务、箱式液冷、区块链、位置服务、视觉服务等六大板块,业务覆盖湖南、甘肃、贵州等多个省份。 业务挑战 中盾集团基于A…...

【大数据】MapReduce的“内存增强版”——Spark
【大数据】MapReduce的“内存增强版”——Spark 文章脉络 Spark架构 Spark-core SparkConf 和 SparkContext RDD Spark集群 Spark-sql 在大数据时代,数据处理和分析成为企业竞争的重要手段。Hadoop作为大数据处理的基石,其核心组件MapReduce在众多…...

o1模型:引领AI技术在STEM领域的突破与应用
o1模型是OpenAI最新推出的大型语言模型,它在多个领域展现出了卓越的能力,被认为是AI技术发展的一个重要里程碑。以下是对o1模型的详细介绍和分析: o1模型的简介和性能评估 o1模型在物理、化学、生物学等领域的基准任务上达到了博士生水平&…...
数据库系统 第57节 数据库迁移
数据库迁移是一个复杂的过程,涉及到将数据从一个数据库系统转移到另一个数据库系统。这个过程通常需要仔细规划和执行,以确保数据的完整性和可用性。以下是数据库迁移的一些关键方面: 数据迁移工具: 这些工具可以帮助自动化迁移过…...

【主机入侵检测】Wazuh规则详解
前言 Wazuh 规则是一组用XML格式编写的条件,它们定义了应该如何解释日志数据。这些规则由Wazuh Manager使用,用于在日志消息中检测特定的模式或行为,并相应地生成警报或响应。它们在威胁检测中扮演着至关重要的角色,因为它们允许系…...

redis有序集合写入和求交集的速度
背景 团队小伙伴做了一个需求。大概的需求是有很多的图片作品,图片作品有一些类别,每个人进入到每个类别的作品业,根据权重优先查看权重最高的的作品,权重大概是基于每个人对该作品的浏览计算,浏览过的作品放在最后展…...
微服务之服务注册与发现:Etcd、Zookeeper、Consul 与 Nacos 比较
在微服务架构中,服务注册与发现是实现服务动态管理和负载均衡的关键。本文将对四款主流的服务注册与发现工具——Etcd、Zookeeper、Consul、Nacos进行深入对比,从功能、性能、一致性、生态集成、应用场景等多个维度展开分析,帮助您选择最适合…...
桥接模式详解和分析JDBC中的应用
🎯 设计模式专栏,持续更新中, 欢迎订阅:JAVA实现设计模式 🛠️ 希望小伙伴们一键三连,有问题私信都会回复,或者在评论区直接发言 桥接模式 文章目录 桥接模式桥接模式的四个核心组成:…...

【python - 函数】
一、交互式会话 在与 Python 的交互式会话中,你可以在提示符 >>> 后键入一些 Python 代码,Python 解释器会读取并执行你键入的各种命令。 要启动交互式会话,请在终端 (Mac/Unix/Linux) 中键入 python3 或在 Windows 中打开 Python…...
scipy中稀疏矩阵特征值问题概述
在Python的scipy库中,这三种算法——ARPACK、LOBPCG、和AMG——都是用于求解稀疏矩阵特征值问题的数值方法。它们各自有不同的特性和适用场景,以下是详细说明: 1. ARPACK (Arnoldi Package) ARPACK(Arnoldi Package)…...

浅谈线性表——队列
文章目录 一、什么是队列?二、队列底层三、自我实现一个队列3.1、链式存储3.1.1、单向链表实现队列的实现代码3.1.2、双向链表实现队列的实现代码 3.2、顺序存储3.2.1、循环队列的实现代码 一、什么是队列? 队列是只允许在一端进行插入数据操作…...

2-94 基于matlab的最佳维纳滤波器的盲解卷积算法
基于matlab的最佳维纳滤波器的盲解卷积算法。维纳滤波将地震子波转换为任意所需要的形态。维纳滤波不同于反滤波,它是在最小平方的意义上为最 佳。基于最佳纳滤波理论的滤波器算法是莱文逊(Wiener—Levinson)算法。程序提供了4种子波和4种期望输出:零延迟…...

【提示词】浅谈GPT等大模型中的Prompt
Prompt是人工智能(AI)提示词,是一种利用自然语言来指导或激发人工智能模型完成特定任务的方法。在AI语境中,Prompt是一种自然语言输入,通常指的是向模型提出的一个请求或问题,这个请求或问题的形式和内容会…...

最强AI照片说话Windows一体包下载地址,口型合成音频驱动图片,免安装,下载即用
照片数字一键整合包:点击下载 一键安装包,简单一键启动,即刻使用,秒级体验。 目前效果最好的音频驱动图片说话的软件,比sadtalker、MuseTalk更清晰,效果更好,可以作为DID heygen的开源平替。原…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...