当前位置: 首页 > news >正文

C++:类与对象,定义类和构造函数

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

//如何让定义一个类
// 封装
// 1、将数据和方法定义到一起。
// 2、把想给你看的数据给你看,不想给你看的封装起来。  通过访问限定符来实现
class Stack
{
public:
    //1.成员函数
    void Push(int x);
    //void Push(int x)
    //{
    //    //...函数体 
    //}//这种是在类里面定义
    void Pop();//这里是类的申明,类外面定义
    bool Empty();
    //....
private:
    //2.成员变量
    int _a;
    int _size;
    int _capacity;//这里是声明
};

//在类外面定义成员函数
void Stack::Push(int x)
{
    //...
}

// 1、C语言中,struct是用来定义结构体的
// 2、C++中,兼容C的struct定义结构体的用法。但是同时struct也可以用来定义类
// 3、C++中使用class和struct定义类的区别? -》默认的访问限定符

//C
struct ListNode_C
{
    int* _val;
    struct ListNode_C* _next;
    struct ListNode_C* _prev;
};

//C++
struct ListNode_CPP//默认共有
//class ListNode_CPP//默认私有
{
    int* _val;
    //ListNode_CPP* _next;//这个地方不需要加struct
    struct ListNode_CPP* _next;//这个地方也可以这样用,C++兼容C

    ListNode_CPP* _prev;//这是C++当成类的用法

    //还可以定义成员函数
    ListNode_CPP* Create(int val);
};

// 1、声明和定义的区别? 声明是一种承诺,承诺要干嘛,但是还没做,定义就是把这个事落地了

//类中既有成员变量,又有成员函数
class A1
{
public:
    void f1()
    {
    }
private:
    int _a;
    char _ch;
};

//类中仅有成员函数
class A2
{
public:
    void f2()
    {
    }

};

//类中既没有成员函数,也没有成员变量
class A3
{

};
int main()
{
    //类实例化出对象,相当于定义出了类的成员变量
    Stack s1;
    Stack s2;
    Stack s3;

    //s1._a = nullptr;//私有的,不能访问
    s1.Push(1);

    //对象中只存储成员变量,不存储成员函数?为什么?
    cout << sizeof(s1) << endl;
    // 因为一个类实例化出N个对象,每个对象的成员变量都可以存储不同的值,但是调用的函数确是同一个
    // 如果每个对象都放成员函数,而这些成员函数却是一样的,会浪费空间


    // 如何计算一个类实例化出的对象的大小,计算成员变量之和,并且考虑内存对齐规则
    // 没有成员变量的类的大小是1,面试题:为什么是1,而不是0。开1个字节不是为了存数据,而是占位
    cout << sizeof(A1) << endl;
    cout << sizeof(A2) << endl;
    cout << sizeof(A3) << endl;

    return 0;
}


实例化 -》就是用自己定义的类型定义出对象
 1、内置类型,基本类型 int/char/double
 2、自定义类型,class/struct

class Date
{
    // this是谁调用这个成员函数,this就指向谁
public:
    void Init(int year, int month, int day)//void Init(Date* this, int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    void Print()//void Print(Date* this)
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    Date d1;
    d1.Init(2025, 2, 20); //(&d1,2025,2,20);
    d1.Print();           //(&d1);
    return 0;
}


this指针存在哪里? (也就是存在进程地址空间的哪个区域?)
答:栈上的,因为它是一个形参。(ps:vs下是在ecx这个寄存器,来传递)

 1、下面程序能编译通过吗?
 2、下面程序会崩溃吗?在哪里崩溃?
class A
{
public:
    void PrintA()
    {
        cout << _a << endl;
        //cout << this->_a << endl;//会对空指针this进行解引用,会导致程序崩溃
    }

    void Show()
    {
        cout << "Show()" << endl;
    }
private:
    int _a;
};
int main()
{
    A* p = nullptr; //因为p->PrintA();用的是指针,所以p->Print(p)传的也是指针p
    p->PrintA();  //崩溃
    p->Show();    //正常运行
    //成员函数存在公共的代码段,所有p->Show()这里不会去p指向的对象上找
    //访问成员函数,才会去找

    A a;
    a.PrintA();//p->Print(&a);这个地方a是对象,所以传的是&a,反正传的都是对象的地址
    return 0;
}


构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任
务并不是开空间创建对象,而是初始化对象。
1. 函数名与类名相同。
2. 无返回值。
3. 对象实例化时编译器自动调用对应的构造函数。
4. 构造函数可以重载。

class Date
{
public:
    //构造函数-》在对象构造时调用的函数,这个函数完成初始化工作
    Date(int year, int month, int day)//构造函数没有返回值
    {
        _year = year;
        _month = month;
        _day = day;
    }

    Date()//函数重载
    {
        _year = 0;
        _month = 1;
        _day = 1;
    }

    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    //对象实例化时自动调用
    Date d1(2025, 2, 20);
    d1.Print();

