c++笔记理解

1.封装

(1)构造函数不是必须在的

可以通过行为修改属性

(2)private和protected区别在于继承那里要学

(3)类默认是私有,struct是共有

私有的好处:控制数据的有效性,意思是在外面给函数的方式写,可以设置多少多少就不能写那种

(4)cube例子不会的点

类内写:
bool equal2(cube& c2)
{
	if (h == c2.h && w == c2.w && l == c2.l)return true;
	return false;
}
类外写:
	cout << cu.equal2(cu2);

(5)点和圆的关系

#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
class point
{
    int x, y;//点所在的位置
public:
    point(int x, int y)
    {
        this->x = x; this->y = y;
    }
    int getx()
    {
        return x;
    }
    int gety()
    {
        return y;
    }
};
class circle
{
    //int o,r;//分别是圆心所在的位置和半径,不行,得要二维数组
    int x, y, r;
public:
    circle(int x, int y, int r)
    {
        this->r = r; this->x = x; this->y = y;
    }
    /*int geto()//一个坐标一个坐标访问
    {
            //return o;不需要呀,因为你有构造函数了,可是无法访问呀?
    }*/
    int getx()
    {
        return x;
    }
    int gety()
    {
        return y;
    }
    int getr()
    {
        return r;
    }
    //把判断变成成员函数,传进来x,y
    void relation(point& p)
    {
        //先求出两点之间的距离,开根号sqrt()
        int d = sqrt((p.getx() - x) * (p.getx() - x) + (p.gety() - y) * (p.gety() - y));
        if (d < r)cout << "点在圆内" << endl;
        else if (d == r)cout << "点在圆上" << endl;
        else cout << "点在圆外" << endl;
    }
};

int main()
{
    circle c(2, 5, 3);
    point p(4, 4);
    //求点和圆的位置关系
    //点在圆内点在圆上点在员外
    //只需要将半径和这俩点之间的关系比较即可
    c.relation(p);
}

全局函数yyds

#include<iostream>
#include<stdio.h>
#include<math.h>
//class point;
using namespace std;
class circle
{
	//int o,r;//分别是圆心所在的位置和半径,不行,得要二维数组
	int x, y, r;
public:
	//class point;
	circle(int x,int y, int r)
	{
		this->r = r; this->x = x; this->y = y;
	}
	/*int geto()//一个坐标一个坐标访问
	{
		//return o;不需要呀,因为你有构造函数了,可是无法访问呀?
	}*/
	int getx()
	{
		return x;
	}
	int gety()
	{
		return y;
	}
	int getr()
	{
		return r;
	}
	//把判断变成成员函数,传进来x,y
	/*void relation(point& p)
	{
		//先求出两点之间的距离,开根号sqrt()
		int d = sqrt((p.getx() - x) * (p.getx() - x) + (p.gety() - y) * (p.gety() - y));
		if (d < r)cout << "点在圆内" << endl;
		else if (d == r)cout << "点在圆上" << endl;
		else cout << "点在圆外"<<endl;
	}*/
};
class point
{
	int x,y;//点所在的位置
public:
	point(int x,int y)
	{
		this->x = x; this->y = y;
	}
	int getx()
	{
		return x;
	}
	int gety()
	{
		return y;
	}
};
//全局函数还是好
void relation(circle c, point p)
{
	int d = sqrt((p.getx() - c.getx()) * (p.getx() - c.getx()) + (p.gety() - c.gety()) * (p.gety() - c.gety()));
	if (d < c.getr())cout << "点在圆内" << endl;
	else if (d == c.getr())cout << "点在圆上" << endl;
	else cout << "点在圆外" << endl;
}
int main()
{
	circle c(2, 5, 3);
	point p(4, 4);
	//求点和圆的位置关系
	//点在圆内点在圆上点在员外
	//只需要将半径和这俩点之间的关系比较即可
	relation(c,p);
}

咋说呢,你要想用哪个类,你就把这个类写到前面

可以把一个类型为某类的变量定义为另一个类的变量

圆心就是一个点,因此可以将园中的圆心定义为点的类型

(6)我就要把这个类放在不同文件里的知识单独拎出来

把类的声明放在头文件中使用.h文件;类中文件的实现放在cpp中重新起一个cpp文件,这个文件要用声明的头文件;在main函数里面想要使用类,就在前面加上声明的头文件

分别如何书写呢?

例如circle文件:

在头文件里写一个.h文件,然后把类复制进去,去掉函数实现,留下成员变量和成员函数的声明;

然后再源文件里另写一个cpp文件,这个文件写下来类内各个函数的具体实现就好了

这下:函数的声明函数的实现就都分得很清了

2.函数的初始化和销毁

1.构造函数和析构函数都是只要创建了对象,这个函数就会被自动调用,就算你不写,系统会自动给你写一个空的构造函数然后一调用,但是你要是写了就用你的,即便你不调用这个函数,他也会自动调用你写的

2.你要是在函数体内(不是main),那么就会放在栈上,这个函数用完就要析构销毁

main中,只有当main执行完了以后才能执行析构函数

3.匿名构造?三种方法

拷贝构造函数part:
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
class person
{
public:
	int age;
	person(int age)
	{
		this->age = age;
	}
	//拷贝构造函数 
	//因为你不能修改你传入的p的属性,因此要用静态引用
	person(const person& p)
	{
		//将传入的人身上的所有属性拷贝到我身上,我现在的age=传入的p的age
		age = p.age;
		cout << "输出拷贝构造函数" << endl;
	}

};
int main()
{
	person p1(10);
	cout << p1.age << endl;
	person p2(p1);
	cout << p2.age << endl;//输出也是10

}

匿名构造函数

	person(10);//没有给这个构造函数一个对象名,就是匿名构造函数
	//特点:当前行执行结束,就会被释放,就会析构函数
    Person(p3)
    //这是不对的
	//注意:不要利用拷贝函数初始化匿名对象-编译器会认为Person(p3) == Person p3 编译器会认为是对象的声明

隐式转换法的意思是你写一个person p3=10;系统会自动给你转换成显式法

4.

//值传递的方式给函数参数传值
//※拷贝构造函数为什么可以值传递哪里体现了?都没见拷贝构造函数;
解密时刻:!!!!!!!!!!!!!!!!!!!!!
因为当你值传递的时候就会调用拷贝构造函数,值传递相当于给了一个副本嘛
void dowork(Person p)
{
	
}
void test02()
{
	Person p;
	dowork(p);
}
//值方式返回局部对象
//输出那个是引用的解引用吗?,局部对象是p1?拷贝构造函数在哪?好吧,test03第一句就是p=p1;
//现在p有p2的所有属性,因此出来的对象是谁呢?p1本身?也就是想用p来输出p1,那为啥不直接输出dowork2()呢?
解密:p和p1的不是一个了,地址都不一样,相当于值传递,返回一个p1,就拷贝了一个p1
Person dowork2()
{
	Person p1;
	cout << (int*)&p1 << endl;
	return p1;
}
void test03()
{
	Person p = dowork2();
	cout << (int*)&p << endl;
}

5.深拷贝和浅拷贝

//再复习一下new的代码
int* p=new int(*p.height)//意思就是为p开辟一个空间,里面的内容是int括号里的内容,左边要是一个指针,指向这段空间

如果你的成员变量在堆区,那么就容易出现重复释放空间的问题,因为浅拷贝就相当于别人的值赋给你,同时你的位置也会和他一样,那你俩运行完就都会释放它就释放了两次,所以原因就在于你俩堆的位置在一块呢,所以把他俩放两个位置不就好了,用new开辟一个新空间

Person(const Person& p)
{
	cout << "Person的拷贝构造函数调用" << endl;
	m_Age = p.m_Age;
	//m_Height = p.m_Height;编译器默认实现的就是这行代码
	//深拷贝操作
	m_Height = new int(*p.m_Height);
}

6.当其他类对象作为本类的类成员时,先构造其他类,然后再构造本类,

析构的顺序与构造相反

3.友元

1.用途:private成员外面不能被访问,但有时候你想让外面某些特殊函数去访问,就采用友元

2.三种:全局函数;成员函数;类;

(1)全局函数:就是给类中前面加上函数的声明,并且给函数声明的前面加上friend

class friend
{
    friend void get();
}

(2)类:A想用B的,你就给A前面加上B的声明

