首页 > 编程语言 >C++类和对象(上篇)

C++类和对象(上篇)

时间:2024-07-09 23:56:12浏览次数:13  
标签:定义 对象 成员 C++ int 实例 对齐

文章目录

  • 前言
  • 一、面向过程和面向对象初步认识
  • 二、类的引入
  • 三、类的定义
  • 六、类的实例化
  • 七、类的对象大小的计算
  • 八、类成员函数的this指针
  • 总结


前言

类和对象是面向对象编程的两个核心概念。

类是一种抽象的数据类型,是描述对象共同特征和行为的模板。一个类包括属性和方法。属性是类的数据成员,描述对象的特征;方法是类的成员函数,描述对象的行为。类定义了对象的结构和行为。

对象是类的实例化,是具体的实体。一个对象具有类中定义的属性和方法。可以通过创建对象来使用类中定义的属性和方法。

通常,类是创建对象的蓝图,对象是类的实例,类描述了对象的属性和行为。类可以看作是一种抽象的概念,而对象是具体的实例。通过类可以创建多个对象,每个对象都具有相同的属性和方法,但其具体的属性值可能不同。


一、面向过程和面向对象初步认识

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

C++ 是 基于面向对象 的, 关注 的是 对象 ,将一件事情拆分成不同的对象,靠对象之间的交互完 成。

二、类的引入

C 语言结构体中只能定义变量,在 C++ 中,结构体内不仅可以定义变量,也可以定义函数。 比如: 之前在数据结构初阶中,用C 语言方式实现的栈,结构体中只能定义变量 ;现在以 C++ 方式实现, 会发现 struct 中也可以定义函数

三、类的定义

1.类定义格式

class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。 • 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m 开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。 • C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐用class定义类。 • 定义在类面的成员函数默认为inline。
class Date
{
    public:
    void Init(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    private:
    // 为了区分成员变量,⼀般习惯上成员变量
    // 会加⼀个特殊标识,如_ 或者 m开头
    int _year; // year_ m_year
    int _month;
    int _day;
};

2.访问标识符

C++⼀种实现封装的方式,用类将对象的属性与方法结合在⼀块,让对象更加完善,通过访问权限 选择性的将其接口提供给外部的用户使⽤。 • public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访 问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。 • 访问权限作用域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为止,如果后面没有 访问限定符,作用域就到 }即类结束。 • class定义成员没有被访问限定符修饰时默认为private,struct默认为public。 ⼀般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。

3.类域 

类定义了⼀个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。 • 类域影响的是编译的查找规则,下面程序中Init如果不指定类域Stack,那么编译器就把Init当成全 局函数,那么编译时,找不到array等成员的声明/定义在哪里,就会报错。指定类域Stack,就是知道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。
#include<iostream>
 using namespace std;

 class Stack
 {
    public:
    // 成员函数
    void Init(int n = 4);
    private:
    // 成员变量
    int* array;
    size_t capacity;
    size_t top;
};
    // 声明和定义分离,需要指定类域
    void Stack::Init(int n)
    {
        array = (int*)malloc(sizeof(int) * n);
        if (nullptr == array)
        {
            perror("malloc申请空间失败");
            return;
        }
    capacity = n;
    top = 0;
    }
 int main()
 {
    Stack st;
    st.Init();
    return 0;
}

四、类的实例化

1.概念

⽤类类型在物理内存中创建对象的过程,称为类实例化出对象。 • 类是对象进行⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只 是声明,没有分配空间,⽤类实例化出对象时,才会分配空间。 • ⼀个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量。打个比方:类实例化出对象就像现实中使⽤建筑设计图建造出房⼦,类就像是设计图,设计图规划了有多少个房间,房间⼤⼩功能等,但是并没有实体的建筑存在,也不能住⼈,⽤设计图修建出房子,房子才能住⼈。同样类就像设计图⼀样,不能存储数据,实例化出的对象分配物理内存存储数据。

2.对象大小

class A
{
    public:
    void PrintA()
    {
       cout<<_a<<endl;
    }
    private:
    char _a;
};
结论:一个类的大小,实际就是该类中 成员变量 之和,当然要注意内存对齐 注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象

3结构体内存对齐规则

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

五、类成员函数的this指针

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


总结

类和对象是面向对象编程中重要的概念。

类是指对具有相同特征和行为的对象进行分类描述的模板或蓝图。它定义了一类对象的共同属性和方法。类可以看作是一种数据类型,用于创建对象。

