类和对象(一)

时间:2024-01-10 01:04:53 标签:  c++  c++  链表  算法  

类和对象(一)

C++并不是纯面向对象语言

C++是面向过程和面向对象语言的!

面向过程和面向对象初步认识:

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-60IFJyhm-1678444628031)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307145914432.png)]在这里插入图片描述
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-57EYvJu6-1678444628033)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307150028122.png)]

//C++兼容C兼容C结构体用法
typedef struct list {
	int data;
	struct list* next;
}Li;
//C++中会把C中的结构体升级为类
struct listnode {
	int data;
	listnode* next;
};//这里不需要重命名变量名称,直接可以使用

C++中(.cpp文件),next可以直接用listnode来命名,而C语言中(.c文件),next不可以直接listnodei*来命名。

类中不止可以放变量名,还可以存放函数。

struct listnode {
	void Init(int n)
	{
		data = n;
		next = NULL;
	}
	int data;
	listnode* next;
};
int main()
{
	//类和对象
	listnode* l;
	l->Init(5);
	return 0;
}

上面结构体的定义,在C++中更喜欢用class来代替。

类的定义:

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分
号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者
成员函数。

类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqGXoQ7n-1678444628034)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307184158337.png)]

访问限定符:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FRBL1zTr-1678444628034)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307153023041.png)]

访问限定符分为三种:public、protected、private

【访问限定符说明】

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)
    注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
class stack
{
public:
	int a;
	int c;
protected:
	char b;
private:
	double f;
};

我们是否可以在类外访问private类型参数?

不可以,因为这里是私有,所以会报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfiTuZkR-1678444628034)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307154945936.png)]

C++中struct和class的区别是什么?

struct定义类默认访问限定符为public

解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别,后序给大
家介绍。

class Date
{
public:
	void Init(int year, int month, int day)
	{
		year = year;
	}
private:
	int year;
	int month;
	int day;
};
int main()
{
	///编译不会出错,但是并不会赋值
	Date d1;
	d1.Init(2023, 3, 7);
	return 0;
}

当成员变量与类中函数参数名相同时,是否会报错?

这里函数参数和成员变量相同,因为局部变量优先,因此不会初始化。-

因此我们如果遇到相同的变量名,我们会在其中一个变量名前面加一个_

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KMGRbypo-1678444628035)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307153836285.png)]

this指针:

当定义了两个对象d1,d2,我们的成员函数Init怎么知道我们定义的是哪个对象呢?

class Date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	Date d2;
	d1.Init(2023, 2, 3);
	d2.Init(2023, 2, 3);
	return 0;
}

编译器会悄悄地帮你多加一个参数来实现区分

通过this这个关键字来实现,这是编译器默认加,我们并不允许在参数or调用时主动加这个东西

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fjiBkp8z-1678444628035)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307161709745.png)]

this指针存在哪里?

并不是存在对象里面,存在栈上,因为它是隐含的形参

vs下面是通过ecx寄存器

this空指针问题:

下面这两句的运行结果

Date* ptr = nullptr;
	ptr->func();//正常运行
	//func和init不在对象里面,而是call到公共区域(代码段)找
	//会不会报错取决于需不需要去变量里面找,而不是解引用符号
	ptr->Init(2022, 2, 2);//崩溃

func和init不在对象里面,而是call到公共区域(代码段)找
会不会报错取决于需不需要去变量里面找,而不是解引用符号

(*ptr).func();//正常运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HzLrlYRx-1678444628035)(C:\Users\小卢\AppData\Roaming\Typora\typora-user-images\image-20230307170633704.png)]

类的内存大小:

类的内存大小如何算呢?

类的内存大小可以参考C语言中结构体的计算方法。

class Date
{
public:
	void Init(int year, int month, int day)
	{
		year = year;
	}
private:
	int year;
	int month;
	int day;
};
int main()
{
	//类和对象
	Date d1;
	Date d2;
	cout<< sizeof(d1) << endl;//12
	return 0;
	}

