广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++入门浅谈之类和对象
  • 166
分享到

C++入门浅谈之类和对象

2024-04-02 19:04:59 166人浏览 薄情痞子
摘要

目录一、面向过程vs面向对象二、类的限定符及封装三、类的实例化四、this指针五、默认成员函数1. 构造函数2. 析构函数3. 拷贝函数4. 赋值运算符重载总结一、面向过程vs面向对

一、面向过程vs面向对象

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

c++是基于面向对象,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成,C++不是纯面向对象的语言,C++既有面向过程,也有面向对象可以混合编程。C语言面向过程,数据和方法是分离的。CPP面向对象,数据和方法是封装在一起的,如struct里即可用存数据也可以调用方法(函数)


struct ListnodeCPP{
	int val;
	ListNodeCPP* next;
};
int main(){
	//struct ListNodeCPP n1; 就不需要这样调用了
	ListNodeCPP n1;
}

所以这里的struct已经不仅仅是结构体,在cpp中已经升级成了类名

二、类的限定符及封装

类包括成员变量和成员函数

下图为类的访问限定符及封装

请添加图片描述

Warning:

在class中,如果不写访问限定符默认是私有

在struct中,如果不写访问限定符默认是公有

在这里插入图片描述

class类中的private里的成员变量前面都会加个下划线因为在函数复制时更加容易区分

面向对象的三大特性:封装、继承、多态

本节只介绍封装,封装是将数据和操作数据进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

封装本质上是一种管理,类似兵马俑,如果什么都不管兵马俑就会被随意破坏那么我们首先建一座房子把兵马俑给封装起来。
但是我们不能全部封装起来,所以开放了搜票通道,买了门票的可以进去参观。类也是一样,我们使用类数据和方法都封装一下。

不想给别人看的,我们使用proteced/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质上是一种管理

Warning:在类中private域声明的变量仅仅是声明,但是没有开空间,我们只有在实例化的时候才算是定义,public域下亦是如此。

总结就是定义是开空间,在实例化后才是定义,class里只是声明

三、类的实例化

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

1.类限定了有哪些成员,定义出的一个类并没有分实际的内存空间来存储它

2.一个类可以实例化多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

3.类实例化出对象就像现实中造车,类是车的设计图,只负责设计需要什么东西,但并没有实体,同样类也只是个设计,实例化出的对象才能实际存储数据,占用物理空间

在这里插入图片描述

上图这个只算class里变量的大小,因此只保存成员变量,成员函数存放在公共的代码段

那么定义一个空类呢?


class Cpp{}

那么sizeof的大小为1 , 而不是0,因为如果一个类没有成员,那么他的对象需要给1byte进行占位
标识对象存在,这1个byte不存储有效数据

四、this指针

C++编译器给每个非静态成员函数增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中,所以成员变量的操作都是通过该指针去访问

下面的代码为编译器处理成员函数的this指针,也可以不写那么编译器会自动传隐含的this指针


class Date{
public:    
    void date(int year, int month, int day){
        this->_year = year;
        this->_month = month;
        this->_day = day;
    }
    
    void Print(){
        cout << _year << "/" << _month << "/" << _day <<endl;
    }
private:
    int _year;
    int _month;
    int _day;
};

this指针特性:

1.this指针的类型:类类型* const

2.只能在成员函数的内部使用

3.this指针本质上是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针

4.this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传第,不需要用户传递

五、默认成员函数

请添加图片描述

上图为默认的成员函数,那么如果定义了一个class而里面什么都不写的话,仍会自动生成上面6个默认成员函数

1. 构造函数

我们首先要介绍的就是构造函数,因为一般在C语言中一般会先进行初始化,在C++中一般写在类里,这样我们在实例化的过程中就可以省去很多时间,而且避免了忘记初始化的风险。

构造函数特征:

1.函数名与类名相同

2.无返回值

3.对象实例化时编译器自动调用对应的构造函数

4.构造函数可以重载

所以构造函数实际上能够做到我们对象一定义出来就初始化了


class Date{
public:
    Date(){
        _year = 0;
        _month = 0;
        _day = 0;
    }
    //带参构造函数
    Date(int year, int month, int day){
        _year = year;
        _month = month;
        _day = day;
    }
	
	//全缺省,注意默认构造函数只能有一个,所以只能选一种我们推荐用全缺省方式的构造函数
	Date(int year=2022, int month = 2, int day = 20){
	    _year = year;
        _month = month;
        _day = day;
	}
    
    void date(int year, int month, int day){
        this->_year = year;
        this->_month = month;
        this->_day = day;
    }
    
    void Print(){
        cout << _year << "/" << _month << "/" << _day <<endl;
    }
    
private:
    int _year;
    int _month;
    int _day;
};

int main(){
	Date day1; //注意这种是调用无参构造函数
	Date day2(2021,10,19); //带参构造函数

	Date day3(); //函数声明,返回一个日期类型的对象
}

Warning:

如果用户显示定义了构造函数,编译器将不再生成内置类型不会初始化 ,如int/char/double/指针等自定义类型会调用他的构造函数初始化,如struct/class/uNIOn

2. 析构函数

对象在销毁时会自动调用析构函数,完成类的一些资源清理工作

析构特征:

1.在类名的前面加上字符: ~

2.无参数无返回值

3.一个类有且只有一个析构函数。如果没有定义系统将自动生成默认的

4.对象生命周期结束时,C++编译系统自动调用析构函数


class SeqList
{ 
public :
	SeqList (int capacity = 10)
	 {
		_pData = (DataType*)malloc(capacity * sizeof(DataType));
		assert(_pData);
		_size = 0;
		_capacity = capacity;	
	 }
	 
	~SeqList()
	 {
		if (_pData)
		 {
			free(_pData ); // 释放堆上的空间
			_pData = NULL; // 将指针置为空
			_capacity = 0;
			_size = 0;
		 }
	 }
private :
	int* _pData ;
	size_t _size;
	size_t _capacity;

};

3. 拷贝函数

顾名思义就是拷贝一个一摸一样的对象

特征:

1.是构造函数的一个重载形式

2.参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用

下面就会引发无穷递归,解决办法就是在Date类型后面加一个引用,这里就变成了用别名区分

请添加图片描述

3. 如果未定义,系统生成默认的 拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝成为浅拷贝

4. 赋值运算符重载

我们先了解一个概念叫运算符重载,具有其返回值类型,函数名以及参数列表

关键字:operator后面接需要重载的运算符符号

Warning:

1.作为类成员的重载函数时,其形参看起来比操作数数目少一个成员函数,实际上并不是这样子的,操作符有一个默认形参this,限定为第一个形参

2.以下符号不能重载:.* , :: . sizeof , ?: . .

3.我们定义operation一般在public里面而不是全局,因为如果我们修改不了private里面的成员变量,就保证不了封装性

特征:

1. 参数类型

2.返回值

3.检查是否自己给自己赋值

4. 返回*this

5. 一个类如果没有显示定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝

下面就简单实现了日期增加N天的运算符赋值


