| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> C++之类和对象(一) -> 正文阅读 |
|
[数据结构与算法]C++之类和对象(一) |
类和对象(一)面向过程和面向对象
类的引入首先在C语言中,我们是这样定义链表节点的:
在C语言中,结构体指针的结构体类型必须写struct ListNodeC*,而在C++中:
在C++中既可以加struct,又可以不加struct,因为C++兼容C结构体的语法,同时C++中的struct已经不仅仅是结构体,struct已经同时升级成类,定义类,也就是定义出一个新的类型,C语言是面向过程的,数据和方法是分离的,而C++面向对象,数据和方法是放在一起的(封装在一起) 在C语言中我们在结构体中只能定义变量,而在C++中我们在结构体中不仅可以定义变量,也可以定义函数:
在C++中struct可以定义类,但是C++更习惯用class来代替,我们来看使用class进行类的定义 类的定义在C语言中,我们写栈的实现是这样写的,数据和方法(函数)是分离的:
在C++中,引入了类,数据和方法(函数)是封装的:
类的两种定义方式
Stack.h
Stack.cpp
但是函数的定义就这样写可以吗?答案是不可以的 我们首先调用一下这些函数,看能不能正常运行:
发现有一个链接错误,为什么呢? 这里说链接错误,因为在链接时找到了Init和Push函数的声明,然后在Stack.cpp生成的目标文件中找函数定义,但是找不到,为什么呢?因为我们定义的类对象s1,s1.Init();编译器找时,不知道哪个是该类的成员函数 那么怎么解决呢?这时就有了类的作用域这个概念 类的作用域类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。 类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。 故上面的.cpp文件应该这么写:
对于类规范性的写法:
有人可能看到了在类的定义中我们写了public,那么这又是什么呢?不要着急我们接下来看类的访问限定符 类的访问限定符和封装访问限定符数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。C++用类来实现封装,类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。成员和类的默认访问修饰符是 private。 访问修饰符
注意: 当我们不写访问限定符时默认为私有 我们现在已经知道struct在C++中既可以当成结构体用也可以当作类来用 那么class和struct不写访问限定符默认都为私有吗?
封装我们在刚开始学习C++的时候,经常听说面向对象的三大特性:封装、继承、多态 那么什么是封装呢?这里我们讲一下封装:
类的实例化
注意: 在我们在写一个类时,里面写的成员变量其实是成员变量的声明,成员变量的声明其实告诉你变量的类型、名称、这里是没有没开辟空间来存储它的,成员变量是属于对象的,对象在被实例化出时,才是他们定义的地方,定义和初始化是没有关系的,变量和对象的定义,应该是开辟内存空间存放他。 比如房子的设计图,不能住人,实例化就像用图纸建造房子,房子才能住人,房子设计图就像类,类里面不能存数据,类实例化对象,对象才能存数据
如何计算类对象的大小问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?
类实例化出对象,那么该对象是怎么存储的呢? 类对象的存储方式假如对象中包含类的各个成员:
那么计算机是安装哪种方式存储的呢? 事实上是按照第二种方式进行存储的
那么sizeof(A)的结果是什么呢?
不了解内存对齐的读者请前往:结构体内存对齐 那么下面的两个类的大小又是多少呢?
this指针我们首先写一个日期类:
Date类中有SetDate与Display两个成员函数,函数体中没有关于不同对象的区分,如果创建了d1,d2两个对象,那当d1调用SetDate函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢? 实际上这里有一个this指针,它指向当前对象,通过它可以访问当前对象的所有成员。我们在调用成员函数后,编译器其实会再传一个参数进去,这个参数为当前对象的地址:
而成员函数那边用一个this指针来接收,实际上SetDate成员函数在编译时会成为这样:
注意:对象可以调用成员函数,成员函数中也可以调用成员函数 那么this指针存储在哪里呢? 常犯的错误:this存储在对象里面 this指针是形参,形参和函数中的局部变量都是存在函数栈帧里面的,所以this指针是存在栈区的,vs下this指针是通过寄存器ecx传递的,看下图: 下面我们来看一个面试题:
该代码的运行结果是什么呢? 1、正常运行 2、编译不通过
那么去调用Print函数程序的运行结果是什么呢?
欢迎大家学习交流! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:26:27- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |