C++day3(类、this指针、类中的特殊成员函数)

2023-11-07

一、Xmind整理:

二、上课笔记整理:

1.类的应用实例

#include <iostream>
using namespace std;

class Person
{
private:
    string name;
public:
    int age;
    int high;
    void set_name(string n);    //在类内声明函数
    void show()
    {
        cout << "name = "<< name << " age = "<<age << " high = "<<high << endl;
    }
};

int main()
{
    Person p1;       //实例化一个类对象p1
    p1.set_name("zhangsan");
    p1.age = 90;
    p1.high = 100;
    p1.show();

    return 0;
}

//类外实现
void Person::set_name(string n)
{
    name = n;
}

2.定义一个矩形类(Rectangle),包含私有成员长(length)、宽(width),定义成员函数:

设置长度: void set_len(int l);

设置宽度: void set_wid(int w);

获取长度: int get_len();

获取宽度: int get_wid();

显示周长和面积: void show();

#include <iostream>

using namespace std;

class Rectangle
{
private:
    int length;
    int width;
public:
    void set_len(int l);
    void set_wid(int w);
    int get_len();
    int get_wid();
    void show()
    {
        cout << "周长为:" << 2*(length+width) << endl;
        cout << "面积为:" << length*width << endl;
    }
};
void Rectangle:: set_len(int l)
{
    length = l;
}
void Rectangle:: set_wid(int w)
{
    width = w;
}
int Rectangle:: get_len()
{
    return length;
}
int Rectangle:: get_wid()
{
    return width;
}
int main()
{
    Rectangle c;
    c.set_len(3);
    c.set_wid(4);
    cout << "长为:" << c.get_len() << endl;
    cout << "宽为:" << c.get_wid() << endl;
    c.show();
    return 0;
}

3.必须使用this指针的场合

#include <iostream>
using namespace std;

class Rec
{
    int length;
    int width;
public:
    //所有函数的类内声明
    void set_len(int length);
    void set_wid(int width);
    int get_len();
    int get_wid();
    void show();
};

void Rec::set_len(int length)
{
    this->length = length;
}

void Rec::set_wid(int width)
{
    this->width = width;
}

int Rec::get_len()
{
    return length;
}

int Rec::get_wid()
{
    return width;
}

void Rec::show()
{
    cout << "周长" << 2*(length+width) << endl;
    cout << "面积" << length*width << endl;
}
int main()
{
    Rec r1;    //实例化了一个Rec类的类对象r1
    Rec r2;
    r2.set_len(20);

    r1.set_len(10);
    r1.set_wid(3);
    cout << "长:" << r1.get_len() << endl;
    cout << "宽:" << r1.get_wid() << endl;
    r1.show();
    return 0;
}

4.构造函数允许函数重载

#include <iostream>
using namespace std;

class Stu
{
    string name;
    int age;
public:
    //定义Stu类的无参构造
    Stu()
    {
        cout << "Stu的无参构造" << endl;
    }
    //函数重载
    Stu(string name,int age)
    {
        this->name = name;
        this->age = age;
        cout << "Stu的有参构造" << endl;
    }
    Stu(string name)
    {
        this->name = name;
        cout << "Stu的对name的有参构造" << endl;
    }
};

int main()
{     
    Stu s1("zhangsan",18);  //栈区的类对象
    Stu *p;  //在栈区申请一个Stu*类型的指针
    p = new Stu("lisi");    //在堆区申请一个Stu的空间,会调用构造函数
    return 0;
}

5.构造函数的初始化列表

//包含其他类的子对象
#include <iostream>
using namespace std;
class Per
{
    string name;
public:
    //Per提供的有参构造
    Per(string name)
    {
        this->name = name;
        cout << "Per的有参构造" << endl;
    }
    Per()
    {
        cout << "Per的无参构造" << endl;
    }
    //一个show函数,输出name
    void show()
    {
        cout << "Per中的name=" << name << endl;
    }
};