class A//A里用B了,所以要声明friend
{
    friend class B;
  private:
    B b1;
}
class B
{

}
你放在B里面,就是要给B说别人能访问你

(3)成员函数

整明白了
就是你A类里一个函数想访问另一个类B,你就要在B里声明这个函数
不是想全局函数那样直接前面加一个friend,而是要在函数名字前面加上所属的类
例如下面
friend void GoodGay::visit();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

9、内网安全-横向移动Exchange服务有账户CVE漏洞无账户口令爆破

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正&#xff01; 背景&#xff1a; 在内网环境的主机中&#xff0c;大部分部署有Exchange邮件服务&#xff0c;对于Exchange服务的漏洞也是频出&#xff0c;在这种情况下&#xff0c;如果拿到内网中一台主机…

国家治理的数据赋能及其秩序生产(四)

国家治理的数据赋能及其秩序生产(四) 文章目录 国家治理的数据赋能及其秩序生产(四)前言五、大数据赋能国家治理的秩序异化(一) 数据垄断(二) 数据壁垒(三) 数据鸿沟前言 大数据刻画了社会存在,能够记录并存储有关权力流动的诸种细节,是治理主体使用的一种重要工具…

windows如何恢复删除文件?「2024恢复策略」

在数字时代&#xff0c;数据无疑是最为宝贵的财富之一。然而&#xff0c;无论是因为误操作、病毒感染还是其他各种原因&#xff0c;我们时常会面临文件被误删的风险。当重要的文件从Windows系统中消失时&#xff0c;许多用户都会感到焦虑和无助。那么&#xff0c;Windows系统下…

element导航菜单el-menu添加搜索功能

element导航菜单-侧栏&#xff0c;自带的功能没有搜索或者模糊查询。 找了找资料 找到一个比较可行的&#xff0c;记录一下&#xff1a; //index.vue的代码 <div style"overflow:auto"><el-menu :default-active"$route.path":default-openeds&…

IP 协议

IP 协议 .IP协议格式四位版本号四位首部长度8位服务类型16位总长度16位标识符,3位标志位,13位片偏移8位生存时间TTL8位协议16位首部校验和32位源地址 32位目的地址IP地址的组成特殊的IP地址 . IP协议格式 四位版本号 用来表示IP协议的版本,现有的IP协议只有两个版本,IPv4,IPv6…

Java面试题之分布式/微服务篇

经济依旧不景气啊&#xff0c;如此大环境下Java还是这么卷&#xff0c;又是一年一次的金三银四。 兄弟们&#xff0c;你准备好了吗&#xff1f;冲冲冲&#xff01;欧里给&#xff01; 分布式/微服务相关面试题解 题一&#xff1a;CAP理论&#xff0c;BASE理论题二&#xff1a;…

pclpy 可视化点云(多窗口可视化、单窗口多点云可视化)

pclpy 可视化点云&#xff08;多窗口可视化、单窗口多点云可视化&#xff09; 一、算法原理二、代码三、结果1.多窗口可视化结果2.单窗口多点云可视化 四、相关数据五、问题与解决方案1.问题2.解决 一、算法原理 原理看一下代码写的很仔细的。。目前在同一个窗口最多建立2个窗…

江科大stm32学习笔记——【3-2】GPIO输出:LED闪烁LED流水灯蜂鸣器

&#xff08;一&#xff09; 硬件连接 1.LED闪烁 LED灯正极连接面包板电源正极&#xff0c;LED负极连接单片机A0口 (也可以LED负极连面包板负极&#xff0c;LED正极连接单片机A0口) 跳线连接单片机3.3和面包板正极&#xff0c;连接单片机GND和面包板负极 2.LED流水灯 3.蜂鸣…

2个wordpress优化SEO主题模板

SEO优化wordpress主题 简洁的SEO优化wordpress主题&#xff0c;效果好不好&#xff0c;结果会告诉你&#xff0c;适合SEO公司使用的主题。 https://www.jianzhanpress.com/?p2804 SEO优化海外WordPress主题 简洁的SEO优化海外服务商WordPress主题&#xff0c;为中国制造202…

GaussDB SQL调优:建立合适的索引

