C++类与对象(1)

1,结构体到类过渡

c++兼容c语言,结构用法可以继续使用,同时struct也升级成了类。

struct Stack {
    //成员变量
    int* a;
    int top;
    int capacity;
    //成员函数
    void Init() {
        a = nullptr;
        top = capacity = 0;
    }
    void push(int x) {

    }
};

既可以用结构体的方式去访问成员变量,也可以用类的的方式去访问成员变量。

2,类的定义

(1)class 类名{主体},主体包含成员变量,和成员函数

(2)访问限定符(三种):public(共有),protected(保护),private(私有)

访问限定符一般作用到下一个访问限定符结束或者遇到“}”类结束

在类中,成员的默认访问限定符是私有的,所以如果不写访问限定符,类中的成员函数是无法使用的。而在结构体中,成员的默认访问限定符是共有的。

(3)类的声明和定义可以分离:

例如:

stack.h//声明部分

class Stack {
private:
    int* a;//数组的地址
    int top;//下一个元素的下标
    int capacity;//容量

public:
    void Init();
    void push(int x);
    int Top();
    
};

//定义部分

#include"stack.h"
#include <exception>

需要在类域中寻找变量,所以需要加 Stack::
void Stack::Init() {
    a = nullptr;
    top = capacity = 0;
}
void Stack::push(int x) {
    if (top == capacity) {
        size_t newcapacity = capacity == 0 ? 4 : capacity * 2;
        a = (int*)realloc(a, sizeof(int) * newcapacity);//realloc申请空间
        capacity = newcapacity;
    }
    a[top++] = x;
}
int Stack::Top() {
    return a[top - 1];
}

注意:直接在类里面定义,会默认为内联函数,不会生成符号表

(4)类的实例化

类中的成员变量相当于声明部分,并没有分配空间,这时就需要定义开空间,也称为对象的实例化。成员变量会在对象中存储一份,但成员方法在公共代码区中。

(5)类的大小

class Date1{//类不占内存的空间
private:
    int _year;//声明
    int _month;
    int _day;
public:
    void Inti(int year, int month, int day) {
         _year = year;
         _month = month;
         _day = day;
    }

};

Date d;

cout << sizeof(Date) << endl;//12
cout << sizeof(d) << endl;//12

类的大小或者说对象的大小看的是成员变量的类型和个数,且遵循内存对齐规则,所以上述对象的大小为12(3*4)

例1:

class A {//4byte
    int a;
    void add() {
    }
};

例2:

class A1 {//内存对齐规则、8byte
    int a;
    char b;
    void add() {
    }
};

例3:class B {//1byte表示占位表示对象存在过
    void add() {
    }
};

class C {//1byte
};

(6)this指针:

编译器在调用成员函数是,会有一个隐藏的this指针

例如:

void Inti(int year, int month, int day) {
      _year = year;
       _month = month;
       _day = day;
    }

Date d;
d.Inti(2024, 9, 9);

而编译器处理后为:

void Inti(Date* this,int year, int month, int day) {
         this->_year = year;
         this->_month = month;
         this->_day = day;
    }

Date d;
d.Inti(&d,2024, 9, 9);

但是自己写代码时,不能写成把this作为参数传递,但在类里面可以使用,比如: this->_year = year;这样的写法是可以的

总结:this在实参和形参位置不可以显示的写,但是在类里面可以显示的用,this作为形参存在栈里面,vs里面存在寄存器里面

3,构造函数

构造函数:特殊的成员函数

1,函数名与类名相同
2,无返回值
3,对象实例化时,自动调用
4,构造函数可以重载

例1:class Date {//类不占内存的空间
private:
    int _year;//声明
    int _month;
    int _day;

public:
    //无参数的构造函数
    Date() {
        _year = 1;
        _month = 1;
        _day =1;
    }

//有参数的构造函数

    Date(int year, int month, int day) {
        _year = year;
        _month = month;
        _day = day;
    }
    */
    void Print() {
        cout << _year << " " << _month << " " << _day << endl;
    }
};

类中的两个构造函数两者结合一下(缺省参数);
    Date(int year=1, int month=1, int day=1) {
        _year = year;
        _month = month;
        _day = day;
    }