class Stu
{
    int score;
public:
    Per p1;    //Stu类中,包含另一个类的子对象,且另一个类只有有参构造函数
public:
    Stu(string name):p1(name)    //必须使用初始化列表,并且在初始化列表显性调用另一个类的构造函数
    {
        cout << "Stu的有参构造" << endl;
    }
    Stu()
    {
        cout << "Stu的无参构造" << endl;
    }
};

int main()
{
    Stu s1("zhangsan");
    //通过s1这个类对象,调用Per中的show函数
    s1.p1.show();

    Stu s2;
    return 0;
}

//同名或者是包含引用成员/const修饰的成员
class Stu
{
    string name;
    //int &age;     //类中有引用成员
    const int score;
public:
    //定义Stu类的无参构造
//    Stu()
//    {
//        cout << "Stu的无参构造" << endl;
//    }
    //函数重载,使用初始化列表的方式
    //初始化列表也可以解决形参和成员属性同名问题
    Stu(string name,int age):name(name),score(age)  //在函数体外给成员属性初始化
    {
        cout << "Stu的有参构造" << endl;
    }
    void show()
    {
        cout << name << " " << score << endl;
    }
};

int main()
{     
    Stu s1("zhangsan",18);  //栈区的类对象
    s1.show();
    Stu *p;  //在栈区申请一个Stu*类型的指针
    p = new Stu("lisi",20);    //在堆区申请一个Stu的空间,会调用构造函数
    return 0;
}

6.需要显性定义出析构函数的情况 

#include <iostream>
using namespace std;

class Stu
{
    int *p;
public:
    Stu():p(new int)    //在不传参的情况下,给指针成员p用堆区的空间初始化
    {
        cout << "Stu无参构造" << endl;
    }

    Stu(int a):p(new int(a))   //在参数为整形变量的情况下,让p指向堆区申请的空间
    //但是把这篇空间的内容,用传过来的整形变量初始化
    {
        cout << "Stu的有参构造" << endl;
    }

    Stu(int *p)   //要求传过来的指针的值,一定是指向堆区空间
    {
        this->p = p;
        cout << "Stu传指针的有参构造" << endl;
    }

    ~Stu()
    {
        //在析构之前释放堆区的空间
        cout << "准备释放空间:" << p << endl;
        delete p;
        p = nullptr;
        cout << "Stu的析构函数" << endl;
    }
};

int main()
{
    Stu s1(90);
    return 0;
}

7.拷贝构造函数

#include <iostream>
using namespace std;
class Stu
{
    string name;
public:
    Stu()
    {
        cout << "Stu的无参构造" << endl;
    }
    Stu(string name)
    {
        this->name = name;
        cout << "Stu的有参构造" << endl;
    }
    Stu(Stu &other)   //Stu的拷贝构造函数,和无参构造以及有参构造构成函数冲澡
    {
        this->name = other.name;
        cout << "Stu的拷贝构造函数" << endl;
    }

    void show()
    {
        cout << name << endl;
    }
};
Stu fun(Stu s1)  //定义了一个函数fun,形参是一个类对象
{
    cout << "调用成功" << endl;
    return s1;
}
int main()
{
    Stu s1("zhangsan");
    cout << "s1:";
    s1.show();
    Stu s2 = s1;   //拷贝构造函数
    cout << "s2:";
    s2.show();
    fun(s2);
    return 0;
}

 8.深浅拷贝问题

#include <iostream>
using namespace std;

class Stu
{
    int *p;
public:
    Stu():p(new int)    //在不传参的情况下,给指针成员p用堆区的空间初始化
    {
        cout << "Stu无参构造" << endl;
    }