背景 GaussDB是华为公司倾力打造的自研企业级分布式关系型数据库&#xff0c;该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持优异的分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000扩展能力&#xff0c;PB级海量存储等企业级数据库…

微服务篇之分布式系统理论

一、CAP定理 1.什么是CAP 1998年&#xff0c;加州大学的计算机科学家 Eric Brewer 提出&#xff0c;分布式系统有三个指标&#xff1a; 1. Consistency&#xff08;一致性&#xff09;。 2. Availability&#xff08;可用性&#xff09;。 3. Partition tolerance &#xff0…

突破企业发展瓶颈:解决人、机、物数据关联难题

在当今竞争激烈的商业环境中&#xff0c;企业面临着诸多挑战&#xff0c;而这些痛点正逐渐成为企业发展的绊脚石。人、机、物数据采集复杂&#xff0c;关联困难&#xff0c;导致全方位产能协同难以实现&#xff1b;产品多样性使得精准管控变得愈发困难。同时&#xff0c;库存积…

干货 | 如何通过 Navicat Monitor 3 创建自定义指标

Navicat Monitor 3 是一款安全、简单且无需代理的远程服务器监控工具&#xff0c;包含许多强大的功能&#xff0c;尽可能使你的监控工作更加有效。你可以通过 Web 浏览器从任何地方访问 Navicat Monitor&#xff0c;获取关于服务器负载和性能的统计数据&#xff0c;包括可用性、…

开源图表库Echarts 简介与基本使用

ECharts 是一个使用 JavaScript 实现的开源可视化图表库&#xff0c;由百度团队开发。它提供了丰富的图表类型&#xff0c;如折线图、柱状图、饼图、地图、雷达图等&#xff0c;并且可以轻松地与其他前端框架和库集成。ECharts 的设计目的是为了满足复杂数据的可视化需求&#…

ES6内置对象 - Set

Set&#xff08;es6提供的一种数据结构&#xff0c;类似数组&#xff0c;是一个集合&#xff0c;可以存储任何类型的元素且唯一、不重复&#xff0c;so,多用于元素去重&#xff09; 如上图&#xff0c;Set数据结构自带一些方法 1.Set对象创建 let a new Set([1,2,3,3,1,2,4,…

C++力扣题目 739--每日温度 496--下一个更大元素I 503--下一个更大元素II

739. 每日温度 力扣题目链接(opens new window) 请根据每日 气温 列表&#xff0c;重新生成一个列表。对应位置的输出为&#xff1a;要想观测到更高的气温&#xff0c;至少需要等待的天数。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 例如&#xff0c;…

【Unity】【VR开发】Unity云同步功能使用心得

【背景】 有时出差,旅行等等也带着电脑,晚上想要继续编辑项目,就需要用到云同步功能。目前实践下来,发现有些内容可以同步,有些内容则是不可以同步的,总结如下。 【如何云同步一个本地项目】 UnityHub的项目面板中有两个选项卡:项目和云端项目。 鼠标挪动到想要云同步…

web基础及http协议 (二)----------Apache相关配置与优化

一、httpd 安装组成 http 服务基于 C/S 结构 1 .常见http 服务器程序 httpd apache&#xff0c;存在C10K&#xff08;10K connections&#xff09;问题 nginx 解决C10K问题lighttpd IIS .asp 应用程序服务器 tomcat .jsp 应用程序服务器 jetty 开源的servlet容器&#xf…

Springboot+Vue为技术栈的低代码平台“JNPF”

目录 1.什么是JNPF 2.设计原理 3.自动化解决方案 4.平台亮点展示 5.总结 如果你有软件开发的需求&#xff0c;推荐你使用以Vue为技术栈的低代码JNPF。 这款低代码和市面上的其他低代码区别很大的&#xff0c;相较于轻流、简道云、轻宜搭、微搭、帆软、活字格等等&#xff…

Spring 类型转换、数值绑定与验证(二)—PropertyEditor与Conversion

Spring 中&#xff0c;属性类型转换是在将数值绑定到目标对象时完成的。例如在创建ApplicationContext 容器时&#xff0c;将XML配置的bean 转换成Java类型对象&#xff0c;主要是借助了PropertyEditor类&#xff0c;而在Spring MVC 的Controller的请求参数转化为特定类型时&am…