[C++]——带你学习类和对象

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

目录:

类和对象是很重要的知识点,对于初学者也不容易理解。希望大家多学几遍,搞懂内容,在进一步学习下一步的内容,学习c++就得一步一步来,打好基础,稳定向前。

一、面向过程和面向对象

C语言是面向过程的,关注的是过程,分析求出解决问题的步骤,通过函数调用逐步解决问题。
c++是面向对象的,关注的是对象,将一件事情拆分为不同的对象,靠对象之间交互完成。

二、类的概念

1.类的引用

1.c++兼容c结构体的用法
2.c++把结构体升级成了类,类名就是类型(可以用class代替)。
3.类是一个整体,有成员变量和成员函数,并且位置任意。
4.struct默认公有,class默认私有。
5.类是一个整体,不需要定义在前面或者后面。

2.类的定义

class为定义类的关键字Classname为类的名字,{}中为类的主体注意类定义后面分号不能省略
类主体的内容称为类的成员:类中的变量叫成员变量,函数称为成员函数

类的两种定义方法:
1.声明和定义全部在类体中。

#include <iostream>
using namespace std;
class PerSon
{
public://公有得
    //成员函数:
    void person()
    {
        cout << "姓名:p" << endl;
    }
private://私有得
   // 成员变量:
    char* _name;//姓名
    char* _sex;//性别
    int _age;//年龄
};

2.类声明放在.h文件中,成员函数定义在cpp文件中,成员函数名前需要加类名::。
类声明和定义分离:
[C++]——带你学习类和对象,c++,c++,学习,面试
[C++]——带你学习类和对象,c++,c++,学习,面试
注意:
1.默认在类里面定义的函数,为内联函数(inline),这个由编译器决定是不是内联。
2.正确的用法;长的函数声明和定义分离,短小的函数可以直接在类里面定义(编译器决定内联函数)。

三、类的访问限定符和封装

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

3.1 访问限定符

[C++]——带你学习类和对象,c++,c++,学习,面试
[访问限定符说明]:

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到}即类结束。
  5. class的默认访问权限为private, struct为public(因为struct要兼容C)
    注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
    [面试题]:
    问题: C++中struct和class的区别是什么?
    解答: C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一 样的,区别是struct定义的类默认访问权限是public, class定义的类默认访问权限是private。 注意:在继承和模板参数列表位置,struct和class也有区别。

3.2 封装

面向对象的三大特征:封装、继承、多态
封装本质上是一种管理,让用户更方便使用类。
**封装:**将数据和操作数据的方法进行有机结合,通过访问限定符隐藏对象的属性和实现细节,仅使用对外公开的接口来和对象进行交互。

四、类的作用域

**类定义了新的作用域,**类的所有成员都在作用域中。在类外定义成员时,需要用到::作用域操作符指明成员属于哪个类域。
[C++]——带你学习类和对象,c++,c++,学习,面试

五、类的实例化

用类类型创建对象的过程,称为类的实例化

  1. 类是对对象进行描述的,相当于一个模型成员变量是声明,限定了类有哪些成员,定义一个类并没有给它分配实际的内存空间来存储它。
    2.一个类可以实例化出多个对象,实例化出的对象,占用实际的物理空间,存储了类的成员变量。
    3.类只是一个设计,实例化出的对象才能存储数据,占用物理空间。
    [C++]——带你学习类和对象,c++,c++,学习,面试
    [C++]——带你学习类和对象,c++,c++,学习,面试

分析如下:
[C++]——带你学习类和对象,c++,c++,学习,面试
[C++]——带你学习类和对象,c++,c++,学习,面试
总结:不同对象,成员函数调用的地址一样(数据不存对象里),成员变量存数据不一样(存在各自的对象里)

六、类的对象大小的计算

1.类对象的存储方式
类中既可以有成员变量,也可以有成员函数。(类里面只存成员变量,不存成员函数)
为什么成员变量在对象中,成员函数不在对象中?
一个类分为成员变量和成员函数,类的大小是由成员变量来决定得。这是因为每个对象的成员变量是不一样得,需要独立存储,而每个对象调用成员函数是一样的,都是放在共享公共区域(代码段)里。

2.类的大小计算
一个类的大小,实际上是该类“成员变量”之和,要注意内存对齐,要注意空类的大小,空类比较特殊,编译器给空类一个字节用来唯一标识这个类的对象(这个1byte不存储有效数据,是用来占位得,占位的意思是标识这个对象被实例化出来了)。

#include <iostream>
using namespace std;
//即有成员变量,又有成员函数
class A1
{
public:
    void f1()
    {};
private:
    int a;
    char b;
    short c;
};
//只有成员变量
class A2
{
private:
    int a;
    char b;
    short c;
};
//只有成员函数
class A3
{
public:
    void f1()
    {};
};
//没有成员函数,也没有成员变量
class A4
{
    //空
};
int main()
{
    cout << sizeof(A1) << endl;
    cout << sizeof(A2) << endl;
    cout << sizeof(A3) << endl;
    cout << sizeof(A4) << endl;
    return 0;
}

[C++]——带你学习类和对象,c++,c++,学习,面试
结构体的内存对齐规则

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

七、类成员函数this指针

this指针可以用来确定不同对象的成员函数,每个成员都有隐形的指针。

7.1 this指针的引用

[C++]——带你学习类和对象,c++,c++,学习,面试

C++中通过引入this指针解决了不同对象相同类调用成员函数(对象如何找到自己的成员函数)的问题:

C++编译器给每个“非静态的成员函数"增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中对所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

7.2 this 指针的特性

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