    Stu(int a):p(new int(a))   //在参数为整形变量的情况下,让p指向堆区申请的空间
    //但是把这篇空间的内容,用传过来的整形变量初始化
    {
        cout << "Stu的有参构造" << endl;
    }
    Stu(int *p)   //要求传过来的指针的值,一定是指向堆区空间
    {
        this->p = p;
        cout << "Stu传指针的有参构造" << endl;
    }
    ~Stu()
    {
        //在析构之前释放堆区的空间
        cout << "准备释放空间:" << p << endl;
        delete p;
        p = nullptr;
        cout << "Stu的析构函数" << endl;
    }
    void show()
    {
        cout << "p=" << p << endl;
    }
    void set_p(int a)
    {
        *p = a;    //通过指针变量p,修改内存中的值
    }
    void show_p()
    {
        cout << *p << endl;  //通过指针变量,输出p指向的内存中的值
    }
    
    //拷贝构造函数
    Stu(Stu &other)
    {
        p = new int;  //手动让s2的指针p指向堆区的空间
        //实现深拷贝
        *p = *(other.p);
        cout << "Stu的拷贝构造函数" << endl;
    }
};
int main()
{
    Stu s1(90);    //会给s1的指针成员在堆区申请一片空间使用90初始化
    Stu s2 = s1;   //申请了一个Stu的类对象的空间,也实现了用s1的值初始化s2
    //左调右参
    //上面一行,调用了拷贝构造函数
    //使用了默认提供的拷贝构造,会造成指针成员,指向同一片空间的问题
//    cout << "s1:";
//    s1.show();
//    cout << "s2:";
//    s2.show();
    s1.show_p();
    s2.show_p();
    s1.set_p(101);
    s1.show_p();
    s2.show_p();

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++day3(类、this指针、类中的特殊成员函数) 的相关文章

  • 从 SQL 数据库获取日期时间

    我的数据库表中有一个 DateTime 记录 我编写一个查询从数据库中获取它 string command2 select Last Modified from Company Data where Company Name Descrip
  • 如何从当前 .NET 表单/应用程序发送密钥 F12

    我非常确定以下按钮激活的表单代码应该在我的 C 应用程序中引发 Control F12 SendKeys F12 但它似乎并没有继续进入 Windows shell 并激活另一个正在侦听它的程序 我的键盘可以用 看起来发送键在某处被拦截 并
  • LINQ to XML - 如何正确使用 XDocument

    现在我首先要说的是 这确实是一项任务 然而 在我遇到 Linq to XML 语法之前 我几乎已经完成了它 我有 2 个课程 曲目和 CD 现在作为作业的一部分 我创建了一张 CD 然后向其中添加了一些曲目 在搜索了大量完美解释了如何从 x
  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 使用 C# 使用应用程序密码登录 Office 365 SMTP

    在我们的 Office 365 公司帐户中实施两步身份验证之前 我的 C WPF 程序已成功进行身份验证并发送邮件 我使用了 SmtpClient 库 但现在我必须找到另一个解决方案 因为它不再起作用 我找不到任何使用 O365 应用程序密
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • 组合 Datepicker 和 Timepicker 值 Win 8.1

    我试图同时使用 Datepicker Timepicker 来返回可以存储在数据库中的 DateTime 例如 我想要安排会议的开始日期和结束日期 如果适用 我将如何将这些值组合成 SQL 数据库可以处理的正确格式 任何反馈都会很棒 我让这
  • 如何检测斑点并将其裁剪成 png 文件?

    我一直在开发一个网络应用程序 我陷入了一个有问题的问题 我会尝试解释我想要做什么 在这里您看到第一个大图像 其中有绿色形状 我想要做的是将这些形状裁剪成不同的 png 文件 并使它们的背景透明 就像大图像下面的示例裁剪图像一样 第一张图像将
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 标准 C 中的 sizeof 与 sizeof()? [复制]

    这个问题在这里已经有答案了 我看到一些直接使用 sizeof 的代码 想知道它是否是标准 C 令我惊讶的是 它运行得很好 这是一个例子 include
  • 为什么 C 函数不能返回数组类型?

    我是 C 语言新手 想知道 为什么 C 函数不能返回数组类型 我知道数组名是数组第一个值的地址 而数组是 C 中的二等公民 您自己已经回答了这个问题 数组是二等公民 C 按值返回 数组不能按值传递 因此不能返回它们 至于为什么数组不能按值传
  • 如何在 C++ 中使用 PI 常数

    我想在一些 C 程序中使用 PI 常数和三角函数 我得到三角函数include
  • OpenMP C 程序运行速度比顺序代码慢

    我是 OpenMP 的新手 正在尝试并行化 Jarvis 的算法 然而事实证明 与顺序代码相比 并行程序花费的时间要长 2 3 倍 难道问题本身就不能并行化吗 或者我并行化它的方式有问题 这是我针对该问题的 openMP 程序 其中有 2
  • 通过 MSBuild 调用 cl.exe 时无限期挂起

    我正在尝试在我的 主要是 C 项目上运行 MSBuild 想象一下一个非常庞大的代码库 Visual Studio 2015 是有问题的工具集 Windows 7 SP1 和 VS 2015 更新 2 即使使用 m 1 从而迫使它仅使用一个
  • 便携式终端

    有没有办法根据所使用的操作系统自动使用正确的 EOL 字符 我在想类似的事情std eol 我知道使用预处理器指令非常容易 但很好奇它是否已经可用 我感兴趣的是 我的应用程序中通常有一些消息 稍后我会将这些消息组合成一个字符串 并且我希望将
  • 改进C++逐行读取文件的能力?

    我正在解析大约 500GB 的日志文件 我的 C 版本需要 3 5 分钟 我的 Go 版本需要 1 2 分钟 我正在使用 C 的流来流式传输文件的每一行以进行解析 include
  • 从 C# 中的 .NET SecureString 读取单个字符?

    WPF 的PasswordBox 返回一个SecureString 它对窥探者隐藏密码 问题是你最终必须获得密码的值 而我在网上找到的建议都涉及将值复制到字符串中 这会让你回到窥探者的问题 IntPtr bstr Marshal Secur
  • 当我读取 500MB FileStream 时出现 OutOfMemoryException

    我使用 Filestream 读取大文件 gt 500 MB 但出现 OutOfMemoryException 任何有关它的解决方案 我的代码是 using var fs3 new FileStream filePath2 FileMode

随机推荐

  • ubuntu20.04安装和卸载gtsam

    安装boost Boost gt 1 43 Ubuntu sudo apt get install libboost all dev 安装cmake CMake gt 3 0 Ubuntu sudo apt get install cmak
  • 2023第十四届蓝桥杯c++ b组省赛真题

    1 冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X 这个炉子有一个称作转换率的属性 V V 是一个正整数 这意味着消耗 V 个普通金 属 O 恰好可以冶炼出一个特殊金属 X 当普通金属 O 的数目不足
  • 十进制与任意进制互转

    n进制转十进制 static int transfer char chars int n int result 0 int index chars length 1 while index gt 0 result chars index 0
  • Linux centos redhat 装NVIDIA显卡驱动

    Linux装显卡驱动 第一步 下载驱动 对应相同型号 下载即可 英伟达驱动下载地址https www nvidia cn Download index aspx lang cn 以 K620为例 如下图 2 下载完成后需要上传至服务器 以U
  • 企业引入人脸识别考勤 想要代打卡?没门!

    近年来 伴随着生物识别技术的进步 越来越多的生物识别技术应用进入市场 冲击各大行业 传统的考勤模式同样面临着来自新兴技术的挑战 以人脸识别技术为首 掀起一场考勤领域的变革 刷脸 考勤 想要代签不容易 传统的 最为人所熟知的考勤模式莫过于磁卡
  • CH11-多媒体应用开发

    目标 掌握MediaPlayer类与SoundPool类的使用 能够实现播放音频文件的功能 掌握VideoView类的使用 能够实现播放视频文件的功能 掌握MediaPlayer类与SurfaceView类的使用 能够实现播放视频文件的功能
  • 一次性解决tensorflow-gpu:library:cusolver64_10.dll/ cudart64_101.dll/cublas64_10.dll not found等

    错误 Could not load dynamic library cudart64 101 dll Could not load dynamic library cublas64 10 dll Could not load dynamic
  • 高速入门知识02:降低串扰和维持信号完整性的布线方法

    文章目录 前言 一 单端走线布线 1 1 带有短截线的菊花链布线 1 2 没有短截线的菊花链布线 1 3 星型布线 1 4 蛇型布线 二 差分走线布线 前言 串扰是并行走线间不需要的信号耦合 微带线和带状线正确的布线和叠层布局能够降低串扰
  • 剑指 Offer 55 - II. 平衡二叉树-- 心得和思路

    Definition for a binary tree node public class TreeNode int val TreeNode left TreeNode right TreeNode int x val x class
  • 0基础学习大数据之大数据技术发展趋势如何

    大数据如今飞速发展 已经逐步开始影响到我们生活的各个角落 同时涌现出了大量新的技术 它们成为大数据采集 存储 处理和呈现的有力武器 那么大数据技术的发展趋势会是怎样的呢 2014年以后 整体大数据的技术栈已经趋于稳定 由于云计算 人工智能等
  • ufs 固态硬盘_UFS究竟是什么?对于手机提升大不大,一文带你了解

    相信很多小伙伴在2020年挑选5G新手机的时候都会看到 UFS 3 0 那这个名称与USB很类似的配置究竟是什么呢 后面的数字是越大越好 还是越小越好 现在就来科普科普 首先UFS闪存的全称Universal Flash Storage 这
  • 朴素贝叶斯(基于sklearn的实现)

    由于自己太懒 不想看太长的代码 所以我就调用的sklearn库的朴素贝叶斯类 数据集选择的是这个博客中自己构造的数据集 该博客自己实现了朴素贝叶斯类 想自己编写一个朴素贝叶斯函数的读者可以参考这个博客 下面是用sklearn库实现朴素贝叶斯
  • verilog_串口实现

    verilog 串口实现 概述 先了解串口的基础知识 串口是怎样传数据的 什么是波特率 波特率怎么计算 说明 通过Verilog编写串口 通过逻辑分析仪与串口模块的对接来进一步了解串口的应用 文章目录 1 什么是波特率 波特率怎么计算 1
  • 2020秋招总结(持续更新)

    开立医疗提前批面试 1 项目讲解 没做准备 讲的不流畅 思路混乱 2 进程拥有的资源 进程地址空间 代码区 数据区 堆栈 内核部分 3 线程的理解 内核级线程 用户级线程 进程与线程的区别 4 线程间通信方式 与进程间通信方式混淆了 线程是
  • 聊聊rocketmq的KVConfigManager

    序 本文主要研究一下rocketmq的KVConfigManager KVConfigManager org apache rocketmq namesrv kvconfig KVConfigManager java public clas
  • win11下配置visual studio 2022+PCL1.13.0

    第一部分 visual studio2022 安装 vs官网网址如下 https visualstudio microsoft com zh hans vs 第一步 我们打开官网链接 按如下操作点击下载免费版本的exe文件 第二步 打开下载
  • 牛客网错题整理(C/C++基础知识回顾)(1)

    1 如下代码输出结果是什么 生存周期问题 include
  • 算法与数据结构-堆

    前言 大四重拾算法与数据结构 所有内容为自己的阶段小结所以并不是技术性文章 如有兴趣阅读 遇到问题不妨给我留个言 万分感谢 堆 堆是一颗完全二叉树 最大堆 根结点的键值是所有堆结点键值中最大者 且每个结点的值都比其孩子的值大 最小堆 根结点
  • Python——ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)

    报错截图 在使用已经编译好的python3的cv bridge时 并且正常在 bashrc中加入了source 但是依然报以上错误 解决方法 在 bashrc指定你编译并使用的cv bridge的python的环境变量 添加conda的py
  • C++day3(类、this指针、类中的特殊成员函数)

    一 Xmind整理 二 上课笔记整理 1 类的应用实例 include