【C++入门第四期】类和对象 ( 上 )

这篇具有很好参考价值的文章主要介绍了【C++入门第四期】类和对象 ( 上 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

C++是面向对象的语言,面向对象的三大特性:继承 ,封装 ,多态。但由于是入门文章,一开始就说把这些解释清楚未免太难为大家了。
【C++入门第四期】类和对象 ( 上 )

大家先把类理解为:功能接口及数据包,需要那个功能直接调用其接口即可获得结果

使用接口时可以不知道的的具体实现,我们只需知道他的功能即可

类的使用

先别管实现,咱先看看猪跑(类的使用)

#include<iostream>
#include<string.h>

struct student//学生类
{
	student(const char* number ,const char* name)
	{
		strcpy(_number, number);
		strcpy(_name, name);
	}
	void print()
	{
		printf("姓名:%s  学号:%s\n", _name, _number);
	}
	char* number()
	{
		return _number;
	}
	char* name()
	{
		return _name;
	}
	char _number[15];
	char _name[15];
};
int main()
{
//类型为student ,对象名为zhang_san,()中是传参
	student zhang_san("20013", "张三");
	student li_si("20015", "李四");

	zhang_san.print();// .直接调用print接口即可
	//获取li_si对象中的_name变量中的数据
	std::cout << li_si._name << std::endl;
}

如上我定义了 student 类,里面有打印出学生信息的功能,及学生学号(_number)学生姓名(_name)

使用时我们只需定义 student对象即可使用 student 中的功能 , 及获取类中的变量数据
【C++入门第四期】类和对象 ( 上 )
但是上面结构体的定义,在C++中更喜欢用class来代替

类的定义

class className
{
	//类体:由成员变量和成员函数组成

};  //注意后面要加分号结束

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分
号不能省略。

类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

类的两种定义方式:

  1. 成员函数声明和定义全部放在类体中
    需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
    【C++入门第四期】类和对象 ( 上 )
    2. 类声明放在.h文件中,成员函数定义放在.cpp文件中

    注意:成员函数名定义前需要加类名:: ,表示该函数属于该类
    【C++入门第四期】类和对象 ( 上 )
    一般情况下,更期望采用第二种方式

成员变量名的定义建议

【C++入门第四期】类和对象 ( 上 )

类的访问限定符

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,并通过访问权限选择性的将其接口提供给外部的用户使用

【C++入门第四期】类和对象 ( 上 )
访问限定符说明

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的),等写继承的时候再说这俩有啥区别,说太多怕大家迷糊

访问权限作用域

  1. 从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  2. 如果后面没有访问限定符,作用域就到 } 即类结束
    【C++入门第四期】类和对象 ( 上 )
    如果类中没有写访问限定符
    class的默认访问权限为private,struct为public(因为struct要兼容C)

类的作用域

由于类创建了作用域,类的所有成员都在类的作用域中。在类体外定义类的成员时,需要使用 ::
作用域操作符指明成员属于哪个类域

void car::print()//car::声明print()属于类car这个作用域
{
	cout << _name << _price << endl;
}
class car
{
public:
	void print();//声明
private:
	char _name[20] ;//车名
	char _price[20];//价格
};

类的实列化

类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
有分配实际的内存空间来存储它;比如:4s店车入库时填写的表格,表格就可以看成是一个类,来描述车辆信息。

打个比方:类就像是建筑设计图(图只是一个构想或一个计划是虚拟的),并且我们可以用该图纸建造出多个一样实际的建筑。

类也一样在没生成对象前,他的功能是无法使用的,需要实列化出对象才行。

如下图,类需要定义出对象才能使用,用类类型创建对象的过程,称为类的实例化

class car
{
public:
	void print();

	char _name[20] ;//车名
	char _price[20];//价格
};
void car::print()//car::声明print()属于类car
{
	cout << "车名:" << _name << " 价格:" << _price << endl;
}
int main()
{
	//car.print();//会报错,类是不能直接使用的
	
	//正确方法
	car Byd_q;//定义出对象Byd_q 
	strcpy(Byd_q._name, "比亚迪秦");//向对象中写入数据
	strcpy(Byd_q._price, "99800");//向对象中写入数据
	Byd_q.print();//调用对象的成员含函数
}

如何定义对象

类名 对象名;

如何计算类的大小

class A1
{
public:
	void fun()
	{
		cout << "zhu_ge_bin";
	}
	int _a;
};
class A2
{
public:
	int _a;
};
class A3
{
public:

};
int main()
{
	A1 d1;
	A2 d2;
	A3 d3;
	printf("A1对象的大小为:%d\n", sizeof(d1));
	printf("A2对象的大小为:%d\n", sizeof(d2));
	printf("A3对象的大小为:%d\n", sizeof(d3));
}

如上图运行结果为
【C++入门第四期】类和对象 ( 上 )
可以看出一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐

注意:空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象

这里可能有人要问了那类中的函数不占空间吗?

1:每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间。(后面还会学虚基类指针和虚函数指针也属于数据部分现在可以暂时不用管)
2:类的成员函数本身不占用对象的内存空间。它们只是类的一部分,存储在代码段中。
3:因此,不同对象共享相同的函数代码,从而节省了内存空间。

结构体内存对齐规则

结构体内存对齐规则

  1. 第一个成员在结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    注意:对齐数 = 编译器默认的对齐数 与 该成员大小两者之间的较小值,VS中默认的对齐数为8
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
    体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

this指针

首先看以下代码,并运行

class car
{
public:
	void print()
	{
		cout << "车名:" << _name << " 价格:" << _price << endl;
	}
	void Init(const char* name , const char* price)
	{
		strcpy(_name , name);//写入数据
		strcpy(_price , price);//写入数据
	}
private:
	char _name[20];//车名
	char _price[20];//价格
};
void test4()
{
	car Byd_q;//定义出对象Byd_q
	car Byd_s;//定义出对象Byd_s
	Byd_q.Init("比亚迪 秦" , "99800");//向对象中写入数据
	Byd_s.Init("比亚迪 宋" , "154800");//向对象中写入数据

	Byd_q.print();//调用对象的打印函数
	Byd_s.print();//调用对象的打印函数
}

结果如下
【C++入门第四期】类和对象 ( 上 )
上面说了对象只有数据,而类的函数是共用的。那为啥类的不同对象调用同一个函数会有不一样的结果(注意:要保证对象中的数据不一样)

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏
的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”
的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编
译器自动完成。
上述代码调用成员函数传参时,看似只传入了一些基本数据,实际上还传入了指向该对象的指针:
【C++入门第四期】类和对象 ( 上 )文章来源地址https://www.toymoban.com/news/detail-431732.html

this指针的特性

  1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  2. 只能在“成员函数”的内部使用
  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给
    this形参。所以对象中不存储this指针。
  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
    递,不需要用户传递

到了这里,关于【C++入门第四期】类和对象 ( 上 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++入门:初识类和对象

    auto是C++11中定义的,所以一些版本较低的编译器可能无法识别auto,比如DevC++,我们来看一下这个的用处。 1.1类型别名思考 我们作为后面接触的程序会越来越复杂,类型也会越来越多,这样也导致很容易就会出现错误,会出现以下问题: 1.类型难以拼写,

    2024年01月22日
    浏览(42)
  • C++入门: 类和对象笔记总结(上)

     C语言是 面向过程 的, 关注 的是 过程 ,分析出求解问题的步骤,通过函数调用逐步解决问题。  C++是基于 面向对象 的, 关注 的是 对象 ,将一件事情拆分成不同的对象,靠对象之间的交互完成。   C语言结构体中只能定义变量,在C++中,结构体升级成类内不仅可以定

    2024年02月07日
    浏览(41)
  • 【C++入门到精通】C++入门 —— 类和对象(构造函数、析构函数)

    目录 一、类的6个默认成员函数  二、构造函数 ⭕构造函数概念 ⭕构造函数的特点 ⭕常见构造函数的几种类型 三、析构函数      ⭕析构函数概念     ⭕析构函数的特点 ⭕常见析构函数的几种类型 四、温馨提示          这一篇文章是上一篇的续集(这里有上篇链接)

    2024年02月15日
    浏览(50)
  • C++从入门到精通——类和对象(中篇)

    如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。 对于以下的日期类: 运行结果: 对于Date类,可以通过SetDate公有的方法给对象设置内容,但是如果每次创建对象都调用该方

    2024年04月12日
    浏览(35)
  • 【C++入门到精通】C++入门 —— 类和对象(初始化列表、Static成员、友元、内部类、匿名对象)

    目录 一、初始化列表 ⭕初始化列表概念 ⭕初始化列表的优点 ⭕使用场景 ⭕explicit 二、Static成员 ⭕Static成员概念 🔴静态数据成员: 🔴静态函数成员: ⭕使用静态成员的优点 ⭕使用静态成员的注意事项 三、友元 ⭕友元的概念 ⭕类友元 ⭕函数友元  四、内部类 ⭕

    2024年02月14日
    浏览(45)
  • 【大虾送书第四期】《Python之光:Python编程入门与实战》

    目录 ✨写在前面 ✨本书亮点 ✨强力推荐 ✨文末福利       🦐博客主页:大虾好吃吗的博客      🦐专栏地址:免费送书活动专栏地址         作为一种极其流行的编程语言,Python已经成为了当今最为重要的生产力工具之一。无论小学生还是各行各业的从业人员,都

    2024年02月15日
    浏览(57)
  • 一文带你入门C++类和对象【十万字详解,一篇足够了】

    本文字数较多,建议电脑端访问。不多废话,正文开始 从本文开始,我们就要正式来学习C++中的类和对象了,本文我将带你一步步 从C语言的结构体 struct 到C++的类 class ,真正搞懂有关C++的 面向对象的三大特征之一 —— 封装 作为读者,可能你正在学习C语言,亦或者已经开

    2024年02月05日
    浏览(47)
  • 从基础入门到学穿C++(类和对象篇)【超详细】【一站式速通】

    C语言是一种面向过程的语言,C++和python、java一样都是一种面向对象的语言。 面向对象编程(Object-Oriented Programming,OOP)和面向过程编程(Procedural Programming)是两种不同的编程范式 面向对象编程 :强调的是将现实世界中的事物抽象成对象,并通过对象之间的交互来实现程序

    2024年04月09日
    浏览(38)
  • 【C++成长记】C++入门 | 类和对象(上) |类的作用域、类的实例化、类的对象大小的计算、类成员函数的this指针

    🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、类的作用域  二、类的实例化 三、类对象模型  四、this指针 1、this指针的引出  2 this指针的特性 类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定

    2024年04月15日
    浏览(44)
  • HarmonyOS云开发基础认证题目记录——包括第一期:Serverless基础、第二期:快速构建用户认证系统、第三期:云函数入门指南、第四期:云数据库入门指南、第五期:云存储入门指南。

    1. 【判断题】  应用架构的演进依次经历了微服务架构、单体架构、Serverless架构等阶段。 错误 2. 【判断题】  认证服务手机号码登录需要填写国家码。 正确 3. 【判断题】  认证服务在绑定微信账号后就不能再绑定QQ账号了。 错误 4. 【判断题】  云函数可以根据函数的实际

    2024年02月05日
    浏览(101)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包