【c++】类和对象1

1.面向过程和面向对象初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
在这里插入图片描述
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完

在这里插入图片描述

2.类的引入

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

#include <iostream>using namespace std;struct stack
{void init(int capcity){_a = (int*)malloc(sizeof(int) * capcity);if (_a == nullptr){perror("malloc fail");return;}_capacity = capcity;_top = 0;}void Push(const int&data){// 扩容_a[_top] = data;++_top;}int Top(){return _a[_top- 1];}void Destroy(){if (_a){free(_a);_a = nullptr;_capacity = 0;_top = 0;}}int* _a;int _top; // 栈顶int _capacity;};int main()
{stack st;st.init(4);st.Push(1);st.Push(2);st.Push(3);int  ret = st.Top();st.Destroy();}

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

3.类的声明与定义

1.上面的那种方法,定义和声明都在类里面
2.定义和声明分开
stack.cpp

#include <stdlib.h>#include"stack.h"void stack:: init(int capcity){_a = (int*)malloc(sizeof(int) * capcity);if (_a == nullptr){perror("malloc fail");return;}_capacity = capcity;_top = 0;}void stack::Push(const int& data){// 扩容_a[_top] = data;++_top;}int  stack::Top(){return _a[_top - 1];}void  stack::Destroy(){if (_a){free(_a);_a = nullptr;_capacity = 0;_top = 0;}}

stack.h

#pragma once
struct stack
{void init(int capcity);void Push(const int& data);int Top();void Destroy();int* _a;int _top; int _capacity;};

源.cpp

#include <iostream>
#include "stack.h"
using namespace std;int main()
{stack st;st.init(4);st.Push(1);st.Push(2);st.Push(3);int  ret = st.Top();st.Destroy();
}

注意:类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::

在这里插入图片描述

4.类的访问限定符及封装

在这里插入图片描述
【访问限定符说明】

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束。
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)
    【面试题】
    解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
    定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
    默认访问权限是private。

5.类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域。

struct stack
{void init(int capcity);void Push(const int& data);int Top();void Destroy();int* _a;int _top;int _capacity;};void stack:: init(int capcity){_a = (int*)malloc(sizeof(int) * capcity);if (_a == nullptr){perror("malloc fail");return;}_capacity = capcity;_top = 0;}

这里的init属于stack这个类域

6.类的实例化

1.用类类型创建对象的过程,称为类的实例化
2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
3.做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设
计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象
才能实际存储数据,占用物理空间

struct stack
{void init(int capcity);void Push(const int& data);int Top();void Destroy();int* _a;int _top; int _capacity;
};
int main()
{stack st;}

st就是类的实体化。

7.如何计算类对象的大小

/ 类中既有成员变量,又有成员函数
class A1 {
public:void f1(){}
private:int _a;
};
// 类中仅有成员函数
class A2 {
public:void f2() {}
};
// 类中什么都没有---空类
class A3
{};

sizeof(A1) : 4__ sizeof(A2) : 1__ sizeof(A3) : 1__

#include <iostream>using namespace std;
class A1 {
public:void f1() {}
private:int _a;
};
// 类中仅有成员函数
class A2 {
public:void f2() {}
};
// 类中什么都没有---空类
class A3
{};
int main()
{printf("%d ", sizeof(A1));printf("%d ", sizeof(A2));printf("%d ", sizeof(A3));}

在这里插入图片描述
结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

8.this指针的引出

#include <iostream>using namespace std;class date 
{  public:void init(int year, int month, int day){_year = year;_month = month;_day = day;}void print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;};
int main()
{date d1;date d2;d1.init(2023, 3, 11);d2.init(2023, 1, 12);d1.print();d2.print();}

Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函
数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏
的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”
的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编
译器自动完成。

【面试题】

  1. this指针存在哪里?
  2. this指针可以为空吗?

答:this指针存在栈区中(类中的函数存在代码段中).

#include <iostream>using namespace std;class date 
{  public:void init(int year, int month, int day){_year = year;_month = month;_day = day;}void print(){cout << _year << "-" << _month << "-" << _day << endl;}void func(){cout << "func()" << endl;}
private:int _year;int _month;int _day;};
int main()
{date d1;date d2;d1.init(2023, 3, 11);d2.init(2023, 1, 12);/*d1.print();d2.print();*/date* ptr = nullptr;ptr->func();//可以为空吗//正常运行//在代码段中找ptr->init(2001, 1, 1);//可以为空吗//运行崩溃(*ptr).func();//可以为空吗//正常运行//原理和第一个一样}

第一个空指针没有解引用
第二个空指针解引用导致崩溃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/343203.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机体系结构动态调度(计分板及Tomasulo)学习记录

1.动态调度核心思想&#xff1a;允许就绪指令越过前方停顿指令&#xff0c;提前进入运行&#xff08;乱序执行&#xff09; 就绪指令指不存在资源冲突、操作数已就绪的指令&#xff0c;例如&#xff0c;计分板算法使用计分板来实现&#xff0c;Tomasulo使用保留站来实现&#…

2024Flutter岗位面试题总结

StatelessWidget和StatefulWidget的区别是什么&#xff1f; StatelessWidget是一个不可变的类&#xff0c;充当UI布局中某些部分的蓝图&#xff0c;当某个组件在显示期间不需要改变&#xff0c;或者说没有状态&#xff08;State&#xff09;&#xff0c;你可以使用它。 Statef…

2024年MIA最新生成综述:基于深度学习的MRI/CT/PET合成【文献阅读】

2024年MIA最新生成综述&#xff1a;基于深度学习的MRI/CT/PET合成【文献阅读】 基本信息 标题&#xff1a;Deep learning based synthesis of MRI, CT and PET: Review and analysis发表年份: 2024期刊/会议: Medical Image Analysis分区&#xff1a; SCI 1区IF&#xff1a;1…

泛型进阶: 泛型方法 通配符

泛型方法 定义语法 方法限定符 <类型参数列表> 返回值类型 方法名称(形参列表) {...} 示例 public class Test {//静态的泛型方法 需要在static后用<>声明泛型参数public static <E> void swap(E[] array, int i, int j) {E t array[i];array[i] array[j…

【已解决】RAR压缩文件可以转换为ZIP格式吗?

想把RAR压缩文件转换成ZIP格式文件&#xff0c;除了可以把RAR压缩包解压后&#xff0c;再重新压缩成ZIP格式&#xff0c;还可以利用WinRAR解压缩软件的“格式转换功能”来实现。不清楚的小伙伴&#xff0c;一起来看看如何操作吧。 首先&#xff0c;通过WinRAR解压缩软件打开RA…

【软件测试】路径覆盖

题目要求&#xff1a; a) 流程图如下&#xff1a; b) Consider test cases ti (n 3) and t2 ( n 5). Although these tour the same prime paths in printPrime(), they dont necessarily find the same faults. Design a simple fault that t2 would be more lik…

debian cups 打印机共享

apt update apt install -y cups localhost:631 add printer root 密码 添加打印机 然后在windows上设置 http://ip:631/printers/HP_LaserJet_1022

代码随想录第第五十七天—回文子串,最长回文子序列

leetcode 647. 回文子串 题目链接&#xff1a;回文子串 版本一&#xff1a;动态规划 dp数组及下标的含义 dp[i][j]&#xff1a;区间范围[i, j] &#xff08;左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是dp[i][j]为true&#xff0c;否则为false。确定递推公式…

微服务基础设施怎么建设,如何选择微服务框架

微服务基础设施架构全貌 微服务 vs SOA 微服务基础设施优先级 微服务框架核心 模式1-嵌入式SDK式 【优点】 1. 架构简单&#xff0c;天然支持高性能、高可用&#xff1b; 2. 维护简单&#xff0c;无需维护独立的 Proxy 节点。 【缺点】 1. 应用侵入&#xff0c;需要集成 SD…

SQL-DML增删改

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

PXE 高效批量网络装机

前提&#xff1a; 虚拟机恢复到初始化 调整网卡为vm1 关闭防火墙 安全linux systemctl stop firewalld vim /etc/selinux/config 配置IP地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 重启网卡 systemctl restart network 挂载磁盘 安装yum源 安装服务 yum install vs…

紫光展锐T770安卓核心板_展锐T770 5G核心板规格参数

紫光展锐T770安卓核心板是一款高性能的5G安卓智能模块&#xff0c;拥有先进的6nm制程工艺和强大的性能。板载8GB Ram 256GBROM的内存单元&#xff0c;支持4K H.265/ H.264视频编解码&#xff0c;搭载Android 13以上操作系统&#xff0c;功能丰富。除了支持5G NSA和SA双模式向下…