【C++】类与对象 I(上)

简介: 【C++】类与对象 I

前言:(C)面向过程 和(C++)面向对象 初步认识

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

用洗衣服来做个例子:

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

整个过程主要是:人、衣服、洗衣粉、洗衣机四个对象之间交互完成的,人不需要关心洗衣机具体是如何洗衣服的,是如何甩干的。 对象具体怎么完成的,那是它的事情。



前言:类的引入

  • C语言结构体:只能定义变量由于结构体中只能定义变量,导致函数只能在结构体外定义
  1. 导致数据和方法分离,所以必须带参数 才能访问在结构体中定义的变量 。
  2. 函数写在全局,必须加前缀(C中不支持同名【函数重载】)



一、类的介绍

为了更方便使用,有了 的产生:

C++兼容C语言struct的所有用法。 在C++中,结构体内不仅可以定义变量也可以定义函数

结构体struct同时升级成了类:

类[ 类型 ] = 结构体(变量定义)+ 函数定义

  1. 类名就是类型,Stack就是类型,不需要 struct( 直接当类型来用
  2. 类里面定义函数
  3. 类也是个域

C++中Stack

typedef int DataType;
struct Stack
{
//定义函数
 void Init(size_t capacity)
 {
 _array = (DataType*)malloc(sizeof(DataType) * capacity);
 if (nullptr == _array)
 {
 perror("malloc申请空间失败");
 return;
 }
 _capacity = capacity;
 _size = 0;
 }
 void Push(const DataType& data)
 {
 // 扩容
 _array[_size] = data;
 ++_size;
 }
 DataType Top()
 {
 return _array[_size - 1];
 }
 void Destroy()
 {
 if (_array)
 {
 free(_array);
 _array = nullptr;
 _capacity = 0;
 _size = 0;
 }
 }
//定义变量
 DataType* _array;
 size_t _capacity;
 size_t _size;
};
int main()
{
 Stack s;
 s.Init(10);
 s.Push(1);
 s.Push(2);
 s.Push(3);
 cout << s.Top() << endl;
 s.Destroy();
 return 0;
}

用类后,C++与C 进行对比


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



二、类的定义

(一)class 语法

// class :定义类的关键字,ClassName :类的名字

class className

{

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

}; // 一定要注意后面的分号

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


(二)类的两种定义方式:

  1. 声明和定义全部放在类体中
    需注意:成员函数如果在类中定义编译器可能会将其当成内联函数处理


  1. 类声明 放在 .h文件 中,成员函数定义 放在 .cpp文件 中,
    成员函数名前需要加类名::
  • ★ 正确的用法:
  1. 长的函数声明和定义分离
  2. 短小的函数 可以直接在类里面定义
    默认直接在类里定义的 就是 inline。( 到底展不展开,取决于编译器是否认为其长不长 )



(三)成员变量命名规则的建议:

这里会出现什么问题

class Date
{
public:
 void Init(int year /*函数参数*/ )
 {
 // 这里的year到底是成员变量,还是函数形参?
 year = year;
 }
private:
 int year;  /*成员变量*/
};


结果

  • 都会现在所在的域中先找


改进:一般,成员变量 加个区分

  • [_表示内部的]
  1. _year 【 最常用 】
  2. year_
  • [m member 成员]
  1. m_year
  2. mYear 驼峰命名法

其他方式也可以的,主要看公司要求。一般都是 加个前缀 或者 后缀标识区分就行 。

class Date
{
public:
 void Init(int year)
 {
 _year = year;      //
 }
private:
 int _year;
};
// 或者这样
class Date
{
public:
 void Init(int year)
 {
 mYear = year;       //
 }
private:
 int mYear;
};
// 其他方式也可以的,主要看公司要求。一般都是加个前缀或者后缀标识区分就行



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

(一)访问限定符

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



(二)访问限定符说明

  • public (公有)
    public修饰的成员 在类外可以直接被访问


  • protected(保护)
  • private(私有)
    protected(保护)private(私有) 修饰的成员 在类外不能直接被访问 ( 此处 protected 和 private 是类似的,真正要区别二者要到继承 )
  1. 访问权限 作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  2. 如果后面没有访问限定符,作用域就到 } 即类结束
  3. class默认访问权限privatestructpublic 【 因为struct要兼容C

【 注意:访问限定符 只在编译时有用当数据映射到内存后,没有任何访问限定符上的区别

目录
相关文章
|
26天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
5天前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
35 16
|
9天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
51 6
|
1月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
26天前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
26天前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
2月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
85 19
|
2月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
79 13
|
2月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
69 5
|
2月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
52 5

热门文章

最新文章