【BIG_FG_CSDN】C++ 类与对象 (个人向——学习笔记)

基本概念:

类->类型;类描述抽象概念的;

对象->变量;对象描述客观实的;

在进行面向对象程序设计时要先声明类,再创建该类的对象。

为了方便讲述与理解这里我使用一个例题进行讲解吧。

例子:一个完整的类与对象的题目;

求圆柱体的表面积与体积;

#include <iostream>
#include <cmath>
using namespace std;class Point
{
public:Point(double aa = 0, double bb = 0){a = aa;b = bb;p = 3.14*pow(a,2);c = 3.14 * 2*a;}double getVolume(){return p * b;}double getArea(){return 2*p+c*b;}
private:double a;double b;double c;double p;
};
int main()
{double x,y;cin >> x>>y;Point t1(x,y);cout << t1.getArea() << " " << t1.getVolume();return 0;
}
主函数中

Point t1(x,y); 表示建立一个对象;

Point表示的是类名,必须是已经存在的类名才行;

t1表示对象名,自己起,起名规则与标识符相同;

而(x,y)实参,具体的一会再说;

t1.getArea()表示使用t1的getArea;

如何定义类:

定义类时要将类的位置放到函数的上面,要不然程序跑到主函数时,找不到类;

class为关键词:管理类中默认权限。这里还有一个关键词为struct;这两个区别就是class默认权限是private,而struct默认为pubilc;

那么什么是权限呢?

class 类名 
{ 
public: 公有数据成员; 公有成员函数; 
protected: 保护数据成员;  保护成员函数;
private: 私有数据成员; 私有成员函数; 
};

权限分为三种pubilc、protected、private;

pubilc:共有权限,不管是类内还是类外都可以访问到;

protected:保护权限,类内与派生类可以访问到;

private:私有权限,只有类内可以访问到;

C++提供了比结构体类型更加方便安全的类类型,类的定义一般分为说明部分和实现部分。

说明部分来说明该类中的成员:数据成员和成员函数,成员函数是对数据成员进行操作的;

实现部分对成员函数进行定义。

Point为类名,可随意定义,一般首字母要大写;

{};定义类与定义函数的区别是要在“}”后面加上一个“;”

数据成员

1.定义数据成员时不能给数据成员赋初值。因为类是抽象的,只是一种类型,类中 的数据成员不占内存空间。

class Point
{
double z;
double a;
double x=10;//错误
double y=20;//错误
};

2.类的数据成员可以使用 C++基本数据类型、构造数据类型,还可以使用已定义完整的类类型。

class Point
{
double x;
double y;
};class Circle
{
Point p;//定义了上面的point中的成员;
double r;
};

3.在正在定义的类中,因为该类还没有定义完整,所以不能定义该类类型的数据成员,只能定义该类类型的指针或引用成员。

class Point
{
double x;
double y;
Point p1;//错误
Point &p2;//正确
Point *p3;//正确
};

那么定义了数据成员不能赋值该如何使用呢?

成员函数

成员函数的定义、声明格式与非成员函数(全局函数)的格式与用法基本一样,只是成员函数属于某 个类。成员函数的定义可以放在类中,也可以放在类外。

内联函数

所有在类内部定义的函数都是内联函数,称为隐式定义。

内联函数在编译时使用函数体替换调用处的函数名,可以提高函数运行的速度,但是会增加编译的时间。

class Point
{
public:
返回值类型 函数名(形参)
{函数的内容;
}
void SetPoint(double xx,double yy)
{
x=xx;
y=yy;
}
void Display()
{
cout<<"("<<x<<","<<y<<")"<<endl;
}
private:
double x;
double y;
};

在主函数或者自定义函数里时,使用某对象的Setpoint需要(实际函数),而Display()不用;

在类外定义函数体的格式如下:

返回值类型 类名::成员函数名(形参表)
{函数体;
}

::是类的作用域分辨符,放在类名与成员函数之间,表明后面的成员函数属于前面的那个类。

但在类外定义时需要在函数定义的 头前加上关键字 inline,称为显示定义,这样做使代码书写更加清晰。

如果采用这种方式定义内联函数,类的声明和内联成员函数的定义要放在同一个文件中,否则在编译时无法进行代码置换。

例如:与上面的内联函数效果一样的例子,

class Point
{
public:void SetPoint(double xx,double yy);void Display();
private:double x;double y;
};inline void Point::SetPoint(double xx,double yy)
{x=xx;y=yy;
}inline void Point::Display()
{
cout<<"("<<x<<","<<y<<")"<<endl;
}

一般地按照习惯将成员放入private;函数放入public;

你一定发现了怎么有个函数没有返回值呢?这是一个特殊的函数--构造函数

构造函数

构造函数是一种特殊的成员函数,函数名与类名相同,可以有任意类型的参数,但不能有返回值类型,在建立对象时自动调用,用于为对象分配空间并进行初始化。

这就是在最上面的例子中我的主函数中建立Point t1(x,y)时可以加(x,y)的原因.如何没有定义构造函数不可加上(x,y)这样的实参,就是要写成这样Point t1;

