c++学习——类和对象

2023-11-04

类和对象的基本概念

类是自定义数据类型,是C语言的结构体进化而成的
对象是类实例化出的,用数据类型定义一个变量

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class Maker //这个是类
{
public:
	int a;//成员属性(成员变量)
	void func()//成员方法(成员函数)
	{
		cout << "func" << endl;
	}
};
int main()
{
	Maker m; //m就是对象
	system("pause");
	return EXIT_SUCCESS;
}

类的封装

C和C++中struct区别:
C语言struct只有变量
C++语言struct既有变量,也有函数

1、为什么要有封装?
封装是把属性(变量)和方法(函数)封装到类内,然后给这些数据赋予权限,防止乱调用函数和变量,出现错误,维护代码更方便
在这里插入图片描述
//类外不能访问私有权限的成员
//类外可以访问公有权限的成员
//类外不能访问保存权限的成员
//子类的类内可以访问父类的保护权限的成员 不能访问私有权限的成员
//类内是没有权限之分的

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include<string>

//封装:1、把属性和方法放到类中,给这些数据赋予权限
//类内
class Maker
{
public://公有权限
	void set(string Name,int Id)
	{
		id = Id;
		name = Name;
	}
	void printMaker()
	{
		cout << "id=" << id << endl << "name=" << name << endl;
	}
	void get()
	{
		cout << "Maker a=" << a << endl;
	}
private://私有权限
	int id;
	string name;
protected://保护权限
	int a;
};

//继承  公有继承
class Son :public Maker
{
public:
	void func()
	{
		//下面的a是从父类复制过来的
		a = 20;//子类的类内可以访问父类的保护权限的成员
		//id = 1;//err
	}
	void getS()
	{
		cout << "Son a=" << a << endl;
	}
};

void test02()
{
	Maker m;
	Son s;
	s.func();
	m.get();
	s.getS();
}

//类外不能访问私有权限的成员
//类外可以访问公有权限的成员
//类外不能访问保存权限的成员
//子类的类内可以访问父类的保护权限的成员  不能访问私有权限的成员
//类内是没有权限之分的

void test01()
{
	Maker m;
	m.set("露琪亚", 1);
	m.printMaker();
}

int main()
{
	test01();
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述

尽量把成员属性设置为私有的

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include<string>

class Maker
{
public:
	//写
	void setName(string Name)
	{
		name = Name;
	}
	//读
	string getName()
	{
		return name;
	}
	//写
	void setAge(int Age)
	{
		//可以保护属性的合法性
		if (Age > 0 && Age < 120)
		{
			age = Age;
		}
	}
	//读
	int getId()
	{
		return id;
	}
private:
	string name;
	int age;
	int id;
};



int main()
{
	system("pause");
	return EXIT_SUCCESS;
}

尽量把属性设置为私有权限
1、可以控制属性的读写权限
2、可赋予客户端访问数据的一致性
3、可以保护属性的合法性

小练习

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include<string>

class Maker
{
public:
	void Init()
	{
		name = "露琪亚";
		age = 18;
	}
	//set get方法
	void setN(string mName)
	{
		name = mName;
	}
	string getN()
	{
		return name;
	}
	void setA(int mAge)
	{
		if (mAge >= 0 && mAge <= 100)
		{
			age = mAge;
		}
	}
	int getA()
	{
		return age;
	}

	//打印方法
	void printMaker()
	{
		cout << "name: "  << name << " age: "  << age << endl;
	}
private:
	string name;
	int age;
};
int main()
{
	Maker m;
	m.Init();
	m.printMaker();
	m.setN("一护");
	m.setA(30);
	m.printMaker();
	cout << "name:" << m.getN() << " age:" << m.getA() << endl;
	m.getA();
	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述

结构体和类的区别

//结构体的默认权限是公有的
//类的默认权限是私有的

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

//结构体的默认权限是公有的
//类的默认权限是私有的

//结构体
struct Maker1
{
	int a;
	void func()
	{

	}
public:
	int b;
};

//类
class Maker2
{
	int a;
	void func()
	{

	}
public:
	int b;
};

//继承
struct SonMaker1 :public Maker1
{

};

class SonMaker2 :public Maker2
{

};

int main()
{
	Maker1 m1;
	Maker2 m2;
	m1.b;
	m2.b;

	m1.a;
	//m2.a;err

	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述

圆的周长类案例

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>//c++字符串
using namespace std;
//自定义的数据类型
//设置圆的类
class Circle
{
//个人习惯  方法和属性写在不同的共有权限
public:
	//设置半径的长度
	void setR(double r)
	{
		mR = r;
	}
	//计算圆的周长
	double getL()
	{
		return 2 * 3.14*mR;
	}

public://共有权限
	double mR;//成员变量,成员属性
};

void test01()
{
	//数据类型定义变量
	//类实例化对象
	Circle c;
	c.setR(100);
	cout << "圆的周长=" << c.getL() << endl;
}

void test02()
{
	//字符串的操作
	const char *p = "hello";
	char buf[100] = "hello";
	cout << buf << endl;

	string str = "world";
	cout << str << endl;
}

int main()
{
	test01();
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

学生类的案例

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <string>

class Student
{
public://公有
	void setName(string Name)//成员方法  成员函数
	{
		name = Name;
	}
	void setId(int Id)
	{
		id = Id;
	}
	void myprint()
	{
		cout << "姓名:" << name << "\n学号" << id << endl;
	}
private://私有权限
	string name;//成员属性
	int id;//成员属性
};
int main()
{
	Student s;
	s.setName("卡卡罗特");
	s.setId(1);
	s.myprint();
	system("pause");
	return EXIT_SUCCESS;
}

汽车案例

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include<string>

class Car
{
public:
	void init()
	{
		type = "BMW";
		Size = 5;
		Color = "白色";
	}
	void printCar()
	{
		cout << "品牌:" << type << " 大小:" << Size << endl;
	}
private:
	string type;
	int Size;
	string Color;
};

class SonCar :public Car
{
public:
	//写
	void setType(string Type)
	{
		type = Type;
	}
	void setMyT(int t)
	{
		MyT = t;
	}
	void setMynum(int num)
	{
		Mynum = num;
	}
	//读
	string getT()
	{
		return type;
	}
	int getMyT()
	{
		return MyT;
	}
	int getMynum()
	{
		return Mynum;
	}
	void printConSar()
	{
		cout << "品牌:" << type << " 吨位:" << MyT << " 轮子个数:" << Mynum << endl;
		Car::init();
		Car::printCar();
	}
private:
	string type;
	int MyT;
	int Mynum;
};

void test01()
{
	Car c;
	c.init();
	c.printCar();
}

void test02()
{
	SonCar sc;
	sc.setType("玛莎拉蒂");
	sc.setMyT(20);
	sc.setMynum(8);
	sc.printConSar();
}
int main()
{
	//test01();
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

立方体案例

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class Cube
{
public:
	//初始化变量
	void init()
	{
		mL = 0;
		mW = 0;
		mH = 0;
	}

	//set
	void setL(int l)
	{
		mL = l;
	}
	void setW(int w)
	{
		mW = w;
	}
	void setH(int h)
	{
		mH = h;
	}

	//get
	int getL()
	{
		return mL;
	}
	int getW()
	{
		return mW;
	}
	int getH()
	{
		return mH;
	}

	//求立方体的面积
	int caculateS()
	{
		return 2 * mL*mW + 2 * mL*mH + 2 * mW*mH;
	}

	//求立方体的体积
	int calculateV()
	{
		return mL * mH * mW;
	}

	//成员函数比较立方体
	//这里在类里进行的   因此只需要传一个参数就行了
	bool CompareCube(Cube &cube)
	{
		if ( getL() == cube.getL() && getW()== cube.getW() && getH() == cube.getH() )
		{
			return true;
		}
		else
		{
			return false;
		}
	}
private:
	int mL;
	int mW;
	int mH;
};

bool IsCompareCube(Cube &c1,Cube &c2)
{
	if (c1.getH()==c2.getH() && c1.getW() == c2.getW() && c1.getL() == c2.getL())
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
	Cube c1, c2;
	//初始化对象
	c1.init();
	c2.init();

	//设置立方体的长宽高
	c1.setL(10);
	c1.setW(20);
	c1.setH(30);

	c2.setL(10);
	c2.setW(20);
	c2.setH(30);

	if (c1.CompareCube(c2))
	{
		cout << "两个立方体相等" << endl;
	}
	else
	{
		cout << "两个立方体不相等" << endl;
	}

	if (IsCompareCube(c1,c2))
	{
		cout << "两个立方体相等" << endl;
	}
	else
	{
		cout << "两个立方体不相等" << endl;
	}

	system("pause");
	return EXIT_SUCCESS;
}

点和圆案例

c
在这里插入图片描述
Circle.h

#pragma once
#include "Point.h"
#include <cmath>//数据公式的库
#include <iostream>
using namespace std;

class Circle
{
public:
	void SetR(int r);
	void SetHear(Point &p);
	void SetHear(int x, int y);

	int getR();
	Point getHear();

	//判断点和圆的关系
	void isPointAndCircle(Point &p);
private:
	int mR;//半径
	Point mHear;//圆心
};

Point.h

#pragma once

class Point
{
public:
	void setX(int x);
	void setY(int y);
	int getX();
	int getY();
private:
	int mX;
	int mY;
};

Point.c

#include "Point.h"

void Point::setX(int x)
{
	mX = x;
}

void Point::setY(int y)
{
	mY = y;
}

int Point::getX()
{
	return mX;
}

int Point::getY()
{
	return mY;
}

Circle.c

#include "Circle.h"
void Circle::SetR(int r)
{
	mR = r;
}
void Circle::SetHear(Point &p)
{
	mHear.setX(p.getX());
	mHear.setY(p.getY());
}
void Circle::SetHear(int x, int y)
{
	mHear.setX(x);
	mHear.setY(y);
}

int Circle::getR()
{
	return mR;
}
Point Circle::getHear()
{
	return mHear;
}

//判断点和圆的关系
void Circle::isPointAndCircle(Point &p)
{
	//获取圆心和点之间的距离的平方
	double distance = pow((p.getX() - mHear.getX()), 2) + pow((p.getY() - mHear.getY()), 2);
	//半径的平方
	double tmpR = pow(mR, 2);	
	//
	if (distance>tmpR)
	{
		cout << "点在圆外" << endl;
	}
	else if (distance == tmpR)
	{
		cout << "点在圆上" << endl;
	}
	else
	{
		cout << "点在圆内" << endl;
	}
}


30 点和圆的案例.cpp

#include "Circle.h"
void Circle::SetR(int r)
{
	mR = r;
}
void Circle::SetHear(Point &p)
{
	mHear.setX(p.getX());
	mHear.setY(p.getY());
}
void Circle::SetHear(int x, int y)
{
	mHear.setX(x);
	mHear.setY(y);
}

int Circle::getR()
{
	return mR;
}
Point Circle::getHear()
{
	return mHear;
}

//判断点和圆的关系
void Circle::isPointAndCircle(Point &p)
{
	//获取圆心和点之间的距离的平方
	double distance = pow((p.getX() - mHear.getX()), 2) + pow((p.getY() - mHear.getY()), 2);
	//半径的平方
	double tmpR = pow(mR, 2);	
	//
	if (distance>tmpR)
	{
		cout << "点在圆外" << endl;
	}
	else if (distance == tmpR)
	{
		cout << "点在圆上" << endl;
	}
	else
	{
		cout << "点在圆内" << endl;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++学习——类和对象 的相关文章

  • VLC 媒体播放器有 C# 界面吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以使用 C 控制台应用程序中的包装器从 VLC 播放中当前播放的文件中读取曲目统计信息 时间 标
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository

随机推荐

  • WebGL射击游戏的优化

    myshmup com 允许在浏览器中创建 shmup 射击 游戏 我们可以使用具有创意通用许可证的资源或上传自己的艺术作品和声音 创建的游戏可以在网站上发布 该平台不需要编码 游戏对象的配置是在用户界面的帮助下执行的 后端是使用Djang
  • Spring MVC结果转换

    一 返回视图 ModelAndView 1 视图路径 默认在当前Control的路径下 表示项目部署的根目录 例如 new ModelAndView home jsp 返回的路径是 user home jsp new ModelAndVie
  • 实现一个最小的操作系统

    实现一个最小的操作系统 本实验在Vmware虚拟机的Linux环境下完成 准备工作 硬件 VMware下Linux虚拟机 Ubuntu 18 04 5 LTS 软件 汇编编译器NASM 软盘绝对扇区读写工具 dd命令 VMware的安装以及
  • 机器人基础原理1_2——机器人分类与常见坐标系

    机器人分类与常见坐标系 1 机器人的分类 1 按辈分 2 对应人的不同器官 3 按其构成机构 3 按驱动方式不同 4 按用途分类 2 常见的坐标系及对应的机器人结构 2 1 笛卡尔坐标系 2 2 圆柱坐标系 2 3 球坐标系 1 机器人的分
  • ThoughtWorks(中国)程序员读书雷达

    软件业的特点是变化 若要提高软件开发的技能 就必须跟上技术发展的步伐 埋首醉心于项目开发与实战 固然能够锤炼自己的开发技巧 却难免受限于经验与学识 世界上并不存在速成的终南捷径 但阅读好的技术书籍 尤其是阅读大师们的经典著作 总能收到事半功
  • Zabbix学习笔记(一)---Zabbix的安装

    目录 前言 一 Zabbix简介 二 下载与安装 1 CentOS 9安装 2 安装zabbix A 安装Zabbix包 B 安装Zabbix server 前端 Agent C 设置httpd D 安装数据库 总结 前言 近期学习网络运维
  • vue中使用高德地图实现历史轨迹回放并能控制播放轨迹的倍速

    如何在vue中引入高德地图在这里就不过多赘述 大家可以看这篇参考在vue中引入高德地图 说正事 使用高德地图实现轨迹回放 并能实现倍速控制 具体效果如图 核心代码 绘制小车 this marker new AMap Marker posit
  • ElasticSearch入门

    ElasticSearch概述 ElasticSearch 简称es es是一个开源的高扩展式全文检索引擎 它可以近乎实时的存储 检索数据 本身扩展性很好 可以扩展到上百台服务器 处理PB级别的数据 ElasticSearch安装 声明 j
  • Qt 学习之旅 ----可移动的无边框圆角窗口

    Qt 默认的窗口会有系统自带的边框 如图 但是在大多数情况下 系统自带的边框是不需要的 去掉边框很简单 在建立窗口时 加入如下一个函数 w setWindowFlags Qt FramelessWindowHint 这样 边框就被去掉了 但
  • win7安装计算机的更新,解决win7系统更新升级教程

    操作系统是一个复杂的程序 在使用过程中也需要不断的更新 修复漏洞 但是很多朋友都会将win7系统的自动更新关闭 我给大家带来了win7系统更新升级的小方法 大家可以参考一下 win7系统可以说是目前最易用的操作系统 它增加了一些小功能 如快
  • DevOps B站学习版(一)

    学习地址 01 DevOps的诞生 哔哩哔哩 bilibilihttps www bilibili com video BV1Pt4y1H7Zq p 1 vd source 1f09c23f556b3d6a9b7706f8db12fa54
  • 人类的行为与程序计算

    胡言乱语 引子 人类从出生伊始都在面临着生活中的种种问题 人类无时无刻不在进行着问题的解决过程 程序从设计之初也是用来解决生活中特定问题的 那么人类行为与程序计算理论之间又有什么相似性呢 人类 人类所面临的问题 人类解决问题的过程 人类解决
  • vue 按钮 路由

    APP vue 在已有的按钮上加上路由功能 这里的按钮和布局容器使用了 elementui 的但无关原理 按下按钮即可跳转页面
  • 雷达测高知识点总结

    1 激光和雷达的区别 雷达 radar radio detection and ranging 无线电探测和测距 雷达波段 雷达发射电波的频率范围 大多数雷达工作在超短波及微波波段 其频率范围在30 300000兆赫 相应波长为1mm 10
  • 利用PyTorch自己动手从零实现YOLOv3(详细注释)

    学习一个算法最好的方式就是自己尝试着去实现它 因此 在这片博文里面 我会为大家讲解如何用PyTorch从零开始实现一个YOLOv3目标检测模型 参考源码请在这里下载 模型实现总共会分为以下六部分 一 配置文件以及解析 二 搭建YOLO模型框
  • 哈希结构(图文详解)【哈希表,哈希桶,位图,布隆过滤器】

    哈希结构 哈希概念 常见的K V结构 实现了元素关键码与元素值的映射关系 但没有实现元素关键值与元素存储位置的映射关系 在遍历过程中 一般的顺序表或搜索二叉树要进行关键值的多次比较 其中顺序表的时间复杂度为O n 二叉搜索树的时间复杂度O
  • phantomjs实现html生成pdf

    phantomjs实现html生成pdf 实现比较简单 同时能够实现对页面的完全展示成pdf 但是生成的时间比较长且并发很差 很容易直接挂掉 以下是实现 1 下载phantomjs 2 1 1 windows并解压到本地路劲 2 实现jav
  • php接口post数据接收不到参数原因

    1 检查头信息content type是不是为 content type application x www form urlencoded 这种传输是以表单的方式提交数据php使用 POST方式接受 2 如果头信息content type
  • python与mongodb交互-->pymongo

    from pymongo import MongoClient 创建数据库连接对象 client MongoClient ip 27017 选择一个数据库 db client admin db authenticate python pyt
  • c++学习——类和对象

    类和对象 类和对象的基本概念 类的封装 尽量把成员属性设置为私有的 小练习 结构体和类的区别 圆的周长类案例 学生类的案例 汽车案例 立方体案例 点和圆案例 类和对象的基本概念 类是自定义数据类型 是C语言的结构体进化而成的 对象是类实例化