第2章 Class

news2024/11/27 4:36:56

Point结构体

//C语言写法
typedef struct point{
  float x;
  float y;
}Point;

Point a;
a.x = 1;
a.y = 2;
//const表示p指向的对象里的值不能由p指针修改
void print(const Point* p){
  printf("%d %d\n", p -> x, p -> y);
}
print(&a);

//想实现点的移动,move(dx, dy)?
//要修改Point中的值,所以不加const
void move(Point* p, int dx, int dy){
  p -> x += dx;
  p -> y += dy;
}

Prototypes-原型

typedef struct point{
  float x;
  float y;
}Point;
void print(const Point*p);
void move(Point* p, int dx, int dy);

Usage

Point a;
Point b;
a.x = b.x = 1;
a.y = b.y = 1;
move(&a, 2, 2);
print(&a);
print(&b);
//c++写法,可以不写typedef。struct后面的是结构体的名字
//可以直接Point a;
struct Point{
  int x;
  int y;
  void print(); //声明,不产生实体,不会被编译出代码
};
//结构体内的print,成员函数
void Point::print(){
  //x,y就是成员变量,不用写成p -> x
  //printf("%d %d", x, y);
  cout << x << " " << y << endl;
}
//自由函数,struct里的print是成员函数
void print(const Point* p){
  //printf("%d %d\n", p -> x, p -> y);
	cout << p -> x << " " << p -> y << endl;
}

int main(){
  Point a;
  Point b;
  a.x = 1; a.y = 1;
  b.x = 3; b.y = 4;
  a.print();//a这个对象做了能做的动作
  b.print();//成员函数
  print(&a);//自由函数
  moce(&a, 10, 20);
  print(&a);
}
//修改Point::print()
void Point::print(){
  //x,y就是成员变量,不用写成p -> x
  //printf("%d %d", x, y);
  cout << this <<endl;
  cout << this -> x << " " << this -> y << endl;
}
/*
this是关键字,相当于指向当前对象的指针
a.print()相当于Point::print(&a),把a的地址取出,交给Point的print函数执行
在自己的参数前编译器会加上一个隐藏的参数Point* this.可以在成员函数中直接用,
编译器为自动为非本地变量和非全局变量加上this,使得编译通过
*/

C++ version

class Point{
public:
  void init(int x, int y);
  void move(int dx, int dy) const;
  void print() const;
private:
  int x;
  int y;
};
//错误版本
void Point::init(int x, int y){
  x = x;//这个不能把参数x赋值给成员变量x,这里的x都是局部变量x,不是成员变量x
  y = y;
}
//正确版本
void Point::init(int x, int y){
  this -> x = x;//这个不能把参数x赋值给成员变量x,这里的x都是局部变量x,不是成员变量x
  this -> y = y;
}

:: —— resolver(域解析器)

<Class Name>::<function name>
::<function name>

void S::f(){
	::f();//Would be recursive otherwise!
  //如果::前没有任何东西,表明全局,调用的是全局的f()
  //如果没有f(),就是递归调用自己
  ::a++;//Select the global a,全局变量a
  a--;//The a at class scope,f函数内部没有本地变量a,所以应该是对应的对象的成员变量a
}

C VS C++

//C语言版本
  typedef struct point { 
   float x; 
   float y; 
  } Point; 
  void print(const Point* p); 
  void move(Point* p,int dx, 
  int dy); 
  Point a; 
  a.x = 1; a.y = 2; 
  move(&a,2,2); 
  print(&a);
//C++版本
  class Point { 
  public: 
   void init(int x,int y); 
   void print() const; 
   void move(int dx,int dy); 
  private: 
   int x; 
   int y; 
  } ; 
  Point a; 
  a.init(1,2); 
  a.move(2,2); 
  a.print();

1、C++把函数放进了结构内部

2、C语言需要显示参数,表示指向结构的指针;C++有隐式的指针this

3、C++中可以用this表明这个函数正在操作的结构体

4、C++中调用函数时,使用对象.函数的方式

To call the functions in a class 调用函数

Point a; 
a.move(10,10); 
/*There is a relationship with the function be called and 
the variable to call it. 
The function itself knows it is doing something w/ the 
variable.
*/

this: the hidden parameter

隐藏参数

//• this is a hidden parameter for all member 
//functions, with the type of the struct 
void Point::move(int dx, int dy); 
//➔ (can be regarded as) 
void Point::move(Point* this, int dx, int dy)
//• To call the function, you must specify a variable 
//Point a; 
a.x = 0; a.y = 0;
a.move(10, 10);
//➔ (can be regarded as)
Point::move(&a, 10, 10);

this.cpp

#include <iostream>
using namespace std;

struct Stu{
  int i;
  void f();
}

void Stu::f(){
  cout << "Inside Stu::f(), this" << this << endl;
}

int mai(){
  Stu stu;
  cout << "Inside main(), &stu" << &stu << endl;
  stu.f();
  return 0;
}
/*
输出的两个都是stu的地址
*/

Integer.h

#ifndef _INTEGER_HEAD_
#define _INTEGER_HEAD_

struct Integer{
  int i;
  void init(int i);
  Integer* bigger(Integer* r);
};
#endif

Integer.cpp

#incldue "Integer.h"
//Integer::init是完整名称,所以void写在前
void Integer::init(int i){
  this -> i = i;
}
//返回值i更大的Integer的指针
Integer* Integer::bigger(Integer* r){
  if(r -> i > i){ //后一个i是this的i
    return r;
  }else{
    return this;
  }
}

Objects = Attributes + Services 对象=属性+服务

• Data: the properties or status 用数据表明属性和状态

• Operations: the functions 对象对外提供的服务,服务过程中可能数据会改变

只有通过服务才能得知data内容或对data进行操作

Objects

• In C++, an object is just a variable, and the purest 

definition(纯粹的定义) is “a region of storage”. 

• The struct variables mentioned before are just 

objects in C++.

Ticket Machine 售票机

• Ticket machines print a ticket  when a customer inserts the   correct money for their fare.

• Our ticket machines work by  customers ‘inserting’ money  into them, and then  requesting a ticket to be 

printed. A machine keeps a  running total of the amount 

of money it has collected  throughout its operation.

这是面向过程的思维方式

面向对象的思维方式

左边是数据,右边是服务

prompt提示

balance余额

Object vs. Class

• Objects (cat)

• Represent things, events, or concepts

• Respond to messages at run-time

• Classes (cat class)

• Define properties of instances

• Act like types in C++

OOP Characteristics

1.Everything is an object. 一切皆为对象

2.A program is a bunch of objects telling each  other what to do by sending messages. 程序是一堆对象,通过发送消息互相告知做什么。不是how to do。强调程序的自主性

3.Each object has its own memory made up of  other objects. 每个对象有他自己的内存,这个内存里有其他的对象 。

4.Every object has a type. 每个对象有一个类型。 

5.All objects of a particular type can receive  the same messages. 属于同一个特定类型的对象可以接收相同类型的消息——逆否也对:接收不同类型消息的对象属于不同的类型

Point::init()

class Point{
public:
	void init(int x, int y);
  void print() const;
  void move(int dx, int dy);
private:
  int x;
  int y;
};

Point a;
a.init(1, 2);
a.move(2, 2);
a.print();

构造函数

class Point{
public:
	Point();
  void print() const;
  void move(int dx, int dy);
private:
  int x;
  int y;
};
Point::Point(){
  cout << "Point!!" << endl;
  this -> x = 0;
  this -> y = 0;
}
int main(){
  Point a;
  cout << "------------" << endl;
  Point b;
  cout << &a << endl;
  a.print();
  b.print();
  a.move(2, 2);
  a.print();
  return 0;
}
//打印出了两次Point(),说明每次创建对象就会调用构造函数

