C++初阶:类与对象(初篇)

2024-03-08 18:28
文章标签 c++ 对象 初阶 初篇

本文主要是介绍C++初阶:类与对象(初篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1. 类与对象
    • 1.1 引子:结构体与类
    • 1.2 什么是类(类的定义方式)
    • 1.3 类和结构体的区别
    • 1.4 类的访问限定符与封装
      • 1.4.1 访问限定符
      • 1.4.2 类的作用域与类的实例化
    • 1.5 类对象的模型
      • 1.5.1 类内部资源的存储方式
      • 1.5.3 类大小的计算方式
    • 1.6 this指针
      • 1.6.1 this指针的引入
      • 1.6.2 this指针的特性

1. 类与对象

1.1 引子:结构体与类

  1. 在C语言中我们学习过自定义类型结构体,其内部可以创建自定义类型的变量与内置类型的变量来满足我们的需要。
  2. 结构体的产生是为了描述简单内置类型无法定义的复杂对象。
  3. 我们知道,计算机是帮着人们解决现实世界问题的工具,将问题使用编程语言描述出来并传递给计算机来进行解决,为了更好的贴近现实生活,由此有了结构体的概念。
  4. 当我们引入面向对象的概念(C++初阶)之后,结构体已经无法满足我们的需求,为了更好的解决问题,我们引入类与对象的概念。

1.2 什么是类(类的定义方式)

  1. 定义方式:类名(关键字Class + 类名)+ 类体(成员变量 + 类方法 + 访问限定符)
class [这个类的名称]
{
public://类的成员变量
private://类方法
};
  1. 补充:C++中成员变量命名方式
    注:类的内部方法可以直接访问类的成员变量
class Date
{
private:int year;int month;int day;public: void Init(int year){//无法正常赋值year = year;}
};

上述操作会导致命名冲突,编译器无法识别,发生错误,所以建议类的成员变量前都加下划线_

class Date
{
private:int _year;int _month;int _day;
}
  1. 类方法的声明与定义分离
//class.h
class Date
{
private: int _year;int _month;int _day;
public:void Print();
}//class.c
void Date::Print()
{cout << _year << '-' <<  _month << '-' << _day << endl;
}
  1. 类方法声明与定义方式分离的方式,可以提高代码的可读性
  2. 在类内部定义的方法会被默认为内联函数

1.3 类和结构体的区别

当我们分别使用类与结构的方式定义栈,两者有何差异。(C语言中的结构体)

结构体:

//定义方式
struct Stack
{int* _data;int _capacity;int _top;
};void StackInit(Stack* stack)
{stack->_data = NULL;stack->_capacity = stack->_top = 0;
}//调用方式
struct Stack stack1;
StackInit(&stack1);

类:

//定义方式:
class Stack
{
public:int* _data;int _capacity;int _top;void Print(){cout << _capacity << endl;}
};//调用方式:
Stack stack1;
stack1.Print();

定义方式与内部结构:

  1. 结构体内部只能定义变量,而类还可以定义方法
  2. 类有访问限定符,决定其内部成员变量是否可以访问(只有public的情况下可以访问)

调用方式:

  1. 创建变量时,结构体类型的全名为struct + 结构体名,而类只需要使用Class关键字之后的类名
  2. 类可以直接调用类方法,而结构体只能将自己作为参数传参给指定函数

注:上述区别为C语言中结构体与类的区别,在C++中对这一方面有了调整与补足,C++结构体中也可以定义方法,使用时也可以省略关键字(struct)

1.4 类的访问限定符与封装

面向对象三大特点:封装,继承,多态

1.4.1 访问限定符

  1. 公有:public,类外可以直接访问
  2. 私有:private,类外无法访问
  3. 保护:protect,类外无法访问

注:访问的限定符的作用域为从限定符开始到下一个限定符/类的末尾结束

访问限定符的作用与存在意义:

  1. 对类内部资源进行访问与操作权限区分,提高了内部资源的安全性,隐藏了类实现的细节,方便数据的管理
  2. 使得对类的使用变得简单
  3. 因为有访问限定符对类内部资源权限的不同划分,由此而实现了对类的封装

1.4.2 类的作用域与类的实例化

  1. 类体内是一个独立的作用域,其内部的所有成员在类的作用内,而在类内部声明外部定义的成员,在定义时需要声明类域,如此才能够访问类内部的资源。
class A
{
public:int _a;void Print();
};void A::Print()
{cout << _a << endl;
}
  1. 我们自定义类的使用,与结构体,自定义类型的使用类似,同样为类型 + 创建对象名(变量)的定义方式
  2. 类的实例化,我们定义的类并非实体,只是一个抽象的模板,如果将类实例化出的对象比作具体现实存在的高楼,那么类就是这些高楼的建筑图纸
class B
{
public:int _b;void Print(){cout << _b << endl;}
}//实例化方法
B b1;
//访问实例化对象,内部成员的方式
b1._b = 10;
//调用内部方法的方式
b1.Print();

1.5 类对象的模型

1.5.1 类内部资源的存储方式

我们通过上面的学习了解到,类是由两部分组成的,成员变量 + 成员函数,我先通过简单控制变量的方式来初步分别查看两者存储方式。

  1. 成员变量:
class A
{int _a;
};cout << sizeof(A) << endl;
  1. 增加成员函数:
class A
{int _a;void Print(){cout << _a << endl;}
};cout << sizeof(A) << endl;

通过上述尝试,我们不难发现,成员函数的增加并没有使得类的大小增加,所以成员函数并没有存储在类的内部

1.5.3 类大小的计算方式

类内资源的存储方式:

  1. 成员函数不存储在类的内部,在类内声明定义的函数实则定义在类外,在类内的声明定义更类似一个声明的操作,声明此函数为这个类的成员函数
  2. 类的成员变量存储在类的内部,遵循内存对齐的规则(C语言结构体)
class C
{};
  1. 特殊的,空类的大小并不为空,而是会有一个字节来标识其的存在

1.6 this指针

1.6.1 this指针的引入

  1. 经过学习我们知道成员函数的定义并不在类中,那么成员函数是怎么分辨是哪一个实例化对象在调用它,又是如何访问实例化对象的成员变量呢?
  2. 这里我们引入类成员函数中的一个隐藏参数,this指针
  3. 在C++中,其实编译器给每个非静态成员函数在定义时都赋予一个隐藏参数,this指针,该指针会默认指向调用它的实例化对象,我们对于实例化对象中成员变量的访问其实都是通过它来实现的

1.6.2 this指针的特性

  1. this指针的类型为,自定义类的指针(A*)const,这代表着此指针无法改变指向,不允许被修改
  2. this指针只能够在成员函数的内部使用
  3. this指针本质上是函数的形参,并不存储在类的内部
  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递
class A
{
public:int _a;void Print1(){cout << _a << endl;}void Print2(){cout << this->_a << endl;}void Print3(){cout << *this._a << endl;}
}//三种调用方式本质相同
A a1;
a1.a = 10;
a1.Print1();
a1.Print2();
a1.Print3();

注:

  1. C++中类的实现方法,在本质上与C中结构体的实现并无不同,只是C语言这些细节与过程需要我们自己调控,而C++中会由编译器来代为维护完成。
  2. C++中还给类添加了访问限定符,对类进行了封装,提高了资源的安全性,便利了我们的使用

这篇关于C++初阶:类与对象(初篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/787991

相关文章

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.