对象是类的实例,是具体存在的实体。一个对象具有类定义的属性和方法,并且可以独立地执行这些方法。对象是根据类定义创建的,类定义了对象的属性和方法,而对象则是类的实例。

类和对象之间的关系是类是对象的抽象,而对象是类的具体实例。一个类可以实例化多个对象,每个对象都具有相同的属性和方法。

类和对象在面向对象编程中具有重要的意义。通过使用类和对象,可以将程序分解为多个相互独立的模块,每个模块负责一部分功能。这种模块化的设计可以提高代码的可重用性、可维护性和可扩展性。同时,类和对象还能够隐藏内部实现细节,使得代码更加安全和简洁。

标签:定义,对象,成员,C++,int,实例,对齐
From: https://blog.csdn.net/Auroral_0218/article/details/140309415

相关文章

  • IEC62056标准体系简介-2.IEC62056标准体系及对象标识系统(OBIS)
     1. IEC62056标准体系        IEC62056标准体系目前共包括六部分,见图1:第61部分:对象标识系统第62部分:接口类第53部分:COSEM应用层第46部分:使用HDLC(HighLevelDataLinkControl)协议的数据链路层第42部分:面向连接的异步数据交换的物理层服务和过程第21部分:直接本地......
  • C++八股(二)之C++11新特性
    一、C++11有什么新特性?⭐自动类型推导(TypeInference):引入了auto关键字,允许编译器根据初始化表达式的类型自动推导变量的类型。统一的初始化语法(UniformInitializationSyntax):引入了用花括号{}进行初始化的统一语法,可以用于初始化各种类型的对象,包括基本类型、数组、......
  • C++八股(三)之虚函数
    目录一、虚函数可以是模板函数吗?⭐二、请你说说虚函数的工作机制⭐⭐⭐三、虚函数表在什么时候创建?每个对象都有一份虚函数表吗?四、请说说操作符重载?哪些操作符不能重载?⭐⭐五、什么是纯虚函数?⭐六、虚函数可以内联吗?⭐七、析构函数一般写成虚函数的原因?构造函数为什么......
  • [C++入门]基础与语法
    1.数据类型C++作为一种强类型语言,支持多种数据类型,这些数据类型用于声明变量、函数参数、返回值等。数据类型可以分为两大类:基本数据类型和复合数据类型。基本数据类型整型(IntegerTypes):包括int(基本整型)、short(短整型)、long(长整型)、longlong(超长整型)、char(字符型,虽常作为......
  • Linux C++ 045-设计模式之工厂模式
    LinuxC++045-设计模式之工厂模式本节关键字:Linux、C++、设计模式、简单工厂模式、工厂方法模式、抽象工厂模式相关库函数:简单工厂模式基本简介从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模......
  • [Java面向对象]
    面向对象修饰符接口接口中方法的访问修饰符默认是publicabstract在Java接口中,接口中的方法默认是公共的(public),且不允许使用其他的访问修饰符。接口中定义的方法会被隐式地指定为publicabstract,这两个修饰符可以省略,因为它们是默认的。所以,Java接口中方法的定义形式通......
  • C++关于计算浮点数小数位数时遇到的浮点数精确度问题(以及浮点数强制转换问题)
    起因是当我想要计算浮点数的小数位位数(利用当浮点数num减去其整数位)我的想法是先分离出小数位,然后每次循环给小数位乘上10,直到不存在小数位时,就会满足当num-(int)num==0通过这种方式就可以得到小数位的长度#include<iostream>usingnamespacestd;intmain(){doubl......
  • C++ pdf库总结
     mupdf#include"widget.h"#include"ui_widget.h"#include<QMessageBox>#include<QDebug>#include<QImage>#include<QPixmap>#include<QLabel>#include"mupdf/fitz.h"#include"mupdf/pd......
  • Docker 创建s3 对象存储服务
    Docker创建s3对象存储服务docker环境不同,可能有些差异主要是因为一些服务需要用到s3存储,因此使用docker部署服务;MinIOS3对象存储具有以下一些优势:简单性与轻量级:部署和维护简单,可以轻松地在各种环境中运行,包括裸金属、Docker和Kubernetes等。高性能:专为高吞......
  • 新增模型对象操作
    对模型对象进行新增,有两种方式:<!--第一种:类SQL方式-->insert_stmt=insert(User).values(name='name1')withSession()assess:sess.execute(insert_stmt)sess.commit()<!--未绑定参数-->insert_stmt2=insert(User)withSession()assess:sess.execute(insert_......