    Date d2;//Date d2();不能加括号,调无参的不需要加括号,否则编译器不认识
    d2.Print();
    return 0;
}

5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦
用户显式定义编译器将不再生成。
class Time
{
public:
    Time()
    {
        cout << "Time()" << endl;
        _hour = 0;
        _minute = 0;
        _second = 0;
    }
private:
    int _hour;
    int _minute;
    int _second;
};

class Date
{
public:
    // 如果用户显式定义了构造函数,编译器将不再生成
    // 我们没有显式定义的构造函数,这里编译器生成无参默认的构造函数(语法双标)
    // 1、针对内置类型的成员变量没有做处理
    // 2、针对自定义类型的成员变量,调用它的构造函数初始化
    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
  基本类型(内置类型)
    int _year;
    int _month;
    int _day;
  自定义类型
    Time _t;
};

int main()
{
    Date d1;//调用编译器生成的构造函数
    d1.Print();
    return 0;
}


7. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。
注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。
class Date
{
public:
    //更好的方式:全缺省
    Date(int year = 0, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    //不能和全缺省同时出现,因为调用的时候会出现歧义,Date d1;
    //Date()//函数重载
    //{
    //    _year = 0;
    //    _month = 1;
    //    _day = 1;
    //}

    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    Date d1;//调用默认构造函数 -》1、自己实现无参的构造函数  2、自己实现的全缺省构造函数 
                              //3、编译器自动实现的构造函数 Date d1;的特点是不用传参数 
    d1.Print();
    Date d1(2025, 3, 20);
    d1.Print();
    return 0;
}


class Date
{
public:
    更好的方式:全缺省
    Date(int year = 0, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }

    不能和全缺省同时出现,因为调用的时候会出现歧义,Date d1;
    Date()//函数重载
    {
        _year = 0;
        _month = 1;
        _day = 1;
    }

    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    Date d1;
    Date d2;
    return 0;
}

相关文章:

C++:类与对象,定义类和构造函数

#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; //如何让定义一个类 // 封装 // 1、将数据和方法定义到一起。 // 2、把想给你看的数据给你看&#xff0c;不想给你看的封装起来。 通过访问限定符来实现 class Stack { public: //1.成…...

【Java消息队列】应对消息丢失、重复、顺序与积压的全面策略

应对消息丢失、重复、顺序与积压的全面策略 引言kafka消息丢失生产者消费者重复消费顺序消费消息积压生产者消费者其他RabbitMQ消息丢失生产者事务机制,保证生产者发送消息到 RabbitMQ Server发送方确认机制,保证消息能从交换机路由到指定队列保证消息在 RabbitMQ Server 中的…...

解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”

一、神经网络&#xff1a;AI 领域的 “超级引擎” 在机器学习的庞大算法体系中&#xff0c;有十种算法被广泛认为是最具代表性和实用性的&#xff0c;它们犹如机器学习领域的 “十大神器”&#xff0c;各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森…...

Android14(13)添加墨水屏手写API

软件平台&#xff1a;Android14 硬件平台&#xff1a;QCS6115 需求&#xff1a;特殊品类的产品墨水屏实现手写的功能&#xff0c;本来Android自带的Input这一套可以实现实时展示笔迹&#xff0c;但是由于墨水屏特性&#xff0c;达不到正常的彩屏刷新的帧率&#xff0c;因此使用…...

flyway的ignoreMigrationPatterns

1、概述 ignoreMigrationPatterns 是 Flyway 中的一个配置选项&#xff0c;用于指定在迁移过程中可以忽略的迁移脚本的模式。这个选项通常用于在特定情况下跳过某些迁移脚本的执行&#xff0c;例如在开发环境中跳过某些测试数据脚本&#xff0c;或者在特定条件下忽略某些已经不…...

25年2月通信基础知识补充:多普勒频移与多普勒扩展、3GPP TDL信道模型

看文献过程中不断发现有太多不懂的基础知识&#xff0c;故长期更新这类blog不断补充在这过程中学到的知识。由于这些内容与我的研究方向并不一定强相关&#xff0c;故记录不会很深入请见谅。 【通信基础知识补充7】25年2月通信基础知识补充1 一、多普勒频移与多普勒扩展傻傻分不…...

华为动态路由-OSPF-骨干区

华为动态路由-OSPF-骨干区 一、OSPF简介 1、OSPF概述 OSPF是一种开放式的、基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在自治系统内部进行路由选择和通信。 OSPF是互联网工程任务组&#xff08;IETF&#xff09;定义的标准之一&#xff0c;被广…...

接口测试-API测试中常用的协议(中)

一、SOAP SOAP&#xff08;Simple Object Access Protocol&#xff09;即简单对象访问协议&#xff0c;是一种基于 XML 的用于在网络中交换结构化信息的协议&#xff0c;常用于 Web 服务之间的通信。以下为你详细介绍&#xff1a; 产生背景 在互联网发展过程中&#xff0c;需…...

植物大战僵尸杂交版v3.2.1最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.2.1版本&#xff01;&#xff01;&#xff01;&#xff0c;有b站账户的记得要给作者三连关注一下呀&#xff01; 不多废话下载链接放上&#xff1a; 夸克网盘链接&#xff1a;&#xff1a;https://pan.quark.cn/s/e5…...

java每日精进 2.20 MQ相关复健

在 RabbitMQ 中&#xff0c;消息消费者对消息的签收&#xff08;acknowledgment&#xff09;可以通过三种方式进行管理&#xff1a;自动签收、手动签收 和 拒绝签收。它们主要控制消费者如何处理消息确认和消息的重新排队。下面详细讲解它们的区别&#xff0c;并通过代码示例展…...

【设计模式精讲】结构型模式之代理模式(静态代理、JDK动态代理、cglib动态代理)

文章目录 第五章 结构型模式5.1 代理模式5.1.1 代理模式介绍5.1.2 代理模式原理5.1.3 静态代理实现5.1.4 JDK动态代理5.1.4.1 JDK动态代理实现5.1.4.2 类是如何动态生成的5.1.4.3 代理类的调用过程 5.1.5 cglib动态代理5.1.5.1 cglib动态代理实现5.1.5.2 cglib代理流程 5.1.6 代…...

京东广告基于 Apache Doris 的冷热数据分层实践

一、背景介绍 京东广告围绕Apache Doris建设广告数据存储服务&#xff0c;为广告主提供实时广告效果报表和多维数据分析服务。历经多年发展&#xff0c;积累了海量的广告数据&#xff0c;目前系统总数据容量接近1PB&#xff0c;数据行数达到18万亿行&#xff0c;日查询请求量8…...

win11 安装pyenv来管理python

1、使用power shell或者cmd来安装&#xff1a; 2、使用pyenv 发现并没有pyenv。 3、在环境变量中增加&#xff1a; 路径&#xff1a;右键--此电脑--属性--高级系统设置--环境变量--Path--增加刚才--target所在的目录D:\tools\pyenv\pyenv-win\bin。 先退出当前的&#xff0c;…...

【AI】GitHub Copilot

GitHub Copilot 是一款由 GitHub 和 OpenAI 合作开发的 AI 编程助手&#xff0c;它可以在多种开发工具中使用。以下是 GitHub Copilot 支持的主要开发工具和平台&#xff1a; 1. Visual Studio Code (VS Code) 官方支持&#xff1a;GitHub Copilot 在 VS Code 中拥有最完整的集…...

【LeetCode 热题100】76. 最小覆盖子串的算法思路及python代码

76. 最小覆盖子串 给你一个字符串 s s s、一个字符串 t t t。返回 s s s 中涵盖 t t t 所有字符的最小子串。如果 s s s 中不存在涵盖 t t t 所有字符的子串&#xff0c;则返回空字符串 ‘ ‘ " \quad" ‘‘" 。 注意&#xff1a; 对于 t t t 中重复…...

力扣-回溯-17 电话号码的字母组合

思路 和之前的回溯不同的是&#xff0c;要遍历完所有的数字&#xff0c;并且在单层递归逻辑里需要遍历一整个字符串 代码 class Solution { public:vector<string> letters {"", "", "abc", "def", "ghi", "…...

[AHOI2018初中组] 分组---贪心算法

贪心没套路果真如此。 题目描述 小可可的学校信息组总共有 n 个队员&#xff0c;每个人都有一个实力值 ai​。现在&#xff0c;一年一度的编程大赛就要到了&#xff0c;小可可的学校获得了若干个参赛名额&#xff0c;教练决定把学校信息组的 n 个队员分成若干个小组去参加这场…...

知识图谱-学习计划

✨知识图谱知识学习&#xff0c;给我点赞&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f;什么是知识图谱&#xff1f; 知识图谱是一种通过图结构表示知识的技术&#xff0c;它可以帮助我们更清晰地理解和组织信息。无论是学习、工作还是生活&#xff0c;知…...

网安作业3

标准版 接口ip配置 r2 [r2]interface GigabitEthernet 0/0/0 [r2-GigabitEthernet0/0/0]ip address 13.0.0.3 24 [r2-GigabitEthernet0/0/0]interface GigabitEthernet 0/0/1 [r2-GigabitEthernet0/0/1]ip address 100.1.1.254 24 [r2-GigabitEthernet0/0/1]interface Gigab…...

快速提升网站收录:内容创作的艺术

快速提升网站收录&#xff0c;内容创作是关键。以下是一些关于内容创作以提升网站收录的艺术性建议&#xff1a; 一、关键词研究与优化 选择长尾关键词&#xff1a;进行深入的关键词研究&#xff0c;选择既符合网站主题又具有一定搜索量的长尾关键词。这些关键词通常更具体&a…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...