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

news2025/2/22 10:22:55

#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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx环境安装

一、官网地址 Nginx官网&#xff1a;http://nginx.org/ Nginx中文网&#xff1a;https://nginx.p2hp.com/ 二、Nginx版本 mainline version 开发版本stableversion 稳定版本legacy version 历史版本 三、Windows系统安装Nginx 第一步&#xff1a;选择Windows版本&#xff0c;…

Spring AI + Ollama 实现调用DeepSeek-R1模型API

一、前言 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型&#xff0c;凭借其强大的自然语言处理能力和丰富的知识储备&#xff0c;迅速成为业界关注的焦点。无论是文本生…

android系统SystemServer进程启动流程分析

目录 一,SystemServer整体框架 二,SystemServer启动源码分析 2.1,重要的概念 2.2,启动入口 2.3,创建对应进程的binder 三,binder驱动和binder线程池 四,SystemServer真正启动方法 4.1 SystemServer main方法里面主要做了几件事情 1)创建SystemServiceManager管理所有的…

Oracle 深入理解Lock和Latch ,解析访问数据块全流程

Oracle 锁机制介绍 根据保护对象的不同&#xff0c;单实例Oracle数据库锁可以分为以下几大类&#xff1a; DML lock&#xff08;data locks&#xff0c;数据锁&#xff09;&#xff1a;用于保护数据的完整性&#xff1b; DDL lock&#xff08;dictionary locks&#xff0c;字典…

如何基于transformers库通过训练Qwen/DeepSeek模型的传统分类能力实现文本分类任务

文章目录 模型与环境准备文档分析源码解读模型训练及推理方式进阶:CPU与显存的切换进阶:多卡数据并行训练🔑 DDP 训练过程核心步骤🚫 DDP 不适用于模型并行⚖️ DDP vs. Model Parallelism⚙️ 解决大模型训练的推荐方法🎉进入大模型应用与实战专栏 | 🚀查看更多专栏…

Unity中一个节点实现植物动态(Shader)

1 . 核心思路就操作顶点作往复运动&#xff1b; 核心代码&#xff1a; half stage1 dot(positionOS, float3(0, 1, 0)) * _Strength; half stage2 sin(dot(positionOS, float3(1, 0, 0)) * _Strength _Time.y * _Speed); half stage3 stage1 * stage2 * float3(0.001,…

PrimeTime:工具简介

相关阅读 PrimeTimehttps://blog.csdn.net/weixin_45791458/category_12900271.html?spm1001.2014.3001.5482 PrimeTime是PrimeTime Suite中的一个工具&#xff0c;能够执行全芯片级、门级的静态时序分析&#xff0c;这是芯片设计和分析流程中的一个关键部分。该工具通过检查…

【拜读】Tensor Product Attention Is All You Need姚期智团队开源兼容RoPE位置编码

姚期智团队开源新型注意力&#xff1a;张量积注意力&#xff08;Tensor Product Attention&#xff0c;TPA&#xff09;。有点像一种「动态的LoRA」&#xff0c;核心思路在于利用张量分解来压缩注意力机制中的 Q、K、V 表示&#xff0c;同时保留上下文信息&#xff0c;减少内存…

Docker-技术架构演进之路

目录 一、概述 常见概念 二、架构演进 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 三、尾声 一、概述 在进行技术学习过程中&am…

用Chrome Recorder轻松完成自动化测试脚本录制

前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…

python中的异常-模块-包

文章目录 异常异常的定义异常捕获语法捕获常规异常捕获指定异常捕获多个异常捕获所有异常异常else异常finally 异常传递总结 模块概念导入自定义模块及导入main方法all变量 总结 包自定义包定义pycharm中建包的基本步骤导入方式 第三方包 异常 异常的定义 当检测到一个错误时…

【GPU驱动】OpenGLES图形管线渲染机制

OpenGLES图形管线渲染机制 OpenGL/ES 的渲染管线也是一个典型的图形流水线&#xff08;Graphics Pipeline&#xff09;&#xff0c;包括多个阶段&#xff0c;每个阶段都负责对图形数据进行处理。管线的核心目标是将图形数据转换为最终的图像&#xff0c;这些图像可以显示在屏幕…

ssm-day06 ssm整合

从springMVC总结再回顾一下 60节 整合就是应用框架&#xff0c;并且把这个框架放到IOC容器中 web容器&#xff1a;装springMVC和controller相关的web组件 root容器&#xff1a;装业务和持久层相关的组件 子容器可以引用父容器中的组件&#xff0c;父容器不能调子容器 一个容器…

AI 编程助手 cursor的系统提示词 prompt

# Role 你是一名极其优秀具有10年经验的产品经理和精通java编程语言的架构师。与你交流的用户是不懂代码的初中生&#xff0c;不善于表达产品和代码需求。你的工作对用户来说非常重要&#xff0c;完成后将获得10000美元奖励。 # Goal 你的目标是帮助用户以他容易理解的…

ollama如何安全卸载,解决Ollama unins000.msg is missing

春节后在本地电脑安装了Ollama的客户端&#xff0c;每次开机自启&#xff0c;影响开机速度&#xff0c;而且本地的模型不如联网的回答效果好&#xff0c;果断选择了卸载&#xff0c;但是今天卸载发现提示下方的错误。根据此文章可以解决当前的问题。 根据此文章可以解决当前的…

网络安全设备防护原理 网络安全防护装置

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 防火墙 简介 网络层的防护设备&#xff0c;依照特殊的规则允许或者限制传输的数据通过 是由软件和硬件设备组合而成&#xff0c;在内部网和外部网之间、专用网…

Python的那些事第二十八篇:数据分析与操作的利器Pandas

Pandas:数据分析与操作的利器 摘要 Pandas是基于Python的开源数据分析库,广泛应用于数据科学、机器学习和商业智能等领域。它提供了高效的数据结构和丰富的分析工具,能够处理结构化数据、时间序列数据以及复杂的数据转换任务。本文从Pandas的基础概念入手,深入探讨其核心…

学习threejs,使用MeshBasicMaterial基本网格材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshBasicMaterial 二…

【git-hub项目:YOLOs-CPP】本地实现05:项目移植

ok&#xff0c;经过前3个博客&#xff0c;我们实现了项目的跑通。 但是&#xff0c;通常情况下&#xff0c;我们的项目都是需要在其他电脑上也跑通&#xff0c;才对。 然而&#xff0c;经过测试&#xff0c;目前出现了2 个bug。 项目一键下载【⬇️⬇️⬇️】&#xff1a; 精…

【python】协程(coroutine)

协程&#xff08;coroutine&#xff09;可以理解为一个可以中途暂停保存当前执行状态信息并可以从此处恢复执行的函数&#xff0c;多个协程共用一个线程执行&#xff0c;适合执行需要“等待”的任务。 所以严格意义上&#xff0c;多个协程同一时刻也只有一个在真正的执行&#…