例2:class Stack {
private:
    int* a;
    int top;
    int capacity;

public:
    Stack() {
        a = nullptr;
        top = capacity = 0;
    }
   
    void push(int x) {
        if (top == capacity) {
            size_t newcapacity = capacity == 0 ? 4 : capacity * 2;
            int* tmp = (int*)realloc(a, sizeof(int) * newcapacity);
            if (tmp == nullptr) {
                perror("realloc fail");
                exit(-1);
            }
            if (tmp == a) {
                cout << capacity <<"本地扩容"<< endl;
            }
            else {
                cout << capacity << "异地扩容" << endl;
            }
            a = tmp;
            capacity = newcapacity;
        }
    
        a[top++] = x;
    }
    int Top() {
        return a[top - 1];
    }
    void Pop() {
        assert(top>0);
        top--;
    }
    void Destroy() {
        free(a);
        a = nullptr;
        top = capacity = 0;
    }

Stack s1(1000);
for (int n = 0;n < 1000;n++) {
    s1.push(n);
}在这种明确知道自己想要的空间的情况下,会不断扩容,本地扩容还好,异地扩容会非常的复杂,未了避免这种情况,我们可以写成以下这种代码:

Stack(size_t n=4) {
    if (n == 0) {
        a = nullptr;
        top = capacity = 0;
    }
    else {
        a = (int *)malloc(sizeof(int) * n);
        if (a == nullptr) {
            perror("realloc fail");
            exit(-1);
        }
        top =  0;
        capacity = n;
    }
}//当你知道自己要的空间大小,这个构造函数可以减少扩容

如果你不传入参数,他会自动调用,并且空间大小初始化为4

1,不写构造函数时,编译器会自动生成,如果写了,编译器就不会提供了
2,内置类型成员不会处理(有些编译器会处理为0)(声明部分可以给缺省值)
3,对于自定义类型的成员才会处理,会去调用这个成员的构造函数,一般情况都需要我们写构造函数,决定初始化数值

4,默认构造函数,只有一个。注意:无参构造函数,全缺省构造函数,自动生成的构造函数,都默认为构造函数
总结:但是如果成员变量都是自定义类型,可以不进行初始化

4,析构函数

析构函数:
1,在类名前加 ~
2,没有参数没有返回值
3,只有一个析构函数,若没有显示定义,会自动生成一个默认的析构函数,析构函数不能重载
,内置类型成员不会处理,对于自定义类型的成员才会处理
4,在对象销毁时,自动调用析构函数

    void Destroy() {
        free(a);
        a = nullptr;
        top = capacity = 0;
    }可以写成以下代码:
    
 
~Stack() {
        free(a);
        a = nullptr;
        top = capacity = 0;
    }
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DDD领域驱动模型设计

醍醐灌顶了朋友们 第一次写ddd还是 一路走来 丢失了东西 现在倒是也能找回来 只是有点可惜了 选择比努力更重要 独立功能 应用层&#xff1a;组织业务逻辑 领域&#xff1a;实体对象领域&#xff0c;业务核心 数据仓库&#xff1a; 不影响业务封装了数据操作&#xff0c;…

深入理解 Linux 文件系统与动静态库

目录 一、Linux 文件系统中的 inode 二、软硬链接 三、动静态库 在 Linux 系统中&#xff0c;文件系统和动静态库是非常重要的概念。本文将带大家深入了解这些内容&#xff0c;让你在技术之路上更进一步。 一、Linux 文件系统中的 inode 何为文件系统&#xff1f;对计算机中…

Fortinet的安全愿景SASO概述

FTNT SASE的独特方法&#xff0c;使其成为一家适应性极强的厂商&#xff0c;能够应对不断变化的网络和网络安全环境。FTNT开发了一种名为Secure Access Service Omni&#xff08;SASO&#xff09;的变体&#xff0c;以更准确地反映FTNT在融合网络和安全功能方面的实力。我们预计…

2024 VMware VCP一条龙通关-送题库

VMware VCP-DCV 2024&#xff08;2V0-21.23&#xff09;认证考试&#xff0c;2024年可高分通过。 1.5. An administrator has a host profile named Standard-Config. The administrator wants to change the other host profiles to use only the storage configuration setti…

电脑缺失opencl.dll怎么办,轻松解决opencl.dll的多种方法分享

当我们在操作电脑过程中遇到系统提示“由于找不到opencl.dll&#xff0c;无法继续执行代码”&#xff0c;这个错误会导致软件应用无法正常运行。OpenCL.dll作为一个与Open Computing Language&#xff08;开放计算语言&#xff09;相关的动态链接库文件&#xff0c;它在执行需要…

pytest教程-43-钩子函数-pytest_report_header

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_runtest_makereport钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_report_header钩子函数的使用方法。 pytest_report_header 钩子函数允许你在 pytest 的终端报告的头部添…

....comic科学....食用手册....

1.点击链接后&#xff0c;保存漫画至夸克网盘&#xff0c;若是新用户需要用手机注册. 2.在应用商店下载夸克APP. 3.登录APP下载已保存的漫画. 3.1 进入APP点击 夸克网盘 3.2 点击“转存的内容”后&#xff0c;长按 漫画文件夹&#xff0c;点击下载&#xff0c;下载速度400K左…

在Linux操作系统中扩建swap容量

在Linux操作系统上创建硬盘分区不仅可以储存数据&#xff0c;还可以使用创建的硬盘分区去扩展机器上swap分区的大小——去扩展交换工具的容量。 有些软件对于swap分区的大小是有要求的&#xff0c;swap分区的大小小于多少就安装不上软件。 要扩展swap容量要么重装系统&#x…

黑啤:浓郁与深邃的完善整合

啤酒的世界丰富多彩&#xff0c;而黑啤作为其中的一种与众不同风格&#xff0c;以其浓郁的口感和深邃的色泽备受瞩目。Fendi club黑啤作为精酿啤酒的代表&#xff0c;将浓郁与深邃完善整合&#xff0c;为消费者带来了与众不同的味蕾盛宴。 首先&#xff0c;Fendi club黑啤在原料…

Zabbix5.0——安装与部署

目录 一、zabbix-server(192.168.206.134) 监控方 1. 环境准备 2.安装zabbix 2.1 准备zabbix-repo 2.2清理缓存 2.3安装zabbix主包&#xff08;服务器和代理&#xff09; 2.4安装zabbix前端包 3. 数据库安装 3.1 授权zabbix账号 3.2导入数据库&#xff08;初始化zabbix&#x…

【多客开源】游戏陪玩系统,游戏陪玩源码,游戏陪玩语音社交源码运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

介绍 我们针对陪玩app源码市场的发展趋势&#xff0c;整合市面上主流陪玩app应用功能&#xff0c;自主开发了多客陪玩系统源码&#xff0c;并可为客户提供全部原生陪玩源码&#xff0c;进行二次开发&#xff0c;打造适用于线上游戏陪玩、语音聊天、心理咨询、情感陪伴等业务场…

SpringBoot之Zuul服务

概述 Spring Cloud Netflix zuul组件是微服务架构中的网关组件,Zuul作为统一网关,是所有访问该平台的请求入口,核心功能是路由和过滤。 目前公司业务就是基于Zuul搭建的网关服务,且提供的服务包括转发请求(路由)、黑名单IP访问拦截、URL资源访问时的权限拦截、统一访问日志记…

在windows下使用VS Code、CMake、Make进行代码编译

软件环境 Windows11VS CodeNoneCMake3.26.4-windows-x86_64MinGWNone 电脑系统配置 安装MinGW将MinGW安装文件夹中bin文件夹下的mingw32-make.exe复制并重命名为make.exe在文件夹中添加系统路径&#xff0c;具体位置为 系统->系统信息->高级系统设置->高级->环境…

马化腾用“不负众望”,来评价视为“全村希望”的视频号

我是王路飞。 2023年的视频号&#xff0c;给了腾讯足够的惊喜。 去年一年&#xff0c;视频号电商GMV实现近3倍增长&#xff08;约为1200亿&#xff5e;1500亿&#xff09;。2023年三季度&#xff0c;视频号总播放量同比增长超50%&#xff1b; 2023年视频号供给数量同比增长超…

【python】模拟巴特沃斯滤波器

巴特沃斯滤波器&#xff08;Butterworth Filter&#xff09;&#xff0c;以其设计者斯蒂芬巴特沃斯&#xff08;Stephen Butterworth&#xff09;的名字命名&#xff0c;是一种具有平滑频率响应的滤波器。这种滤波器在频域中具有非常平坦的无波纹响应&#xff0c;直到它达到截止…

一文了解CloudXR优势及应用原理

CloudXR是一种新颖而先进的技术&#xff0c;旨在将虚拟现实和增强现实体验从本地设备转移到云端&#xff0c;主要功能也包括了远程渲染、流媒体传输、低延迟、高带宽和高质量的音视频传输。CloudXR&#xff08;云化XR&#xff09;可以将高保真度的虚拟现实或增强现实场景实时传…

线程的常见方法

线程的常见方法 休眠&#xff1a; 让当前状态不再参与cpu的竞争&#xff0c;直到休眠结束&#xff1b; 结果&#xff1a;并不是完全交替进行的&#xff0c;因为只是休眠状态&#xff0c;也会存在争抢cpu 放弃&#xff1a; 让当前状态主动放弃时间片&#xff0c;下次再去争抢…

如何在PPT中插入网页?这样操作,免费还高效!

融合课、跨学科课&#xff0c;已经是近两年来教育界的热门词。 在公开课、微课比赛中&#xff0c;不添融合一些较为先进的信息技术&#xff0c;都不好意思拿出手了。 最近&#xff0c;由不坑老师开发制作的Office插件——不坑盒子&#xff0c;实现了在PPT中插入网页&#xff…

[性能优化] ScrollView视图优化为循环列表

问题描述&#xff1a; 原先商城的物品栏中的item 是load在一个scrollView 下&#xff0c;用于滑动查看。仅仅在父级panel下是使用了NGUI原生的scrollview 组件&#xff0c;随着商场物品列表中新物品的增多。panel下加载的实例也非常庞大。而大部分的实例用户也无法看到&#x…

es使用遇到的bug总结

本来版本7.4.0不行&#xff0c;最后换了个版本7.15.1就可以了&#xff0c;但又出现以下问题了&#xff1a; Beanpublic ElasticsearchClient elasticsearchClient() { // RestClient client RestClient.builder(new HttpHost("localhost", 9200,"http&q…
最新文章