如果在定义类时,没有为类定义构造函数,编译系统就生成一个默认形式的隐含的构造函数,这个构造函数的函数体是空的,因此默认构造函数只为对象开辟空间,而不对数据成员赋初值。

这是有人发现了,为什么我的构造函数中里的形参要加上( =0 )这一步呢?

又是一个例子:

#include <iostream>
using namespace std;
class Point
{public:Point(double xx=0, double yy=0){x = xx;y = yy;}void setPoint(double xx, double yy){x=xx;y=yy;}void displayPoint(){cout << "(" << x << ","<<y << ")" << endl;}private:double x;double y;
};int main()
{double x,y;cin>>x>>y;Point p;p.displayPoint();p.setPoint(x,y);p.displayPoint();return 0;}

这里在建立对象时,没有给进实参,所以构造函数就会调用形参中的赋值进入形参里面;

如果不写=0,系统会报错,为啥呢?因为在建立一个对象后,我又使用了一个类里的函数,这个函数的功能是输出数据成员,而这时数据成员没有值,数据成员为抽象的,没有值就会报错,所以输出不了,就无法使用这个函数;

那么我可不可以这样定义呢?

    Point(double xx, double yy){xx=0;yy=0;x = xx;y = yy;}

当然不行了!!!因为数据成员时不能给数据成员赋初值;

又又人发现了,你最上面的例子不对啊,为啥构造函数里的形参(=0)和实参都写了。这样写是不算错的,实参有数据,成员函数的形参会忽略掉形参里的赋值,效果等于没有形参的(=0);

这时又又又注意到了,为什么成员函数的形参不像自定义函数里的形参似的可以设置成与实参一样的变量呢?

哈哈又是一个例子:

#include <iostream>
using namespace std;
class Point
{public:Point(double x, double y){x = x;y = y;}void displayPoint(){cout << x <<" "<<y<< endl;}private:double x;double y;
};int main()
{double x,y;cin>>x>>y;Point p(x,y);p.displayPoint();return 0;}

如果设成这样会报错吧?当然不会啦!!!但是当你跑起程序时,你会发现输出的值不是你想要的,而是一堆乱码。为啥呢,因为我们编译器搞不明白x=x是哪两变量,是新参还是数据函数,就会造成程序错误。那怎么解决呢?

this指针

this 指针是一个系统预定义的特殊指针,指向当前对象,只能在类的成员函数中使用, 存有当前对象的地址,程序员不能改变,只能使用。

成员函数的形参名与数据成员名相同时,访问数据成员需要在数据成员前用 this 指针;

Point(double x,double y)
{
this->x=x; 
this->y=y;
}

这样编译器就会明白了第一个x是数据成员,第二个x是形参中的x;

类与对象的例题:

参考资料:

[1]CSDN:C++ class 和 struct 构造函数

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]

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

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

相关文章

《javaweb——文件上传-分页查询》

1、文件上传 1.文件上传的应用场景&#xff1a;提交作业 上传头像 提交简历&#xff08;上传附件&#xff09; 上传商品&#xff0c;图书图片 2.文件上传的前台如何编写以及注意事项&#xff1a; 1.肯定需要用到表单 2.文件上传的那一栏需…

Vue 自定义搜索输入框SearchInput

效果如下&#xff1a; 组件代码 <template><div class"search-input flex flex-space-between flex-center-cz"><input type"text" v-model"value" :ref"inpuName" :placeholder"placeholder" keyup.enter&…

java 统计中文字符个数能用length吗

在Java中&#xff0c;统计中文字符的个数可以使用length()方法。但是&#xff0c;这只能统计中文字符串的长度&#xff0c;不能判断其中是否包含中文字符。如果你需要统计一个字符串中中文字符的个数&#xff0c;你可能需要使用正则表达式或者其它方式来判断每个字符是否为中文…

【赠书第11期】Unity 3D游戏开发

文章目录 前言 1 Unity 3D简介 2 Unity 3D基本概念 2.1 场景&#xff08;Scene&#xff09; 2.2 游戏对象&#xff08;Game Object&#xff09; 2.3 组件&#xff08;Component&#xff09; 2.4 资源&#xff08;Asset&#xff09; 3 Unity 3D重要组件 3.1 物理引擎 …

HarmonyOS4.0从零开始的开发教程18HarmonyOS应用/元服务上架

HarmonyOS&#xff08;十六&#xff09;HarmonyOS应用/元服务上架 简介 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c…

高性价比AWS Lambda无服务体验

前言 之前听到一个讲座说到AWS Lambda服务&#xff0c;基于Serverless无服务模型&#xff0c;另外官网还免费提供 100 万个请求 按月&#xff0c;包含在 AWS 免费套餐中是真的很香&#xff0c;对于一些小型的起步的网站或者用户量不大的网站&#xff0c;简直就是免费&#xff…

Flink系列之:Top-N

Flink系列之&#xff1a;Top-N 一、TOP-N二、无排名输出优化 一、TOP-N 适用于流、批Top-N 查询可以根据指定列排序后获得前 N 个最小或最大值。最小值和最大值集都被认为是Top-N查询。在需要从批表或流表中仅显示 N 个底部或 N 个顶部记录时&#xff0c;Top-N 查询是非常有用…