为什么成员变量在对象中,成员函数不在对象中呢?

每个对象成员变量是不一样的,需要独立存储
每个对象调用成员函数是一样的,放到共享区域(代码段)

int main()
{
	//类和对象
	Date d1;
	Date d2;
	cout<< sizeof(d1) << endl;//12
	//为什么成员变量在对象中,成员函数不在对象中呢?
	//每个对象成员变量是不一样的,需要独立存储
	//每个对象调用成员函数是一样的,放到共享区域(代码段)
	d1.Init(2023, 3, 7);
	d2.Init(2022, 2, 2);
	return 0;
}

因此我们计算类的大小,就需要计算变量的内存大小,不用考虑成员函数,因此跟结构体的算法一样的

Date d1;
Date d2;
cout<< sizeof(d1) << endl;//12
//为什么成员变量在对象中,成员函数不在对象中呢?
//每个对象成员变量是不一样的,需要独立存储
//每个对象调用成员函数是一样的,放到共享区域(代码段)
d1.Init(2023, 3, 7);
d2.Init(2022, 2, 2);
return 0;

}


因此我们计算类的大小,就需要计算变量的内存大小,不用考虑成员函数,因此跟结构体的算法一样的

来源:https://blоg.сsdn.nеt/m0_69061857/аrtiсlе/dеtаils/129449480

智能推荐

标签:c++  c++  链表  算法  

一、面向对象的初步认知 1.1 什么是面向对象 Java是一

标签:javaSE  java  开发语言  

前言 我们前面已经介绍过了C&#43;&#43;类和对象的入门知识&#xff0c

标签:C++初阶之路  c++  开发语言  

一、问题引入区分面向过程编程和面向对象编程的最大的特性就是 类,类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。那么如何声明类、定义类、调用类?以 C++ Primer Plus:中文版 (第六版) 的股票类举例说明。二、解决过程2-1 类抽象股票类的抽象化获得股票增持股票

标签:对象  

1.类的初始化方法&#xff1a;必须以init开头&#xff0c;返回值为id o

标签:Swift  ios  开发语言  

C++ 类:实体的抽象类型实体(属性,行为) ->ADT(abstract data type)类(属性->成员变量,行为->成员方法)OOP语言4大特征抽象 封装/隐藏(通过public private protected) 继承 多态class Student{//属性一般都是私有的成员变量private: char NAME[20]; int age;//提供给外部的公有方法public: //在类体内实现方法,自动实现成内联方法 void setAge(int _age){ this.age=_age;

标签:指针  对象  lt  gt  

Servlet几个重要的类的关系图

标签:大数据  

类和对象拷贝构造函数的

标签:学习  笔记  

在 Java 中,类和对象是面向对象编程的基本构建块。类是一种模板,用于定义对象的属性和行为。对象是类的实例,具有类定义的属性和行为。2.1.1. 类的定义要定义一个类,可以使用以下语法:class ClassName { // 成员变量(属性) // 成员方法(行为)}类的名称应遵循驼峰命名法,首字母大写。类可以包含成员变量(属性)和成员方法(行为)。示例1:定义一个简单的类

标签:对象  

一、C++ 类 & 对象C++ 类定义定义一个类需要使用关键字 class,然后指定类的名称,并类的主体是包含在一对花括号中,主体包含类的成员变量和成员函数。定义一个类,本质上是定义一个数据类型的蓝图,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。关键字 public 确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。您也可以指定类的成员为 private 或 protected,这个我们稍后会进行讲解。定义 C++ 对象

标签:对象  amp  

猜你喜欢

Python 是一种面向对象的编程语言。在 Python 中,几乎所有东西都是对象,都具有其属性和方法。类似于对象构造函数或用于创建对象的“蓝图”的类。创建一个类要创建一个类,请使用关键字 class:示例,创建一个名为 MyClass 的类,其中包含一个名为 x 的属性:class MyClass: x = 5创建对象现在,我们可以使用名为 MyClass 的类来创建对象:

标签:初始化  面向对象  详解  对象  方法  

1.对象创建流程是怎样的?有哪些步骤,分别有什么作用?对象创建流程示意图        jvm创建对象主要经过类加载检查、分配内存、初始化、设置对象头、执行初始化方法这几个阶段,下面将逐步解析每一步的含义。类加载检查

标签:加载  对象  过程  JVM加载  对象  过程  jvm  

1、类与对象

标签:c++  c++  

1. SDS:简单动态字符串(simple dynamic string)Redis没有直接使用C语言的字符串,而是自己构建了一种名为简单动态字符串类型,并将SDS用作Redis的默认字符串。SDS的定义struct sdshdr { // buf 中已占用空间的长度 int len; // buf 中剩余可用空间的长度 int free; // 字节数组 char buf[];};SDS与C字符串的区别SDS获取字符串长度复杂度为O

标签:数据结构  对象  redis  

目录引言类 & 对象类的成员A)成员访问权限B)成员变量i. autoii. decltypeC)成员函数补充知识1. 内联函数2. 函数重载3. this 指针引言面向对象程序设计(OOP),最核心的概念就是 “对象” 。