//Date day(2021,10,10);
//day += 20;
Date& Date::operator+=(int day){
    if(day<0){
        return *this -= -day;
    }else{
        _day += day;
        
        //如果日期不合法,进位
        while(_day > GetMonthDay(_year, _month)){
            
            _day -= GetMonthDay(_year, _month);
            ++_month;
            
            if(_month == 13){
                ++_year;
                _month = 1;
            }
        }
    }
    
    return *this;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C++入门浅谈之类和对象

本文链接: https://www.lsjlt.com/news/154979.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++入门浅谈之类和对象
    目录一、面向过程vs面向对象二、类的限定符及封装三、类的实例化四、this指针五、默认成员函数1. 构造函数2. 析构函数3. 拷贝函数4. 赋值运算符重载总结一、面向过程vs面向对...
    99+
    2022-11-12
  • 浅谈java类和对象
    目录一、面向对象的描述二、类和对象的基本概念三、类定义和使用1、简单认识类2、类的定义3、实例化对象4、类的三大特性封装继承多态一、面向对象的描述 面向对象是一种现在最为流行的程序设...
    99+
    2022-11-13
  • C语言入门之浅谈数据类型和变量常量
    目录1.变量的作用域:2.变量的生命周期:1.字面常量,如:100,‘v’;2.define宏定义的标识符常量3.const修饰的常变量4.枚举常量总结首先我...
    99+
    2022-11-12
  • Python面向对象之入门类和对象
    目录什么是面向对象编程?定义类,从具体代码来感受吧!多个类和对象的观察补充一下类的属性(数据部分)总结什么是面向对象编程? 我们是不是听过面向过程,拿来放在一起对比就比较好理解了。 ...
    99+
    2022-11-12
  • 浅谈Java面向对象之内部类
    目录内部类访问外部对象访问内部对象局部内部类匿名内部类静态内部类内部类 内部类是定义在另一个类中的类,例如 TalkingClock 类中内嵌了 TimePrinter 类: c...
    99+
    2022-11-12
  • Python入门之面向对象和类
    目录一、两大编程思想二、类与对象三、定义Python中的类四、对象创建五、类属性、类方法、静态方法六、动态绑定属性和方法七、面向对象的三大特征八、方法重写总结一、两大编程思想 二、...
    99+
    2022-11-12
  • 【C++深入浅出】类和对象下篇
    一. 前言         老样子,先来回顾一下上期的内容:上期我们着重学了C++类中的六大默认成员函数,并自己动手实现了一个日期类,相信各位对C++中的类已经有了一定程度的了解。本期就是类和对象的最后一篇啦,终于要结束咯,吧唧吧唧  ...
    99+
    2023-10-10
    c++ 开发语言 初始化列表 static成员 友元 匿名对象 explicit关键字
  • Java 深入浅出解析面向对象之抽象类和接口
    目录抽象类声明抽象类声明抽象方法案例使用规则接口声明接口案例接口特性抽象类和接口的区别抽象类 java语言,声明类时 abstract class Db{} 说明Db类为抽象类。 j...
    99+
    2022-11-13
  • 深入浅出分析Java类和对象
    目录一、什么是类二、Java的类和C语言的结构体异同三、类和类的实例化类的声明实例化的对象,成员遵循默认值规则类的实例化静态属性(静态成员变量)四、构造方法创建构造方法this一、什...
    99+
    2022-11-13
  • 详解C++之类和对象(2)
    目录一.构造函数1.构造函数的定义:2.构造函数的特征:3.构造函数的实现:3.1.系统默认的构造函数3.2无参构造3.3 带参构造二 析构函数1.析构函数的定义2.析构函数的特征三...
    99+
    2022-11-12
  • 详解C++之类和对象(1)
    目录C语言和C++的一大区别struct和class的区别总结c++类的由来(或者说为什么要增加类):我们知道c语言是面向过程的语言,c++是即面向过程又是面向过程的语言。那么这两个...
    99+
    2022-11-12
  • Python类和对象基础入门介绍
    目录视频Python 类和对象创建和使用类根据类创建实例视频 观看视频 Python 类和对象 面向对象编程是编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。 编写类时,...
    99+
    2022-11-11
  • 浅谈python中的面向对象和类的基本语法
    当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀。我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,如果要讲透,最好是用面向对象的思想重新学一遍前面的内容。这个坑是如...
    99+
    2022-06-04
    浅谈 面向对象 语法
  • C++初阶教程之类和对象
    目录类和对象<上>1. 类的定义2. 类的封装2.1 访问限定修饰符2.2 类的封装3. 类的使用3.1 类的作用域3.2 类的实例化4. 类对象的存储5. this 指...
    99+
    2022-11-13
  • C++类和对象之多态详解
    目录多态基本概念和原理剖析多态案例1 计算器类纯虚函数和抽象类多态案例2 制作饮品虚析构和纯虚析构多态案例3 电脑组装多态基本概念和原理剖析 多态:多态是C++面向对象的三大特性之一...
    99+
    2022-11-12
  • C++类和对象之封装详解
    目录封装的意义以及示例访问权限公共权限 public保护权限 protected私有权限 privatestruct 和 class的区别成员属性私有化案例1:设计立方体类案例2:点...
    99+
    2022-11-12
  • 【C++入门到精通】C++入门 —— 多态(抽象类和虚函数的魅力)
    阅读导航 前言一、多态的概念1. 概念2. 多态的特点 二、多态的定义及实现1. 多态的构成条件2. 虚函数3. 虚函数的重写⭕虚函数重写的两个例外1.协变(基类与派生类虚函数返回值类型...
    99+
    2023-09-15
    c++ java 开发语言 后端
  • c++学习 之 类和对象 public , protected ,private
    前言 在C++中,访问控制修饰符(Access Control Modifiers)用于控制类的成员(成员变量和成员函数)的访问权限。这些修饰符分为三种:public、protected和private。它们定义了成员可以在何处访问,具体如...
    99+
    2023-08-30
    c++ 学习 开发语言
  • Python零基础入门(九)——函数,类和对象
    系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python入门专栏:《Python入门》欢迎阅读,一起进步!🌟🌟🌟...
    99+
    2023-08-31
    python pycharm 人工智能 开发语言
  • C++核心编程之类和对象详解
    目录1.封装1.1封装的意义封装意义一:封装意义二1.2 struct 和 class 区别1.3 成员属性设置为私有总结C++面向对象三大特性:封装、继承、多态 1.封装 1.1封...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作