PyTorch官网demo解读——第一个神经网络(2)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;1&#xff09; 继上一篇文章我们展示了第一个神经网络的完整代码&#xff0c;今天我们来聊聊这个神经网络的模型设计。 这个demo实际上只使用了一个简单的线性模型&#xff1a;y wx b&#xff1b; 手写…

[Spring 从模拟开始学习源码]`@Value`的底层实现

Value 注入主要有三种场景&#xff1a; 注入原始值&#xff0c;比如说注入Value("hello")注入变量&#xff0c;比如Value("${JAVA_HOME}")注入spel表达式&#xff0c;比如Value("#{1 2}") 文章目录 获取 Value内容解析 ${}内容解析 SPEL类型转换…

云计算:Vmware 安装 FreeNAS

目录 一、实验 1.Vmware 安装 FreeNAS 2.配置Web界面 二、问题 1.iSCSI如何限定名称 2.LUN和LVM的区别 一、实验 1.Vmware 安装 FreeNAS &#xff08;1&#xff09;环境准备 VMware Workstation 17 FreeNAS相关安装部署镜像: 官网地址&#xff1a; https://download…

【linux】SSH终端Putty配置:文件上传/下载、显示中文字体、自动登录

文章目录 写在前面putty上传/下载文件1. 下载2. 解压和配置3. 使用sz/rz3.1 下载文件:sz3.2 上传文件:rz 显示中文字体1. 下载合适的字体2. 解压和安装3. putty配置 putty自动登录1. putty配置2. putty快捷方式配置3. 使用putty 写在后面 写在前面 一篇博客介绍了12种SSH终端工…

力扣刷题记录(10)LeetCode:51、37

51. N 皇后 应为各个皇后之间不能同行&#xff0c;所以一行只能有一个皇后。我们可以遍历每一行的各个位置&#xff0c;判断该位置是否可以放置皇后&#xff0c;一行放置一个。当一个皇后的位置已经在这一行确定了&#xff0c;我们就可以遍历下一行来确定下一个皇后在下一行的位…

laravel8 安装swoole扩展

,1&#xff0c;确保你的开发环境满足要求&#xff0c;包括 PHP 版本和相关的扩展。Swoole 扩展要求 PHP 版本为 7.2 或更高&#xff0c;并且需要安装 Swoole 扩展本身。 ,2&#xff0c;打开终端或命令行窗口&#xff0c;并导航到你的 Laravel 项目目录。 ,3&#xff0c;使用 …

✺ch3——数学基础

目录 3D坐标系和点矩阵单位矩阵转置矩阵逆矩阵逆转置矩阵矩阵的运算矩阵加法()矩阵乘法() 常用的变换矩阵平移矩阵缩放矩阵旋转矩阵透视矩阵正射投影矩阵LookAt矩阵 向量加法和减法点积叉积 局部空间和世界空间——模型矩阵M视觉空间和合成相机——模型-视图矩阵MV用GLSL函数构…

MySQL的explain解读记录

简介 Explain是Mysql自带的sql执行的性能分析器。通过 explain 命令获取 select 语句的执行计划。模拟优化器执行SQL语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈。 Explain可以分析出表的读取顺序、数据读取操作的操作类型、…

域名接入CloudFlare

接入Cloudflare分为两步 Cloudflare中注册站点域名DNS修改 整个过程如下 1.) 访问Cloudflare面板&#xff0c;添加站点 2.) 选择免费版 3.) 查看并明确DNS记录&#xff0c;其中服务的解析地址填写自己实际的服务器ip 4.) 去域名管理控制台&#xff0c;移除旧DNS服务器&#…

YOLOv5改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)

一、本文介绍 本文给大家带来的CARAFE&#xff08;Content-Aware ReAssembly of FEatures&#xff09;是一种用于增强卷积神经网络特征图的上采样方法。其主要旨在改进传统的上采样方法&#xff08;就是我们的Upsample&#xff09;的性能。CARAFE的核心思想是&#xff1a;使用…

轻量封装WebGPU渲染系统示例<52>- Json数据描述材质、纹理等3D渲染场景信息

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/DataDrivenScene3.ts 当前示例运行效果: ​​​​​​​ Json数据: {"renderer": {"mtplEnabled": true,"camera": {"eye&quo…

16、vue3(十六):数据大屏(一):尺寸适配,水球图,柱形图,饼状图、图例

目录 一、尺寸适配解决方案 1.vw和vh 2.scale 二、数据大屏顶部搭建 1.思路分析

lightdb mysql模式下的datediff

文章目录 背景MySQL行为LightDB MySQL兼容模式行为DATEDIFF 背景 在信创适配中&#xff0c;有从MySQL迁移过来的程序&#xff0c;其中程序涉及日期加减数字的场景和使用datediff函数的场景。因此在LightDB-X 23.4版本中&#xff0c;MySQL兼容模式下对日期加减数字做了支持&…