扩展:

#include <iostream>
using namespace std;
class A
{
public://公有
   void Print()
   {
       cout << "Print()" << endl;
   }
   private://私有
   int _a;

};
int main()
{
   A* s1=nullptr;
   s1->Print();
   return 0;
}

[C++]——带你学习类和对象,c++,c++,学习,面试

#include <iostream>
using namespace std;
class A
{
public://公有
    void Print()
    {
        cout <<this-> _a << endl;
    }
private://私有
    int _a;

};
int main()
{
    A* s1 = nullptr;
    s1->Print();
    return 0;
}

[C++]——带你学习类和对象,c++,c++,学习,面试
仔细观察这两段代码,第一个正常运行,第二个运行崩溃。
1.this指针存在哪里?

this指针是个形参,是存在栈帧上面得,是隐含形参。(VS编译环境下,this指针存在函数栈帧中的寄存器里)

2.this指针可以为空吗?

在特定条件下可以为空, 成员函数地址不在对象里,成员变量在对象里,对象为空,只调用成员函数,且不需要用到隐含this指针时,就能正常运行。

补充:
c语言和c++的使用特点:

C语言:结构体中只能定义存放数据的结构,操作数据的方法不能放在结构体中,数据和操作数据的方法是分离开的,实现上相当复杂,涉及大量指针操作,很容易出错。
c++:c++通过类可以将数据以及操作数据的使用方法进行完美结合,通过权限访问可以控制这些方法在类外可以被调用,这就是封装。
c++中Stack* 参数是编译器维护,C语言中需要用户自己维护。
总结:

C语言:1.数据和方法是分离的。 2数据访问控制是自由的,不受限制。
c++:1.数据和方法都封装到类里面。2.控制访问方式。愿意给你访问就是公有,不愿意给你访问就是私有。
C语言和c++的底层都在代码段里,区别就是对数据的管理不同。文章来源地址https://www.toymoban.com/news/detail-718265.html

到了这里,关于[C++]——带你学习类和对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 详解C++类&对象(上篇),带你走进C++

    目录 一,面向对象面向过程的认识(简单了解即可,逐步认识) 二, 类 2.1 类的引入  2.2 类的定义 1. struct  2. class  类的两种定义方式: 2.3 封装类的访问限定符  1. 封装概念 2. 类的访问限定符  2. 4 类的作用域 2. 5 类对象模型 1. 计算类大小 2. 类对象的存储方式 2.6  结构体

    2024年02月05日
    浏览(27)
  • 【JAVASE】带你了解面向对象三大特性之一(多态)

    ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:再无B~U~G-CSDN博客 多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状 态。 总的来说:同一件事情,发生在不同对象

    2024年04月14日
    浏览(46)
  • Python——狂肝两万字带你学会【类与对象】

    目录 01-初始对象 生活中的数据组织 程序中的数据组织​ 使用对象组织数据 总结01 02-类的成员方法 类的定义和使用 成员变量和成员方法  成员方法的定义语法  注意事项 成员方法——代码演示  总结02 03-类和对象 现实世界的事物和类 类和对象 使用类和对象描述现实事物

    2024年02月02日
    浏览(56)
  • 【手把手带你学JavaSE】第六篇:类和对象

    对了!给大家推荐一个刷题学习、面试神器——牛客网 里面有非常多的题库,跟面试经验~非常的良心!! 什么是类? 什么是对象? 怎么去理解这两个抽象的概念呢? Java是一门纯面向对象的语言(Object Oriented Program,继承OOP),在面向对象的世界里,一切皆为对象。 面向对象

    2023年04月20日
    浏览(37)
  • 【JAVA杂货铺】一文带你走进面向对象编程的构造方法 | Java| 面向对象编程 | (中)

    🌈个人主页:  Aileen_0v0 🔥系列专栏: Java学习系列专栏 💫个人格言: \\\"没有罗马,那就自己创造罗马~\\\"   目录 回顾  构造方法  this 面试题 构造方法的类型  下节预告 代码块  之前我们学习了什么是类  什么是对象  什么是面向对象编程 定义类   构造方法 :它的方法名

    2024年02月05日
    浏览(40)
  • 带你了解SpringBoot支持的复杂参数--自定义对象参数-自动封装

    😀前言 本篇博文是关于SpringBoot 在响应客户端请求时支持的复杂参数和自定义对象参数,希望您能够喜欢😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,

    2024年02月12日
    浏览(24)
  • 打破传统AI面试的束缚,L5级别AIGC面试官带你进入招聘新纪元

    传统AI面试已死,L5级别AIGC面试官已成 传统AI面试存在以下三大问题难以解决: 1. 题目泄漏:由于传统AI面试题目较为固定,一些面试培训机构和已参加AI面试的候选人在网络平台传播题目,导致部分候选人获得不公平的准备机会。 2.无法追问:受算法能力限制,在传统AI面试

    2024年02月09日
    浏览(30)
  • 【C++】类和对象(中)一篇文章带你学会六大默认成员函数

    如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 对于下面的date类: 对于Date类,可以通过

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

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

    2024年02月05日
    浏览(36)
  • 史上最全C/C++面试八股文,一文带你彻底搞懂C/C++面试!

    目录 1.讲一讲封装、继承、多态是什么? 2.多态的实现原理(实现方式)是什么?以及多态的优点(特点)? 3.final的作用是什么? 4.虚函数是怎么实现的?它存放在哪里在内存的哪个区?什么时候生成的 5.智能指针的本质是什么,它们的实现原理是什么? 6.匿名函数

    2024年02月08日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包