标签:对象  OOP  

一、摘要1.阅读该篇,需要对runtime底层及类对象数据结构有一定了解,本篇仅着重讲解方法缓存的算法;2.以下以类对象来论述,元类对象以此类推;&nbsp;二、类对象数据结构//rumtime源码&nbsp;&nbsp;//小码哥图片

标签:缓存  原理  对象  方法  

3.类和对象3.1面向对象这里顺带提一句学习JAVA时,老师说的面向对象和面向过程的区别:面向过程:强调做什么事情,具体什么步骤。举个把大象放进冰箱的例子:打开冰箱门把大象放进冰箱关上冰箱门面向对象:强调的是做动作的主体(称之为对象)冰箱:打开操作冰箱:放的操作(放的可以是大象也可以是老鼠)冰箱

标签:第二章  学习笔记  对象  JS  

Redis核心对象-redisObject在Redis中有一个核心对象叫做redisObject,是用来表示所有的key和value的,用redisObject结构体来表示String、Hash、List、Set、Zset五种数据类型redisObject的源代码在redis.sh中,使用C语言编写数据类型(type)编码方式(encoding)数据指针(ptr)虚拟内存(vm)其他信息

标签:数据类型  对象  核心  redis  

介绍  在本文中,我试图以最简洁的方式来阐明JavaScript编程原理中对象类型赋值和原生类型赋值之间的区别,以及它们各自是如何工作的。这也是我希望在我的JavaScript编程生涯早期就已经理解的东西。JS中的原生类型和对象类型  首先,让我们回顾一下JavaScript中不同的原生类型和对象类型。  原生类型:Boolean,Null,Undefined,Number,BigInt(可能不常见),String,Symbol(可能不常见)。  对象类型:Object,Array,Date,以及许多其它类型。原生类型赋值和对象类

标签:赋值  类型  基本原理  对象  JS  

【文字内容源于《疯狂Kotlin讲义》&#xff0c;代码内容原创】

标签:Kotlin学习  Kotlin  开发语言  android  

在flask中&#xff0c;框架会自动将字符串等类型转化为字节&#xff0c;但是在我们直接运行自

标签:flask  python  后端  

前言之前说了类加载的过程,但是有的读者表示还是有些知识点没弄清楚,相关面试题也不能思考出结果,所以今天就来总结下类加载、对象实例化方面的知识点/面试题,帮助大家加深印象。全是干货,一网打尽类的基础知识!先看看下面的问题都能回答上来吗?描述new一个对象的过程,并结合例子说明。类初始化的触发时机。多线程进行类的初始化会出问题吗?类的实例化触发时机。<clinit>()方法和<init>()方法区别。

标签:知识点  实例  加载  对象  

相关问题

相关文章

热门文章

推荐文章

相关标签