有参构造函数

class Point{
public:
	Point(int x, int y);
private:
  int x;
  int y;
};
Point::Point(int x, int y){
  cout << "Point!!" << endl;
  this -> x = x;
  this -> y = y;
}
int main(){
  Point a(1, 2);
}

1、构造函数没有返回类型

2、对象被创建时调用构造函数

3、分为无参构造函数和有参构造函数

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

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

相关文章

深入解析OSI七层协议:实现网络通信的基石

目录 引言&#xff1a;详细介绍1. 物理层&#xff08;Physical Layer&#xff09;2. 数据链路层&#xff08;Data Link Layer&#xff09;3. 网络层&#xff08;Network Layer&#xff09;4. 传输层&#xff08;Transport Layer&#xff09;5. 会话层&#xff08;Session Layer…

【章节1】git commit规范 + husky + lint-staged实现commit的时候格式化代码

创建项目我们不多说&#xff0c;可以选择默认的&#xff0c;也可以用你们现有的项目。 前言&#xff1a; git commit 的时候总有人填写一堆花里胡哨乱写的内容&#xff0c;甚至看了commit 的描述都不知道他这次提交到底做了个啥&#xff0c;那我们有没有办法规范大家的commit提…

chatgpt赋能python:Python中的绝对值函数:abs()

Python中的绝对值函数&#xff1a;abs() 在Python中&#xff0c;绝对值函数可以用来计算一个数的绝对值。这个函数名为abs()&#xff0c;它的语法为&#xff1a; abs(x)其中x为需要计算绝对值的数字。 abs()的用法 abs()函数可以计算传入参数的绝对值&#xff0c;并返回一个…

JavaScript实现使用js外链的方式输出一个5行6列的长方形的代码

以下为实现使用js外链的方式输出一个5行6列的长方形的程序代码和运行截图 目录 前言 一、使用js外链的方式输出一个5行6列的长方形&#xff08;HTML部分&#xff09; 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 二、使用js外链的方式输出一个5行6列的长方形&…

Solidity基础七

无论风暴将我带到什么岸边&#xff0c;我都将以主人的身份上岸 目录 一、Solidity的单位 1. 货币Ether 2. 时间单位Time 二、地址的形成 三、以太坊的账户 1.内部账户&#xff08;简称CA&#xff09; 2.外部账户&#xff08;简称EOA&#xff09; 3.内部账户和外部账户…

dom中的事件处理

事件参考 | MDN (mozilla.org) 什么是事件 事件监听方式 直接在html中编写JavaScript代码(了解) <button οnclick"console.log(按钮1发生了点击~);">按钮1</button> DOM属性&#xff0c;通过元素的on.....来监听事件 // 2.onclick属性// function h…

如何在华为OD机试中获得满分?Java实现【任务总执行时长】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

Visual Studio2022编译器实用调试技巧

目录 1.什么是bug 2.调试是什么&#xff1f; 3.debug和release的介绍 4.windows环境调试介绍 4.1 调试环境的准备 4.2 学会快捷键 4.3 调试的时候查看程序当前信息 4.4 查看内存信息 5.如果写出好&#xff08;易于调试&#xff09;的代码 7.编程常见的错误 1.什么是b…

android MutableLiveData与AndroidViewModel避坑小提示,Java

android MutableLiveData与AndroidViewModel避坑小提示&#xff0c;Java import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LifecycleOwner; import androidx.l…

Tomcat部署项目后,验证码不显示问题

在使用Tomcat服务器部署项目后&#xff0c;发现验证码不显示&#xff0c;在浏览器按f12查询后出现以下页面 查看源码发现一切正常 查阅相关资料后&#xff0c;得到以下方法&#xff1a; 1.在tomcat配置文件catalina.sh文件中找到-Djava.io.tmpdir"$CATALINA_TMPDIR" …

day38|动态规划-爬楼梯问题

DP问题类型&#xff1a; 动态规划比较重要的是找到前后两个状态之间的联系&#xff0c;在向后遍历的过程中注意遍历的顺序和初始化操作。 动归基础类问题 背包问题 打家劫舍 股票问题 子序列问题 DP问题的一些注意事项&#xff1a; 动态规划类的问题代码都是比较简洁的&…

数据结构之排序专题 —— 快速排序原理以及改进方法(添加随机,三路快排)

内容概述 尽管此类博客已经非常非常多&#xff0c;而且也有很多写得很好&#xff0c;但还是想记录一下&#xff0c;用最容易理解的方式&#xff0c;并且多补充了一些例子。 整理云盘的时候发现大一时候的笔记&#xff0c;用的是 txt 文本文件记录的&#xff0c;格式之丑陋可想…

SAP-MM-采购申请审批那些事!

1、ME55不能审批删除行项目的PR 采购申请审批可以设置行项目审批或抬头审批。如果设置为抬头审批时&#xff0c;ME55集中审批时&#xff0c;就会发现有些采购申请时不能审批的&#xff0c; 那么这些采购申请时真的不需要审批么&#xff1f;不是的&#xff0c;经过核对这些采购申…

solr快速上手:managed-schema标签详解(三)

0. 引言 core核心是solr中的重中之重&#xff0c;类似数据库中的表&#xff0c;在搜索引擎中也叫做索引&#xff0c;在solr中索引的建立&#xff0c;要先创建基础的数据结构&#xff0c;即schema的相关配置&#xff0c;今天继续来学习solr的核心知识&#xff1a; solr快速上手…

chatgpt赋能python:Python绑定CPU:提高性能的利器

Python 绑定 CPU&#xff1a;提高性能的利器 介绍 Python 作为一门通用编程语言&#xff0c;具有易学易用、开发效率高等优点&#xff0c;但由于其解释型的特性&#xff0c;执行效率相对较低&#xff0c;尤其是在处理大量计算时&#xff0c;性能瓶颈更为明显。在这种情况下&a…

chatgpt赋能python:用Python发送短信的简单方法

用Python发送短信的简单方法 在今天的数字时代&#xff0c;没有任何事情比即时通讯更方便。然而&#xff0c;短信仍然是一种极为有用的通信方式。 实际上&#xff0c;正如您所看到的&#xff0c;本文将告诉您如何使用Python在几步内轻松地发送短信。 发送短信的三种方法 要发…

Unity之TileMap

1、创建瓦片资源 教程中老师在Asset---Create---Tile创建&#xff0c;但是新版本Unity不能这样创建 新版本是在Asset---Create---2D--Tile里面选择&#xff0c;跟老师的不太一样&#xff0c;暂时也不懂怎么解决 所以我们可以用方法二创建&#xff1a; 在Window---2D---Tile…

Linux---phy外设调试(二)

文章目录 一、mdio与rmii/sgmii二、主控mac控制器配置三、phy driver与device的匹配规则 一、mdio与rmii/sgmii 接上一篇文章《Linux—phy外设调试&#xff08;一&#xff09;》&#xff0c;在上一篇中我们说到我们还遗留了几个问题没有解释&#xff0c;其中提到的有mdio总线和…

海量数据中找出前k大数(topk问题),一篇文章教会你

&#x1f4af; 博客内容&#xff1a;【数据结构】向上调整建堆和向下调整建堆的天壤之别以及堆排序算法 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&…

[极客大挑战 2019]PHP1

既然提到了备份网站估计也是存在着网站备份文件&#xff0c;可以先用御剑扫一下 啥都没扫出来&#xff0c;但是上回做文件备份的题目时收集了一些关于常用备份文件的文件名和后缀&#xff0c;可以直接使用burp抓包爆破&#xff0c;果然爆破出一个www.zip文件 访问下载好文件就有…